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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 };