Mercurial > libavcodec.hg
annotate truespeech.c @ 3198:6b9f0c4fbdbe libavcodec
First part of a series of speed-enchancing patches.
This one sets up a snow.h and makes snow use the dsputil function pointer
framework to access the three functions that will be implemented in asm
in the other parts of the patchset.
Patch by Robert Edele < yartrebo AH earthlink POIS net>
Original thread:
Subject: [Ffmpeg-devel] [PATCH] Snow mmx+sse2 asm optimizations
Date: Sun, 05 Feb 2006 12:47:14 -0500
author | gpoirier |
---|---|
date | Thu, 16 Mar 2006 19:18:18 +0000 |
parents | c892b3b6bfbf |
children | 82277c821113 |
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 * |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
5 * This library is free software; you can redistribute it and/or |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
6 * modify it under the terms of the GNU Lesser General Public |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
7 * License as published by the Free Software Foundation; either |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
8 * version 2 of the License, or (at your option) any later version. |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
9 * |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
10 * This library is distributed in the hope that it will be useful, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
13 * Lesser General Public License for more details. |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
14 * |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
15 * You should have received a copy of the GNU Lesser General Public |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
16 * License along with this library; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
3006
diff
changeset
|
17 * 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
|
18 */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
19 #include "avcodec.h" |
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 "truespeech_data.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 * @file truespeech.c |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
24 * TrueSpeech decoder. |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
25 */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
26 |
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 * TrueSpeech decoder context |
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 typedef struct { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
31 /* input data */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
32 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
|
33 int offset1[2]; //< 8-bit value, used in one copying offset |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
34 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
|
35 int pulseoff[4]; //< 4-bit offset of pulse values block |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
36 int pulsepos[4]; //< 27-bit variable, encodes 7 pulse positions |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
37 int pulseval[4]; //< 7x2-bit pulse values |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
38 int flag; //< 1-bit flag, shows how to choose filters |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
39 /* temporary data */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
40 int filtbuf[146]; // some big vector used for storing filters |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
41 int prevfilt[8]; // filter from previous frame |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
42 int16_t tmp1[8]; // coefficients for adding to out |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
43 int16_t tmp2[8]; // coefficients for adding to out |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
44 int16_t tmp3[8]; // coefficients for adding to out |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
45 int16_t cvector[8]; // correlated input vector |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
46 int filtval; // gain value for one function |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
47 int16_t newvec[60]; // tmp vector |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
48 int16_t filters[32]; // filters for every subframe |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
49 } TSContext; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
50 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
51 static int truespeech_decode_init(AVCodecContext * avctx) |
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 // TSContext *c = avctx->priv_data; |
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 return 0; |
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 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
58 static void truespeech_read_frame(TSContext *dec, uint8_t *input) |
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 uint32_t t; |
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 /* first dword */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
63 t = LE_32(input); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
64 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
65 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
66 dec->flag = t & 1; |
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->vector[0] = ts_codebook[0][(t >> 1) & 0x1F]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
69 dec->vector[1] = ts_codebook[1][(t >> 6) & 0x1F]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
70 dec->vector[2] = ts_codebook[2][(t >> 11) & 0xF]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
71 dec->vector[3] = ts_codebook[3][(t >> 15) & 0xF]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
72 dec->vector[4] = ts_codebook[4][(t >> 19) & 0xF]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
73 dec->vector[5] = ts_codebook[5][(t >> 23) & 0x7]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
74 dec->vector[6] = ts_codebook[6][(t >> 26) & 0x7]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
75 dec->vector[7] = ts_codebook[7][(t >> 29) & 0x7]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
76 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
77 /* second dword */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
78 t = LE_32(input); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
79 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
80 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
81 dec->offset2[0] = (t >> 0) & 0x7F; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
82 dec->offset2[1] = (t >> 7) & 0x7F; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
83 dec->offset2[2] = (t >> 14) & 0x7F; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
84 dec->offset2[3] = (t >> 21) & 0x7F; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
85 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
86 dec->offset1[0] = ((t >> 28) & 0xF) << 4; |
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 /* third dword */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
89 t = LE_32(input); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
90 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
91 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
92 dec->pulseval[0] = (t >> 0) & 0x3FFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
93 dec->pulseval[1] = (t >> 14) & 0x3FFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
94 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
95 dec->offset1[1] = (t >> 28) & 0x0F; |
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 /* fourth dword */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
98 t = LE_32(input); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
99 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
100 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
101 dec->pulseval[2] = (t >> 0) & 0x3FFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
102 dec->pulseval[3] = (t >> 14) & 0x3FFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
103 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
104 dec->offset1[1] |= ((t >> 28) & 0x0F) << 4; |
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 /* fifth dword */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
107 t = LE_32(input); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
108 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
109 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
110 dec->pulsepos[0] = (t >> 4) & 0x7FFFFFF; |
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->pulseoff[0] = (t >> 0) & 0xF; |
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->offset1[0] |= (t >> 31) & 1; |
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 /* sixth dword */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
117 t = LE_32(input); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
118 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
119 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
120 dec->pulsepos[1] = (t >> 4) & 0x7FFFFFF; |
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->pulseoff[1] = (t >> 0) & 0xF; |
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->offset1[0] |= ((t >> 31) & 1) << 1; |
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 /* seventh dword */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
127 t = LE_32(input); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
128 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
129 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
130 dec->pulsepos[2] = (t >> 4) & 0x7FFFFFF; |
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->pulseoff[2] = (t >> 0) & 0xF; |
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->offset1[0] |= ((t >> 31) & 1) << 2; |
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 /* eighth dword */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
137 t = LE_32(input); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
138 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
139 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
140 dec->pulsepos[3] = (t >> 4) & 0x7FFFFFF; |
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->pulseoff[3] = (t >> 0) & 0xF; |
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->offset1[0] |= ((t >> 31) & 1) << 3; |
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 } |
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 static void truespeech_correlate_filter(TSContext *dec) |
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 int16_t tmp[8]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
151 int i, j; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
152 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
153 for(i = 0; i < 8; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
154 if(i > 0){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
155 memcpy(tmp, dec->cvector, i * 2); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
156 for(j = 0; j < i; j++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
157 dec->cvector[j] = ((tmp[i - j - 1] * dec->vector[i]) + |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
158 (dec->cvector[j] << 15) + 0x4000) >> 15; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
159 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
160 dec->cvector[i] = (8 - dec->vector[i]) >> 3; |
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 for(i = 0; i < 8; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
163 dec->cvector[i] = (dec->cvector[i] * ts_230[i]) >> 15; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
164 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
165 dec->filtval = dec->vector[0]; |
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 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
168 static void truespeech_filters_merge(TSContext *dec) |
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 int i; |
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 if(!dec->flag){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
173 for(i = 0; i < 8; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
174 dec->filters[i + 0] = dec->prevfilt[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
175 dec->filters[i + 8] = dec->prevfilt[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
176 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
177 }else{ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
178 for(i = 0; i < 8; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
179 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
|
180 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
|
181 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
182 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
183 for(i = 0; i < 8; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
184 dec->filters[i + 16] = dec->cvector[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
185 dec->filters[i + 24] = dec->cvector[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
186 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
187 } |
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 static void truespeech_apply_twopoint_filter(TSContext *dec, int quart) |
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 int16_t tmp[146 + 60], *ptr0, *ptr1, *filter; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
192 int i, t, off; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
193 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
194 t = dec->offset2[quart]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
195 if(t == 127){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
196 memset(dec->newvec, 0, 60 * 2); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
197 return; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
198 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
199 for(i = 0; i < 146; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
200 tmp[i] = dec->filtbuf[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
201 off = (t / 25) + dec->offset1[quart >> 1] + 18; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
202 ptr0 = tmp + 145 - off; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
203 ptr1 = tmp + 146; |
3055
c892b3b6bfbf
Silence warnings, these came when some tables got declared as const.
banan
parents:
3036
diff
changeset
|
204 filter = (int16_t*)ts_240 + (t % 25) * 2; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
205 for(i = 0; i < 60; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
206 t = (ptr0[0] * filter[0] + ptr0[1] * filter[1] + 0x2000) >> 14; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
207 ptr0++; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
208 dec->newvec[i] = t; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
209 ptr1[i] = t; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
210 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
211 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
212 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
213 static void truespeech_place_pulses(TSContext *dec, int16_t *out, int quart) |
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 int16_t tmp[7]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
216 int i, j, t; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
217 int16_t *ptr1, *ptr2; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
218 int coef; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
219 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
220 memset(out, 0, 60 * 2); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
221 for(i = 0; i < 7; i++) { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
222 t = dec->pulseval[quart] & 3; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
223 dec->pulseval[quart] >>= 2; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
224 tmp[6 - i] = ts_562[dec->pulseoff[quart] * 4 + t]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
225 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
226 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
227 coef = dec->pulsepos[quart] >> 15; |
3055
c892b3b6bfbf
Silence warnings, these came when some tables got declared as const.
banan
parents:
3036
diff
changeset
|
228 ptr1 = (int16_t*)ts_140 + 30; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
229 ptr2 = tmp; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
230 for(i = 0, j = 3; (i < 30) && (j > 0); i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
231 t = *ptr1++; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
232 if(coef >= t) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
233 coef -= t; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
234 else{ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
235 out[i] = *ptr2++; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
236 ptr1 += 30; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
237 j--; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
238 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
239 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
240 coef = dec->pulsepos[quart] & 0x7FFF; |
3055
c892b3b6bfbf
Silence warnings, these came when some tables got declared as const.
banan
parents:
3036
diff
changeset
|
241 ptr1 = (int16_t*)ts_140; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
242 for(i = 30, j = 4; (i < 60) && (j > 0); i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
243 t = *ptr1++; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
244 if(coef >= t) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
245 coef -= t; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
246 else{ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
247 out[i] = *ptr2++; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
248 ptr1 += 30; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
249 j--; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
250 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
251 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
252 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
253 } |
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 static void truespeech_update_filters(TSContext *dec, int16_t *out, int quart) |
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 int i; |
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 for(i = 0; i < 86; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
260 dec->filtbuf[i] = dec->filtbuf[i + 60]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
261 for(i = 0; i < 60; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
262 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
|
263 out[i] += dec->newvec[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
264 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
265 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
266 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
267 static void truespeech_synth(TSContext *dec, int16_t *out, int quart) |
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 int i,k; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
270 int t[8]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
271 int16_t *ptr0, *ptr1; |
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 ptr0 = dec->tmp1; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
274 ptr1 = dec->filters + quart * 8; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
275 for(i = 0; i < 60; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
276 int sum = 0; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
277 for(k = 0; k < 8; k++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
278 sum += ptr0[k] * ptr1[k]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
279 sum = (sum + (out[i] << 12) + 0x800) >> 12; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
280 out[i] = clip(sum, -0x7FFE, 0x7FFE); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
281 for(k = 7; k > 0; k--) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
282 ptr0[k] = ptr0[k - 1]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
283 ptr0[0] = out[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
284 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
285 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
286 for(i = 0; i < 8; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
287 t[i] = (ts_5E2[i] * ptr1[i]) >> 15; |
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 ptr0 = dec->tmp2; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
290 for(i = 0; i < 60; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
291 int sum = 0; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
292 for(k = 0; k < 8; k++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
293 sum += ptr0[k] * t[k]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
294 for(k = 7; k > 0; k--) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
295 ptr0[k] = ptr0[k - 1]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
296 ptr0[0] = out[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
297 out[i] = ((out[i] << 12) - sum) >> 12; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
298 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
299 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
300 for(i = 0; i < 8; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
301 t[i] = (ts_5F2[i] * ptr1[i]) >> 15; |
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 ptr0 = dec->tmp3; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
304 for(i = 0; i < 60; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
305 int sum = out[i] << 12; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
306 for(k = 0; k < 8; k++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
307 sum += ptr0[k] * t[k]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
308 for(k = 7; k > 0; k--) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
309 ptr0[k] = ptr0[k - 1]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
310 ptr0[0] = clip((sum + 0x800) >> 12, -0x7FFE, 0x7FFE); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
311 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
312 sum = ((ptr0[1] * (dec->filtval - (dec->filtval >> 2))) >> 4) + sum; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
313 sum = sum - (sum >> 3); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
314 out[i] = 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 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
317 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
318 static void truespeech_save_prevvec(TSContext *c) |
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 int i; |
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 for(i = 0; i < 8; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
323 c->prevfilt[i] = c->cvector[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
324 } |
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 static int truespeech_decode_frame(AVCodecContext *avctx, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
327 void *data, int *data_size, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
328 uint8_t *buf, int buf_size) |
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 TSContext *c = avctx->priv_data; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
331 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
332 int i; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
333 short *samples = data; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
334 int consumed = 0; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
335 int16_t out_buf[240]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
336 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
337 if (!buf_size) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
338 return 0; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
339 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
340 while (consumed < buf_size) { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
341 truespeech_read_frame(c, buf + consumed); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
342 consumed += 32; |
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 truespeech_correlate_filter(c); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
345 truespeech_filters_merge(c); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
346 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
347 memset(out_buf, 0, 240 * 2); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
348 for(i = 0; i < 4; i++) { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
349 truespeech_apply_twopoint_filter(c, i); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
350 truespeech_place_pulses(c, out_buf + i * 60, i); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
351 truespeech_update_filters(c, out_buf + i * 60, i); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
352 truespeech_synth(c, out_buf + i * 60, i); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
353 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
354 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
355 truespeech_save_prevvec(c); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
356 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
357 /* finally output decoded frame */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
358 for(i = 0; i < 240; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
359 *samples++ = out_buf[i]; |
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 } |
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 *data_size = consumed * 15; |
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 return buf_size; |
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 AVCodec truespeech_decoder = { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
369 "truespeech", |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
370 CODEC_TYPE_AUDIO, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
371 CODEC_ID_TRUESPEECH, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
372 sizeof(TSContext), |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
373 truespeech_decode_init, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
374 NULL, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
375 NULL, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
376 truespeech_decode_frame, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
377 }; |