annotate truespeech.c @ 7352:c2318e551ff5 libavcodec

When picking a "high utility centroid" do not pick one that has no corresponding points. Not only it is the worst possible pick, but also the code was written without this case in mind.
author vitor
date Wed, 23 Jul 2008 03:55:37 +0000
parents e943e1409077
children 85ab7655ad4d
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
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6285
diff changeset
53 static av_cold int truespeech_decode_init(AVCodecContext * avctx)
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
54 {
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
55 // TSContext *c = avctx->priv_data;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
56
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
57 return 0;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
58 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
59
6285
michael
parents: 5674
diff changeset
60 static void truespeech_read_frame(TSContext *dec, const uint8_t *input)
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
61 {
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
62 uint32_t t;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
63
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
64 /* first dword */
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
65 t = AV_RL32(input);
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
66 input += 4;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
67
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
68 dec->flag = t & 1;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
69
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
70 dec->vector[0] = ts_codebook[0][(t >> 1) & 0x1F];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
71 dec->vector[1] = ts_codebook[1][(t >> 6) & 0x1F];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
72 dec->vector[2] = ts_codebook[2][(t >> 11) & 0xF];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
73 dec->vector[3] = ts_codebook[3][(t >> 15) & 0xF];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
74 dec->vector[4] = ts_codebook[4][(t >> 19) & 0xF];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
75 dec->vector[5] = ts_codebook[5][(t >> 23) & 0x7];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
76 dec->vector[6] = ts_codebook[6][(t >> 26) & 0x7];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
77 dec->vector[7] = ts_codebook[7][(t >> 29) & 0x7];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
78
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
79 /* second dword */
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
80 t = AV_RL32(input);
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
81 input += 4;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
82
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
83 dec->offset2[0] = (t >> 0) & 0x7F;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
84 dec->offset2[1] = (t >> 7) & 0x7F;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
85 dec->offset2[2] = (t >> 14) & 0x7F;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
86 dec->offset2[3] = (t >> 21) & 0x7F;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
87
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
88 dec->offset1[0] = ((t >> 28) & 0xF) << 4;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
89
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
90 /* third dword */
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
91 t = AV_RL32(input);
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
92 input += 4;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
93
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
94 dec->pulseval[0] = (t >> 0) & 0x3FFF;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
95 dec->pulseval[1] = (t >> 14) & 0x3FFF;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
96
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
97 dec->offset1[1] = (t >> 28) & 0x0F;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
98
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
99 /* fourth dword */
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
100 t = AV_RL32(input);
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
101 input += 4;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
102
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
103 dec->pulseval[2] = (t >> 0) & 0x3FFF;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
104 dec->pulseval[3] = (t >> 14) & 0x3FFF;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
105
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
106 dec->offset1[1] |= ((t >> 28) & 0x0F) << 4;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
107
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
108 /* fifth dword */
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
109 t = AV_RL32(input);
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
110 input += 4;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
111
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
112 dec->pulsepos[0] = (t >> 4) & 0x7FFFFFF;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
113
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
114 dec->pulseoff[0] = (t >> 0) & 0xF;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
115
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
116 dec->offset1[0] |= (t >> 31) & 1;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
117
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
118 /* sixth dword */
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
119 t = AV_RL32(input);
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
120 input += 4;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
121
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
122 dec->pulsepos[1] = (t >> 4) & 0x7FFFFFF;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
123
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
124 dec->pulseoff[1] = (t >> 0) & 0xF;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
125
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
126 dec->offset1[0] |= ((t >> 31) & 1) << 1;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
127
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
128 /* seventh dword */
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
129 t = AV_RL32(input);
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
130 input += 4;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
131
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
132 dec->pulsepos[2] = (t >> 4) & 0x7FFFFFF;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
133
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
134 dec->pulseoff[2] = (t >> 0) & 0xF;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
135
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
136 dec->offset1[0] |= ((t >> 31) & 1) << 2;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
137
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
138 /* eighth dword */
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
139 t = AV_RL32(input);
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
140 input += 4;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
141
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
142 dec->pulsepos[3] = (t >> 4) & 0x7FFFFFF;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
143
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
144 dec->pulseoff[3] = (t >> 0) & 0xF;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
145
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
146 dec->offset1[0] |= ((t >> 31) & 1) << 3;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
147
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
148 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
149
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
150 static void truespeech_correlate_filter(TSContext *dec)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
151 {
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
152 int16_t tmp[8];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
153 int i, j;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
154
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
155 for(i = 0; i < 8; i++){
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
156 if(i > 0){
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
157 memcpy(tmp, dec->cvector, i * 2);
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
158 for(j = 0; j < i; j++)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
159 dec->cvector[j] = ((tmp[i - j - 1] * dec->vector[i]) +
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
160 (dec->cvector[j] << 15) + 0x4000) >> 15;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
161 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
162 dec->cvector[i] = (8 - dec->vector[i]) >> 3;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
163 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
164 for(i = 0; i < 8; i++)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
165 dec->cvector[i] = (dec->cvector[i] * ts_230[i]) >> 15;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
166
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
167 dec->filtval = dec->vector[0];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
168 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
169
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
170 static void truespeech_filters_merge(TSContext *dec)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
171 {
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
172 int i;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
173
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
174 if(!dec->flag){
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
175 for(i = 0; i < 8; i++){
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
176 dec->filters[i + 0] = dec->prevfilt[i];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
177 dec->filters[i + 8] = dec->prevfilt[i];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
178 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
179 }else{
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
180 for(i = 0; i < 8; i++){
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
181 dec->filters[i + 0]=(dec->cvector[i] * 21846 + dec->prevfilt[i] * 10923 + 16384) >> 15;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
182 dec->filters[i + 8]=(dec->cvector[i] * 10923 + dec->prevfilt[i] * 21846 + 16384) >> 15;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
183 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
184 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
185 for(i = 0; i < 8; i++){
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
186 dec->filters[i + 16] = dec->cvector[i];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
187 dec->filters[i + 24] = dec->cvector[i];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
188 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
189 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
190
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
191 static void truespeech_apply_twopoint_filter(TSContext *dec, int quart)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
192 {
3347
82277c821113 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 3055
diff changeset
193 int16_t tmp[146 + 60], *ptr0, *ptr1;
82277c821113 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 3055
diff changeset
194 const int16_t *filter;
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
195 int i, t, off;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
196
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
197 t = dec->offset2[quart];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
198 if(t == 127){
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
199 memset(dec->newvec, 0, 60 * 2);
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
200 return;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
201 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
202 for(i = 0; i < 146; i++)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
203 tmp[i] = dec->filtbuf[i];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
204 off = (t / 25) + dec->offset1[quart >> 1] + 18;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
205 ptr0 = tmp + 145 - off;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
206 ptr1 = tmp + 146;
3347
82277c821113 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 3055
diff changeset
207 filter = (const int16_t*)ts_240 + (t % 25) * 2;
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
208 for(i = 0; i < 60; i++){
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
209 t = (ptr0[0] * filter[0] + ptr0[1] * filter[1] + 0x2000) >> 14;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
210 ptr0++;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
211 dec->newvec[i] = t;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
212 ptr1[i] = t;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
213 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
214 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
215
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
216 static void truespeech_place_pulses(TSContext *dec, int16_t *out, int quart)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
217 {
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
218 int16_t tmp[7];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
219 int i, j, t;
3347
82277c821113 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 3055
diff changeset
220 const int16_t *ptr1;
82277c821113 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 3055
diff changeset
221 int16_t *ptr2;
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
222 int coef;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
223
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
224 memset(out, 0, 60 * 2);
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
225 for(i = 0; i < 7; i++) {
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
226 t = dec->pulseval[quart] & 3;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
227 dec->pulseval[quart] >>= 2;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
228 tmp[6 - i] = ts_562[dec->pulseoff[quart] * 4 + t];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
229 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
230
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
231 coef = dec->pulsepos[quart] >> 15;
3347
82277c821113 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 3055
diff changeset
232 ptr1 = (const int16_t*)ts_140 + 30;
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
233 ptr2 = tmp;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
234 for(i = 0, j = 3; (i < 30) && (j > 0); i++){
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
235 t = *ptr1++;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
236 if(coef >= t)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
237 coef -= t;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
238 else{
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
239 out[i] = *ptr2++;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
240 ptr1 += 30;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
241 j--;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
242 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
243 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
244 coef = dec->pulsepos[quart] & 0x7FFF;
3347
82277c821113 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 3055
diff changeset
245 ptr1 = (const int16_t*)ts_140;
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
246 for(i = 30, j = 4; (i < 60) && (j > 0); i++){
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
247 t = *ptr1++;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
248 if(coef >= t)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
249 coef -= t;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
250 else{
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
251 out[i] = *ptr2++;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
252 ptr1 += 30;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
253 j--;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
254 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
255 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
256
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
257 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
258
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
259 static void truespeech_update_filters(TSContext *dec, int16_t *out, int quart)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
260 {
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
261 int i;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
262
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
263 for(i = 0; i < 86; i++)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
264 dec->filtbuf[i] = dec->filtbuf[i + 60];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
265 for(i = 0; i < 60; i++){
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
266 dec->filtbuf[i + 86] = out[i] + dec->newvec[i] - (dec->newvec[i] >> 3);
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
267 out[i] += dec->newvec[i];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
268 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
269 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
270
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
271 static void truespeech_synth(TSContext *dec, int16_t *out, int quart)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
272 {
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
273 int i,k;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
274 int t[8];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
275 int16_t *ptr0, *ptr1;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
276
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
277 ptr0 = dec->tmp1;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
278 ptr1 = dec->filters + quart * 8;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
279 for(i = 0; i < 60; i++){
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
280 int sum = 0;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
281 for(k = 0; k < 8; k++)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
282 sum += ptr0[k] * ptr1[k];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
283 sum = (sum + (out[i] << 12) + 0x800) >> 12;
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4364
diff changeset
284 out[i] = av_clip(sum, -0x7FFE, 0x7FFE);
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
285 for(k = 7; k > 0; k--)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
286 ptr0[k] = ptr0[k - 1];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
287 ptr0[0] = out[i];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
288 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
289
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
290 for(i = 0; i < 8; i++)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
291 t[i] = (ts_5E2[i] * ptr1[i]) >> 15;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
292
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
293 ptr0 = dec->tmp2;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
294 for(i = 0; i < 60; i++){
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
295 int sum = 0;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
296 for(k = 0; k < 8; k++)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
297 sum += ptr0[k] * t[k];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
298 for(k = 7; k > 0; k--)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
299 ptr0[k] = ptr0[k - 1];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
300 ptr0[0] = out[i];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
301 out[i] = ((out[i] << 12) - sum) >> 12;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
302 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
303
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
304 for(i = 0; i < 8; i++)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
305 t[i] = (ts_5F2[i] * ptr1[i]) >> 15;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
306
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
307 ptr0 = dec->tmp3;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
308 for(i = 0; i < 60; i++){
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
309 int sum = out[i] << 12;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
310 for(k = 0; k < 8; k++)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
311 sum += ptr0[k] * t[k];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
312 for(k = 7; k > 0; k--)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
313 ptr0[k] = ptr0[k - 1];
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4364
diff changeset
314 ptr0[0] = av_clip((sum + 0x800) >> 12, -0x7FFE, 0x7FFE);
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
315
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
316 sum = ((ptr0[1] * (dec->filtval - (dec->filtval >> 2))) >> 4) + sum;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
317 sum = sum - (sum >> 3);
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4364
diff changeset
318 out[i] = av_clip((sum + 0x800) >> 12, -0x7FFE, 0x7FFE);
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
319 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
320 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
321
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
322 static void truespeech_save_prevvec(TSContext *c)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
323 {
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
324 int i;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
325
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
326 for(i = 0; i < 8; i++)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
327 c->prevfilt[i] = c->cvector[i];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
328 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
329
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
330 static int truespeech_decode_frame(AVCodecContext *avctx,
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
331 void *data, int *data_size,
6285
michael
parents: 5674
diff changeset
332 const uint8_t *buf, int buf_size)
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
333 {
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
334 TSContext *c = avctx->priv_data;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
335
5674
ca944f1db2b3 Add checks on input/output buffers size for some audio decoders
kostya
parents: 4594
diff changeset
336 int i, j;
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
337 short *samples = data;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
338 int consumed = 0;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
339 int16_t out_buf[240];
5674
ca944f1db2b3 Add checks on input/output buffers size for some audio decoders
kostya
parents: 4594
diff changeset
340 int iterations;
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
341
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
342 if (!buf_size)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
343 return 0;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
344
5674
ca944f1db2b3 Add checks on input/output buffers size for some audio decoders
kostya
parents: 4594
diff changeset
345 iterations = FFMIN(buf_size / 32, *data_size / 480);
ca944f1db2b3 Add checks on input/output buffers size for some audio decoders
kostya
parents: 4594
diff changeset
346 for(j = 0; j < iterations; j++) {
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
347 truespeech_read_frame(c, buf + consumed);
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
348 consumed += 32;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
349
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
350 truespeech_correlate_filter(c);
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
351 truespeech_filters_merge(c);
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
352
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
353 memset(out_buf, 0, 240 * 2);
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
354 for(i = 0; i < 4; i++) {
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
355 truespeech_apply_twopoint_filter(c, i);
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
356 truespeech_place_pulses(c, out_buf + i * 60, i);
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
357 truespeech_update_filters(c, out_buf + i * 60, i);
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
358 truespeech_synth(c, out_buf + i * 60, i);
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
359 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
360
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
361 truespeech_save_prevvec(c);
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
362
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
363 /* finally output decoded frame */
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
364 for(i = 0; i < 240; i++)
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
365 *samples++ = out_buf[i];
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
366
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
367 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
368
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
369 *data_size = consumed * 15;
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
370
5674
ca944f1db2b3 Add checks on input/output buffers size for some audio decoders
kostya
parents: 4594
diff changeset
371 return consumed;
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
372 }
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
373
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
374 AVCodec truespeech_decoder = {
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
375 "truespeech",
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
376 CODEC_TYPE_AUDIO,
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
377 CODEC_ID_TRUESPEECH,
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
378 sizeof(TSContext),
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
379 truespeech_decode_init,
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
380 NULL,
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
381 NULL,
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
382 truespeech_decode_frame,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6710
diff changeset
383 .long_name = NULL_IF_CONFIG_SMALL("DSP Group TrueSpeech"),
3006
4007989367bc TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff changeset
384 };