2 * DSP Group TrueSpeech compatible decoder
3 * Copyright (c) 2005 Konstantin Shishkov
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "libavutil/channel_layout.h"
23 #include "libavutil/intreadwrite.h"
29 #include "truespeech_data.h"
36 * TrueSpeech decoder context
42 DECLARE_ALIGNED(16, uint8_t, buffer
)[32];
43 int16_t vector
[8]; ///< input vector: 5/5/4/4/4/3/3/3
44 int offset1
[2]; ///< 8-bit value, used in one copying offset
45 int offset2
[4]; ///< 7-bit value, encodes offsets for copying and for two-point filter
46 int pulseoff
[4]; ///< 4-bit offset of pulse values block
47 int pulsepos
[4]; ///< 27-bit variable, encodes 7 pulse positions
48 int pulseval
[4]; ///< 7x2-bit pulse values
49 int flag
; ///< 1-bit flag, shows how to choose filters
51 int filtbuf
[146]; // some big vector used for storing filters
52 int prevfilt
[8]; // filter from previous frame
53 int16_t tmp1
[8]; // coefficients for adding to out
54 int16_t tmp2
[8]; // coefficients for adding to out
55 int16_t tmp3
[8]; // coefficients for adding to out
56 int16_t cvector
[8]; // correlated input vector
57 int filtval
; // gain value for one function
58 int16_t newvec
[60]; // tmp vector
59 int16_t filters
[32]; // filters for every subframe
62 static av_cold
int truespeech_decode_init(AVCodecContext
* avctx
)
64 TSContext
*c
= avctx
->priv_data
;
66 if (avctx
->channels
!= 1) {
67 av_log_ask_for_sample(avctx
, "Unsupported channel count: %d\n", avctx
->channels
);
68 return AVERROR_PATCHWELCOME
;
71 avctx
->channel_layout
= AV_CH_LAYOUT_MONO
;
72 avctx
->sample_fmt
= AV_SAMPLE_FMT_S16
;
74 ff_dsputil_init(&c
->dsp
, avctx
);
76 avcodec_get_frame_defaults(&c
->frame
);
77 avctx
->coded_frame
= &c
->frame
;
82 static void truespeech_read_frame(TSContext
*dec
, const uint8_t *input
)
86 dec
->dsp
.bswap_buf((uint32_t *)dec
->buffer
, (const uint32_t *)input
, 8);
87 init_get_bits(&gb
, dec
->buffer
, 32 * 8);
89 dec
->vector
[7] = ts_codebook
[7][get_bits(&gb
, 3)];
90 dec
->vector
[6] = ts_codebook
[6][get_bits(&gb
, 3)];
91 dec
->vector
[5] = ts_codebook
[5][get_bits(&gb
, 3)];
92 dec
->vector
[4] = ts_codebook
[4][get_bits(&gb
, 4)];
93 dec
->vector
[3] = ts_codebook
[3][get_bits(&gb
, 4)];
94 dec
->vector
[2] = ts_codebook
[2][get_bits(&gb
, 4)];
95 dec
->vector
[1] = ts_codebook
[1][get_bits(&gb
, 5)];
96 dec
->vector
[0] = ts_codebook
[0][get_bits(&gb
, 5)];
97 dec
->flag
= get_bits1(&gb
);
99 dec
->offset1
[0] = get_bits(&gb
, 4) << 4;
100 dec
->offset2
[3] = get_bits(&gb
, 7);
101 dec
->offset2
[2] = get_bits(&gb
, 7);
102 dec
->offset2
[1] = get_bits(&gb
, 7);
103 dec
->offset2
[0] = get_bits(&gb
, 7);
105 dec
->offset1
[1] = get_bits(&gb
, 4);
106 dec
->pulseval
[1] = get_bits(&gb
, 14);
107 dec
->pulseval
[0] = get_bits(&gb
, 14);
109 dec
->offset1
[1] |= get_bits(&gb
, 4) << 4;
110 dec
->pulseval
[3] = get_bits(&gb
, 14);
111 dec
->pulseval
[2] = get_bits(&gb
, 14);
113 dec
->offset1
[0] |= get_bits1(&gb
);
114 dec
->pulsepos
[0] = get_bits_long(&gb
, 27);
115 dec
->pulseoff
[0] = get_bits(&gb
, 4);
117 dec
->offset1
[0] |= get_bits1(&gb
) << 1;
118 dec
->pulsepos
[1] = get_bits_long(&gb
, 27);
119 dec
->pulseoff
[1] = get_bits(&gb
, 4);
121 dec
->offset1
[0] |= get_bits1(&gb
) << 2;
122 dec
->pulsepos
[2] = get_bits_long(&gb
, 27);
123 dec
->pulseoff
[2] = get_bits(&gb
, 4);
125 dec
->offset1
[0] |= get_bits1(&gb
) << 3;
126 dec
->pulsepos
[3] = get_bits_long(&gb
, 27);
127 dec
->pulseoff
[3] = get_bits(&gb
, 4);
130 static void truespeech_correlate_filter(TSContext
*dec
)
135 for(i
= 0; i
< 8; i
++){
137 memcpy(tmp
, dec
->cvector
, i
* sizeof(*tmp
));
138 for(j
= 0; j
< i
; j
++)
139 dec
->cvector
[j
] = ((tmp
[i
- j
- 1] * dec
->vector
[i
]) +
140 (dec
->cvector
[j
] << 15) + 0x4000) >> 15;
142 dec
->cvector
[i
] = (8 - dec
->vector
[i
]) >> 3;
144 for(i
= 0; i
< 8; i
++)
145 dec
->cvector
[i
] = (dec
->cvector
[i
] * ts_decay_994_1000
[i
]) >> 15;
147 dec
->filtval
= dec
->vector
[0];
150 static void truespeech_filters_merge(TSContext
*dec
)
155 for(i
= 0; i
< 8; i
++){
156 dec
->filters
[i
+ 0] = dec
->prevfilt
[i
];
157 dec
->filters
[i
+ 8] = dec
->prevfilt
[i
];
160 for(i
= 0; i
< 8; i
++){
161 dec
->filters
[i
+ 0]=(dec
->cvector
[i
] * 21846 + dec
->prevfilt
[i
] * 10923 + 16384) >> 15;
162 dec
->filters
[i
+ 8]=(dec
->cvector
[i
] * 10923 + dec
->prevfilt
[i
] * 21846 + 16384) >> 15;
165 for(i
= 0; i
< 8; i
++){
166 dec
->filters
[i
+ 16] = dec
->cvector
[i
];
167 dec
->filters
[i
+ 24] = dec
->cvector
[i
];
171 static void truespeech_apply_twopoint_filter(TSContext
*dec
, int quart
)
173 int16_t tmp
[146 + 60], *ptr0
, *ptr1
;
174 const int16_t *filter
;
177 t
= dec
->offset2
[quart
];
179 memset(dec
->newvec
, 0, 60 * sizeof(*dec
->newvec
));
182 for(i
= 0; i
< 146; i
++)
183 tmp
[i
] = dec
->filtbuf
[i
];
184 off
= (t
/ 25) + dec
->offset1
[quart
>> 1] + 18;
185 off
= av_clip(off
, 0, 145);
186 ptr0
= tmp
+ 145 - off
;
188 filter
= ts_order2_coeffs
+ (t
% 25) * 2;
189 for(i
= 0; i
< 60; i
++){
190 t
= (ptr0
[0] * filter
[0] + ptr0
[1] * filter
[1] + 0x2000) >> 14;
197 static void truespeech_place_pulses(TSContext
*dec
, int16_t *out
, int quart
)
205 memset(out
, 0, 60 * sizeof(*out
));
206 for(i
= 0; i
< 7; i
++) {
207 t
= dec
->pulseval
[quart
] & 3;
208 dec
->pulseval
[quart
] >>= 2;
209 tmp
[6 - i
] = ts_pulse_scales
[dec
->pulseoff
[quart
] * 4 + t
];
212 coef
= dec
->pulsepos
[quart
] >> 15;
213 ptr1
= ts_pulse_values
+ 30;
215 for(i
= 0, j
= 3; (i
< 30) && (j
> 0); i
++){
225 coef
= dec
->pulsepos
[quart
] & 0x7FFF;
226 ptr1
= ts_pulse_values
;
227 for(i
= 30, j
= 4; (i
< 60) && (j
> 0); i
++){
240 static void truespeech_update_filters(TSContext
*dec
, int16_t *out
, int quart
)
244 memmove(dec
->filtbuf
, &dec
->filtbuf
[60], 86 * sizeof(*dec
->filtbuf
));
245 for(i
= 0; i
< 60; i
++){
246 dec
->filtbuf
[i
+ 86] = out
[i
] + dec
->newvec
[i
] - (dec
->newvec
[i
] >> 3);
247 out
[i
] += dec
->newvec
[i
];
251 static void truespeech_synth(TSContext
*dec
, int16_t *out
, int quart
)
255 int16_t *ptr0
, *ptr1
;
258 ptr1
= dec
->filters
+ quart
* 8;
259 for(i
= 0; i
< 60; i
++){
261 for(k
= 0; k
< 8; k
++)
262 sum
+= ptr0
[k
] * ptr1
[k
];
263 sum
= (sum
+ (out
[i
] << 12) + 0x800) >> 12;
264 out
[i
] = av_clip(sum
, -0x7FFE, 0x7FFE);
265 for(k
= 7; k
> 0; k
--)
266 ptr0
[k
] = ptr0
[k
- 1];
270 for(i
= 0; i
< 8; i
++)
271 t
[i
] = (ts_decay_35_64
[i
] * ptr1
[i
]) >> 15;
274 for(i
= 0; i
< 60; i
++){
276 for(k
= 0; k
< 8; k
++)
277 sum
+= ptr0
[k
] * t
[k
];
278 for(k
= 7; k
> 0; k
--)
279 ptr0
[k
] = ptr0
[k
- 1];
281 out
[i
] = ((out
[i
] << 12) - sum
) >> 12;
284 for(i
= 0; i
< 8; i
++)
285 t
[i
] = (ts_decay_3_4
[i
] * ptr1
[i
]) >> 15;
288 for(i
= 0; i
< 60; i
++){
289 int sum
= out
[i
] << 12;
290 for(k
= 0; k
< 8; k
++)
291 sum
+= ptr0
[k
] * t
[k
];
292 for(k
= 7; k
> 0; k
--)
293 ptr0
[k
] = ptr0
[k
- 1];
294 ptr0
[0] = av_clip((sum
+ 0x800) >> 12, -0x7FFE, 0x7FFE);
296 sum
= ((ptr0
[1] * (dec
->filtval
- (dec
->filtval
>> 2))) >> 4) + sum
;
297 sum
= sum
- (sum
>> 3);
298 out
[i
] = av_clip((sum
+ 0x800) >> 12, -0x7FFE, 0x7FFE);
302 static void truespeech_save_prevvec(TSContext
*c
)
306 for(i
= 0; i
< 8; i
++)
307 c
->prevfilt
[i
] = c
->cvector
[i
];
310 static int truespeech_decode_frame(AVCodecContext
*avctx
, void *data
,
311 int *got_frame_ptr
, AVPacket
*avpkt
)
313 const uint8_t *buf
= avpkt
->data
;
314 int buf_size
= avpkt
->size
;
315 TSContext
*c
= avctx
->priv_data
;
321 iterations
= buf_size
/ 32;
324 av_log(avctx
, AV_LOG_ERROR
,
325 "Too small input buffer (%d bytes), need at least 32 bytes\n", buf_size
);
329 /* get output buffer */
330 c
->frame
.nb_samples
= iterations
* 240;
331 if ((ret
= ff_get_buffer(avctx
, &c
->frame
)) < 0) {
332 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
335 samples
= (int16_t *)c
->frame
.data
[0];
337 memset(samples
, 0, iterations
* 240 * sizeof(*samples
));
339 for(j
= 0; j
< iterations
; j
++) {
340 truespeech_read_frame(c
, buf
);
343 truespeech_correlate_filter(c
);
344 truespeech_filters_merge(c
);
346 for(i
= 0; i
< 4; i
++) {
347 truespeech_apply_twopoint_filter(c
, i
);
348 truespeech_place_pulses (c
, samples
, i
);
349 truespeech_update_filters(c
, samples
, i
);
350 truespeech_synth (c
, samples
, i
);
354 truespeech_save_prevvec(c
);
358 *(AVFrame
*)data
= c
->frame
;
363 AVCodec ff_truespeech_decoder
= {
364 .name
= "truespeech",
365 .type
= AVMEDIA_TYPE_AUDIO
,
366 .id
= AV_CODEC_ID_TRUESPEECH
,
367 .priv_data_size
= sizeof(TSContext
),
368 .init
= truespeech_decode_init
,
369 .decode
= truespeech_decode_frame
,
370 .capabilities
= CODEC_CAP_DR1
,
371 .long_name
= NULL_IF_CONFIG_SMALL("DSP Group TrueSpeech"),