Mercurial > libavcodec.hg
annotate truespeech.c @ 11352:6e0af2cfdcfe libavcodec
Do MC and IDCT in coding (hilbert) order
This increases the slice size to 64 pixels, due to having to decode an
entire chroma superblock row per slice.
This can be up to 6% slower depending on clip and CPU, but is necessary
for future optimizations that gain significantly more than was lost.
author | conrad |
---|---|
date | Wed, 03 Mar 2010 23:27:40 +0000 |
parents | 54bc8a2727b0 |
children | 8a4984c5cacc |
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 */ |
8573
2acf0ae7b041
Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents:
7451
diff
changeset
|
21 |
2acf0ae7b041
Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents:
7451
diff
changeset
|
22 #include "libavutil/intreadwrite.h" |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
23 #include "avcodec.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 #include "truespeech_data.h" |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
26 /** |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8573
diff
changeset
|
27 * @file libavcodec/truespeech.c |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
28 * TrueSpeech decoder. |
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 |
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 * TrueSpeech decoder context |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
33 */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
34 typedef struct { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
35 /* input data */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
36 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
|
37 int offset1[2]; //< 8-bit value, used in one copying offset |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
38 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
|
39 int pulseoff[4]; //< 4-bit offset of pulse values block |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
40 int pulsepos[4]; //< 27-bit variable, encodes 7 pulse positions |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
41 int pulseval[4]; //< 7x2-bit pulse values |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
42 int flag; //< 1-bit flag, shows how to choose filters |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
43 /* temporary data */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
44 int filtbuf[146]; // some big vector used for storing filters |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
45 int prevfilt[8]; // filter from previous frame |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
46 int16_t tmp1[8]; // coefficients for adding to out |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
47 int16_t tmp2[8]; // coefficients for adding to out |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
48 int16_t tmp3[8]; // coefficients for adding to out |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
49 int16_t cvector[8]; // correlated input vector |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
50 int filtval; // gain value for one function |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
51 int16_t newvec[60]; // tmp vector |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
52 int16_t filters[32]; // filters for every subframe |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
53 } TSContext; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
54 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6285
diff
changeset
|
55 static av_cold int truespeech_decode_init(AVCodecContext * avctx) |
3006
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 // TSContext *c = avctx->priv_data; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
58 |
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7040
diff
changeset
|
59 avctx->sample_fmt = SAMPLE_FMT_S16; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
60 return 0; |
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 |
6285 | 63 static void truespeech_read_frame(TSContext *dec, const uint8_t *input) |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
64 { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
65 uint32_t t; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
66 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
67 /* first dword */ |
4364 | 68 t = AV_RL32(input); |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
69 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
70 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
71 dec->flag = t & 1; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
72 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
73 dec->vector[0] = ts_codebook[0][(t >> 1) & 0x1F]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
74 dec->vector[1] = ts_codebook[1][(t >> 6) & 0x1F]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
75 dec->vector[2] = ts_codebook[2][(t >> 11) & 0xF]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
76 dec->vector[3] = ts_codebook[3][(t >> 15) & 0xF]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
77 dec->vector[4] = ts_codebook[4][(t >> 19) & 0xF]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
78 dec->vector[5] = ts_codebook[5][(t >> 23) & 0x7]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
79 dec->vector[6] = ts_codebook[6][(t >> 26) & 0x7]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
80 dec->vector[7] = ts_codebook[7][(t >> 29) & 0x7]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
81 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
82 /* second dword */ |
4364 | 83 t = AV_RL32(input); |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
84 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
85 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
86 dec->offset2[0] = (t >> 0) & 0x7F; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
87 dec->offset2[1] = (t >> 7) & 0x7F; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
88 dec->offset2[2] = (t >> 14) & 0x7F; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
89 dec->offset2[3] = (t >> 21) & 0x7F; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
90 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
91 dec->offset1[0] = ((t >> 28) & 0xF) << 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
92 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
93 /* third dword */ |
4364 | 94 t = AV_RL32(input); |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
95 input += 4; |
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->pulseval[0] = (t >> 0) & 0x3FFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
98 dec->pulseval[1] = (t >> 14) & 0x3FFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
99 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
100 dec->offset1[1] = (t >> 28) & 0x0F; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
101 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
102 /* fourth dword */ |
4364 | 103 t = AV_RL32(input); |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
104 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
105 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
106 dec->pulseval[2] = (t >> 0) & 0x3FFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
107 dec->pulseval[3] = (t >> 14) & 0x3FFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
108 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
109 dec->offset1[1] |= ((t >> 28) & 0x0F) << 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
110 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
111 /* fifth dword */ |
4364 | 112 t = AV_RL32(input); |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
113 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
114 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
115 dec->pulsepos[0] = (t >> 4) & 0x7FFFFFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
116 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
117 dec->pulseoff[0] = (t >> 0) & 0xF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
118 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
119 dec->offset1[0] |= (t >> 31) & 1; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
120 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
121 /* sixth dword */ |
4364 | 122 t = AV_RL32(input); |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
123 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
124 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
125 dec->pulsepos[1] = (t >> 4) & 0x7FFFFFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
126 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
127 dec->pulseoff[1] = (t >> 0) & 0xF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
128 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
129 dec->offset1[0] |= ((t >> 31) & 1) << 1; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
130 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
131 /* seventh dword */ |
4364 | 132 t = AV_RL32(input); |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
133 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
134 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
135 dec->pulsepos[2] = (t >> 4) & 0x7FFFFFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
136 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
137 dec->pulseoff[2] = (t >> 0) & 0xF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
138 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
139 dec->offset1[0] |= ((t >> 31) & 1) << 2; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
140 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
141 /* eighth dword */ |
4364 | 142 t = AV_RL32(input); |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
143 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
144 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
145 dec->pulsepos[3] = (t >> 4) & 0x7FFFFFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
146 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
147 dec->pulseoff[3] = (t >> 0) & 0xF; |
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 dec->offset1[0] |= ((t >> 31) & 1) << 3; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
150 |
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 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
153 static void truespeech_correlate_filter(TSContext *dec) |
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 int16_t tmp[8]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
156 int i, j; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
157 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
158 for(i = 0; i < 8; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
159 if(i > 0){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
160 memcpy(tmp, dec->cvector, i * 2); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
161 for(j = 0; j < i; j++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
162 dec->cvector[j] = ((tmp[i - j - 1] * dec->vector[i]) + |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
163 (dec->cvector[j] << 15) + 0x4000) >> 15; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
164 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
165 dec->cvector[i] = (8 - dec->vector[i]) >> 3; |
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 for(i = 0; i < 8; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
168 dec->cvector[i] = (dec->cvector[i] * ts_230[i]) >> 15; |
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 dec->filtval = dec->vector[0]; |
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 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
173 static void truespeech_filters_merge(TSContext *dec) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
174 { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
175 int i; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
176 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
177 if(!dec->flag){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
178 for(i = 0; i < 8; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
179 dec->filters[i + 0] = dec->prevfilt[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
180 dec->filters[i + 8] = dec->prevfilt[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
181 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
182 }else{ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
183 for(i = 0; i < 8; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
184 dec->filters[i + 0]=(dec->cvector[i] * 21846 + dec->prevfilt[i] * 10923 + 16384) >> 15; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
185 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
|
186 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
187 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
188 for(i = 0; i < 8; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
189 dec->filters[i + 16] = dec->cvector[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
190 dec->filters[i + 24] = dec->cvector[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
191 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
192 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
193 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
194 static void truespeech_apply_twopoint_filter(TSContext *dec, int quart) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
195 { |
3347
82277c821113
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
3055
diff
changeset
|
196 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
|
197 const int16_t *filter; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
198 int i, t, off; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
199 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
200 t = dec->offset2[quart]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
201 if(t == 127){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
202 memset(dec->newvec, 0, 60 * 2); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
203 return; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
204 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
205 for(i = 0; i < 146; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
206 tmp[i] = dec->filtbuf[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
207 off = (t / 25) + dec->offset1[quart >> 1] + 18; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
208 ptr0 = tmp + 145 - off; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
209 ptr1 = tmp + 146; |
3347
82277c821113
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
3055
diff
changeset
|
210 filter = (const int16_t*)ts_240 + (t % 25) * 2; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
211 for(i = 0; i < 60; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
212 t = (ptr0[0] * filter[0] + ptr0[1] * filter[1] + 0x2000) >> 14; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
213 ptr0++; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
214 dec->newvec[i] = t; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
215 ptr1[i] = t; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
216 } |
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 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
219 static void truespeech_place_pulses(TSContext *dec, int16_t *out, int quart) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
220 { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
221 int16_t tmp[7]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
222 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
|
223 const int16_t *ptr1; |
82277c821113
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
3055
diff
changeset
|
224 int16_t *ptr2; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
225 int coef; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
226 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
227 memset(out, 0, 60 * 2); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
228 for(i = 0; i < 7; i++) { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
229 t = dec->pulseval[quart] & 3; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
230 dec->pulseval[quart] >>= 2; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
231 tmp[6 - i] = ts_562[dec->pulseoff[quart] * 4 + t]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
232 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
233 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
234 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
|
235 ptr1 = (const int16_t*)ts_140 + 30; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
236 ptr2 = tmp; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
237 for(i = 0, j = 3; (i < 30) && (j > 0); i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
238 t = *ptr1++; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
239 if(coef >= t) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
240 coef -= t; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
241 else{ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
242 out[i] = *ptr2++; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
243 ptr1 += 30; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
244 j--; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
245 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
246 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
247 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
|
248 ptr1 = (const int16_t*)ts_140; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
249 for(i = 30, j = 4; (i < 60) && (j > 0); i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
250 t = *ptr1++; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
251 if(coef >= t) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
252 coef -= t; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
253 else{ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
254 out[i] = *ptr2++; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
255 ptr1 += 30; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
256 j--; |
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 |
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 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
262 static void truespeech_update_filters(TSContext *dec, int16_t *out, int quart) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
263 { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
264 int i; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
265 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
266 for(i = 0; i < 86; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
267 dec->filtbuf[i] = dec->filtbuf[i + 60]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
268 for(i = 0; i < 60; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
269 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
|
270 out[i] += dec->newvec[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
271 } |
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 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
274 static void truespeech_synth(TSContext *dec, int16_t *out, int quart) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
275 { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
276 int i,k; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
277 int t[8]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
278 int16_t *ptr0, *ptr1; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
279 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
280 ptr0 = dec->tmp1; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
281 ptr1 = dec->filters + quart * 8; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
282 for(i = 0; i < 60; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
283 int sum = 0; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
284 for(k = 0; k < 8; k++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
285 sum += ptr0[k] * ptr1[k]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
286 sum = (sum + (out[i] << 12) + 0x800) >> 12; |
4594 | 287 out[i] = av_clip(sum, -0x7FFE, 0x7FFE); |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
288 for(k = 7; k > 0; k--) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
289 ptr0[k] = ptr0[k - 1]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
290 ptr0[0] = out[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
291 } |
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 for(i = 0; i < 8; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
294 t[i] = (ts_5E2[i] * ptr1[i]) >> 15; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
295 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
296 ptr0 = dec->tmp2; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
297 for(i = 0; i < 60; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
298 int sum = 0; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
299 for(k = 0; k < 8; k++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
300 sum += ptr0[k] * t[k]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
301 for(k = 7; k > 0; k--) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
302 ptr0[k] = ptr0[k - 1]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
303 ptr0[0] = out[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
304 out[i] = ((out[i] << 12) - sum) >> 12; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
305 } |
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 for(i = 0; i < 8; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
308 t[i] = (ts_5F2[i] * ptr1[i]) >> 15; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
309 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
310 ptr0 = dec->tmp3; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
311 for(i = 0; i < 60; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
312 int sum = out[i] << 12; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
313 for(k = 0; k < 8; k++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
314 sum += ptr0[k] * t[k]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
315 for(k = 7; k > 0; k--) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
316 ptr0[k] = ptr0[k - 1]; |
4594 | 317 ptr0[0] = av_clip((sum + 0x800) >> 12, -0x7FFE, 0x7FFE); |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
318 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
319 sum = ((ptr0[1] * (dec->filtval - (dec->filtval >> 2))) >> 4) + sum; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
320 sum = sum - (sum >> 3); |
4594 | 321 out[i] = av_clip((sum + 0x800) >> 12, -0x7FFE, 0x7FFE); |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
322 } |
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 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
325 static void truespeech_save_prevvec(TSContext *c) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
326 { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
327 int 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 for(i = 0; i < 8; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
330 c->prevfilt[i] = c->cvector[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
331 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
332 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
333 static int truespeech_decode_frame(AVCodecContext *avctx, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
334 void *data, int *data_size, |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
335 AVPacket *avpkt) |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
336 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
337 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
338 int buf_size = avpkt->size; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
339 TSContext *c = avctx->priv_data; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
340 |
5674
ca944f1db2b3
Add checks on input/output buffers size for some audio decoders
kostya
parents:
4594
diff
changeset
|
341 int i, j; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
342 short *samples = data; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
343 int consumed = 0; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
344 int16_t out_buf[240]; |
5674
ca944f1db2b3
Add checks on input/output buffers size for some audio decoders
kostya
parents:
4594
diff
changeset
|
345 int iterations; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
346 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
347 if (!buf_size) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
348 return 0; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
349 |
5674
ca944f1db2b3
Add checks on input/output buffers size for some audio decoders
kostya
parents:
4594
diff
changeset
|
350 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
|
351 for(j = 0; j < iterations; j++) { |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
352 truespeech_read_frame(c, buf + consumed); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
353 consumed += 32; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
354 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
355 truespeech_correlate_filter(c); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
356 truespeech_filters_merge(c); |
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 memset(out_buf, 0, 240 * 2); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
359 for(i = 0; i < 4; i++) { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
360 truespeech_apply_twopoint_filter(c, i); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
361 truespeech_place_pulses(c, out_buf + i * 60, i); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
362 truespeech_update_filters(c, out_buf + i * 60, i); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
363 truespeech_synth(c, out_buf + i * 60, 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 truespeech_save_prevvec(c); |
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 /* finally output decoded frame */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
369 for(i = 0; i < 240; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
370 *samples++ = out_buf[i]; |
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 } |
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 *data_size = consumed * 15; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
375 |
5674
ca944f1db2b3
Add checks on input/output buffers size for some audio decoders
kostya
parents:
4594
diff
changeset
|
376 return consumed; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
377 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
378 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
379 AVCodec truespeech_decoder = { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
380 "truespeech", |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
381 CODEC_TYPE_AUDIO, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
382 CODEC_ID_TRUESPEECH, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
383 sizeof(TSContext), |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
384 truespeech_decode_init, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
385 NULL, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
386 NULL, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
387 truespeech_decode_frame, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6710
diff
changeset
|
388 .long_name = NULL_IF_CONFIG_SMALL("DSP Group TrueSpeech"), |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
389 }; |