annotate truespeech.c @ 4166:eced83504436 libavcodec

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