1 /*
2 * WMA compatible encoder
3 * Copyright (c) 2007 Michael Niedermayer
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg 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.
11 *
12 * FFmpeg 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.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #include "config_components.h"
23
26
32
33
35 {
37 int i, flags1, flags2, block_align;
38 uint8_t *extradata;
40
42
45 "too many channels: got %i, need %i or fewer\n",
48 }
49
54 }
55
58 "bitrate too low: got %"PRId64", need 24000 or higher\n",
61 }
62
63 /* extract flag info */
64 flags1 = 0;
65 flags2 = 1;
68 if (!extradata)
75 if (!extradata)
80 } else {
82 }
84 s->use_exp_vlc = flags2 & 0x0001;
85 s->use_bit_reservoir = flags2 & 0x0002;
86 s->use_variable_block_len = flags2 & 0x0004;
89
92
93 /* init MDCT */
94 for (
i = 0;
i <
s->nb_block_sizes;
i++) {
97 0, 1 << (
s->frame_len_bits -
i), &
scale, 0);
100 }
101
107
108 return 0;
109 }
110
112 {
116 int window_index =
s->frame_len_bits -
s->block_len_bits;
118 av_tx_fn mdct_fn =
s->mdct_fn[window_index];
119 int ch;
120 const float *
win =
s->windows[window_index];
121 int window_len = 1 <<
s->block_len_bits;
122 float n = 2.0 * 32768.0 / window_len;
123
125 memcpy(
s->output,
s->frame_out[ch], window_len *
sizeof(*
s->output));
126 s->fdsp->vector_fmul_scalar(
s->frame_out[ch], audio[ch], n,
len);
127 s->fdsp->vector_fmul_reverse(&
s->output[window_len],
s->frame_out[ch],
129 s->fdsp->vector_fmul(
s->frame_out[ch],
s->frame_out[ch],
win,
len);
130 mdct_fn(mdct,
s->coefs[ch],
s->output,
sizeof(
float));
134 }
135 }
136
137 return 0;
138 }
139
140 // FIXME use for decoding too
142 {
143 int n;
144 const uint16_t *ptr;
145 float v, *q, max_scale, *q_end;
146
147 ptr =
s->exponent_bands[
s->frame_len_bits -
s->block_len_bits];
148 q =
s->exponents[ch];
149 q_end = q +
s->block_len;
150 max_scale = 0;
151 while (q < q_end) {
152 /* XXX: use a table */
153 v =
ff_exp10(*exp_param++ *(1.0 / 16.0));
154 max_scale =
FFMAX(max_scale, v);
155 n = *ptr++;
156 do {
157 *q++ = v;
158 } while (--n);
159 }
160 s->max_exponent[ch] = max_scale;
161 }
162
164 {
165 int last_exp;
166 const uint16_t *ptr;
167 float *q, *q_end;
168
169 ptr =
s->exponent_bands[
s->frame_len_bits -
s->block_len_bits];
170 q =
s->exponents[ch];
171 q_end = q +
s->block_len;
172 if (
s->version == 1) {
173 last_exp = *exp_param++;
174 av_assert0(last_exp - 10 >= 0 && last_exp - 10 < 32);
176 q += *ptr++;
177 } else
178 last_exp = 36;
179 while (q < q_end) {
180 int exp = *exp_param++;
181 int code =
exp - last_exp + 60;
185 /* XXX: use a table */
186 q += *ptr++;
188 }
189 }
190
192 int total_gain)
193 {
194 int channels =
s->avctx->ch_layout.nb_channels;
196 float mdct_norm;
199 20, 20, 20, 20, 20,
200 20, 20, 20, 20, 20,
201 20, 20, 20, 20, 20,
202 20, 20, 20, 20, 20,
203 20, 20, 20, 20, 20
204 };
205
206 // FIXME remove duplication relative to decoder
207 if (
s->use_variable_block_len) {
209 } else {
210 /* fixed block len */
211 s->next_block_len_bits =
s->frame_len_bits;
212 s->prev_block_len_bits =
s->frame_len_bits;
213 s->block_len_bits =
s->frame_len_bits;
214 }
215
216 s->block_len = 1 <<
s->block_len_bits;
217 // av_assert0((s->block_pos + s->block_len) <= s->frame_len);
218 bsize =
s->frame_len_bits -
s->block_len_bits;
219
220 // FIXME factor
221 v =
s->coefs_end[bsize] -
s->coefs_start;
224 {
225 int n4 =
s->block_len / 2;
226 mdct_norm = 1.0 / (
float) n4;
228 mdct_norm *= sqrt(n4);
229 }
230
233
235 // FIXME only set channel_coded when needed, instead of always
236 s->channel_coded[ch] = 1;
237 if (
s->channel_coded[ch])
239 }
240
242 if (
s->channel_coded[ch]) {
244 float *coefs, *exponents,
mult;
246
247 coefs1 =
s->coefs1[ch];
248 exponents =
s->exponents[ch];
251 coefs = src_coefs[ch];
252 if (
s->use_noise_coding && 0) {
254 } else {
255 coefs +=
s->coefs_start;
257 for (
i = 0;
i < n;
i++) {
258 double t = *coefs++ / (exponents[
i] *
mult);
259 if (t < -32768 || t > 32767)
260 return -1;
261
263 }
264 }
265 }
266 }
267
268 v = 0;
270 int a =
s->channel_coded[ch];
273 }
274
275 if (!v)
276 return 1;
277
278 for (v = total_gain - 1; v >= 127; v -= 127)
281
283
284 if (
s->use_noise_coding) {
286 if (
s->channel_coded[ch]) {
288 n =
s->exponent_high_sizes[bsize];
289 for (
i = 0;
i < n;
i++) {
290 put_bits(&
s->pb, 1,
s->high_band_coded[ch][
i] = 0);
291 if (0)
292 nb_coefs[ch] -=
s->exponent_high_bands[bsize][
i];
293 }
294 }
295 }
296 }
297
299 if (
s->block_len_bits !=
s->frame_len_bits)
301
304 if (
s->channel_coded[ch]) {
305 if (
s->use_exp_vlc) {
307 } else {
309 // encode_exp_lsp(s, ch);
310 }
311 }
312 }
313 } else
315
317 if (
s->channel_coded[ch]) {
320 tindex = (ch == 1 &&
s->ms_stereo);
321 ptr = &
s->coefs1[ch][0];
323
325 for (; ptr < eptr; ptr++) {
326 if (*ptr) {
330 if (abs_level <= s->
coef_vlcs[tindex]->max_level)
331 if (run < s->
coef_vlcs[tindex]->levels[abs_level - 1])
332 code =
run +
s->int_table[tindex][abs_level - 1];
333
336 s->coef_vlcs[tindex]->huffcodes[
code]);
337
339 if (1 << coef_nb_bits <= abs_level)
340 return -1;
341
342 put_bits(&
s->pb, coef_nb_bits, abs_level);
344 }
345 // FIXME the sign is flipped somewhere
348 } else
350 }
352 put_bits(&
s->pb,
s->coef_vlcs[tindex]->huffbits[1],
353 s->coef_vlcs[tindex]->huffcodes[1]);
354 }
357 }
358 return 0;
359 }
360
362 uint8_t *buf, int buf_size, int total_gain)
363 {
365
366 if (
s->use_bit_reservoir)
369 return INT_MAX;
370
372
374 }
375
378 {
381
382 s->block_len_bits =
s->frame_len_bits;
// required by non variable block len
383 s->block_len = 1 <<
s->block_len_bits;
384
386
389
393
394 for (
i = 0;
i <
s->block_len;
i++) {
395 a =
s->coefs[0][
i] * 0.5;
396 b =
s->coefs[1][
i] * 0.5;
397 s->coefs[0][
i] =
a +
b;
398 s->coefs[1][
i] =
a -
b;
399 }
400 }
401
404
405 total_gain = 128;
406 for (
i = 64;
i;
i >>= 1) {
411 }
412
413 while(total_gain <= 128 && error > 0)
416 av_log(avctx,
AV_LOG_ERROR,
"Invalid input data or requested bitrate too low, cannot encode\n");
419 }
425
428
431
433 *got_packet_ptr = 1;
434 return 0;
435 }
436
437 #if CONFIG_WMAV1_ENCODER
451 };
452 #endif
453 #if CONFIG_WMAV2_ENCODER
467 };
468 #endif