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
33
34
36 {
38 int i, flags1, flags2, block_align;
39 uint8_t *extradata;
41
43
46 "too many channels: got %i, need %i or fewer\n",
49 }
50
55 }
56
59 "bitrate too low: got %"PRId64", need 24000 or higher\n",
62 }
63
64 /* extract flag info */
65 flags1 = 0;
66 flags2 = 1;
69 if (!extradata)
76 if (!extradata)
81 } else {
83 }
85 s->use_exp_vlc = flags2 & 0x0001;
86 s->use_bit_reservoir = flags2 & 0x0002;
87 s->use_variable_block_len = flags2 & 0x0004;
90
93
94 /* init MDCT */
95 for (
i = 0;
i <
s->nb_block_sizes;
i++) {
99 }
100
101 block_align = avctx->
bit_rate * (int64_t)
s->frame_len /
106
107 return 0;
108 }
109
111 {
113 float **audio = (
float **)
frame->extended_data;
115 int window_index =
s->frame_len_bits -
s->block_len_bits;
117 int ch;
118 const float *
win =
s->windows[window_index];
119 int window_len = 1 <<
s->block_len_bits;
120 float n = 2.0 * 32768.0 / window_len;
121
123 memcpy(
s->output,
s->frame_out[ch], window_len *
sizeof(*
s->output));
124 s->fdsp->vector_fmul_scalar(
s->frame_out[ch], audio[ch], n,
len);
125 s->fdsp->vector_fmul_reverse(&
s->output[window_len],
s->frame_out[ch],
127 s->fdsp->vector_fmul(
s->frame_out[ch],
s->frame_out[ch],
win,
len);
128 mdct->mdct_calc(mdct,
s->coefs[ch],
s->output);
132 }
133 }
134
135 return 0;
136 }
137
138 // FIXME use for decoding too
140 {
141 int n;
142 const uint16_t *ptr;
143 float v, *q, max_scale, *q_end;
144
145 ptr =
s->exponent_bands[
s->frame_len_bits -
s->block_len_bits];
146 q =
s->exponents[ch];
147 q_end = q +
s->block_len;
148 max_scale = 0;
149 while (q < q_end) {
150 /* XXX: use a table */
151 v =
ff_exp10(*exp_param++ *(1.0 / 16.0));
152 max_scale =
FFMAX(max_scale, v);
153 n = *ptr++;
154 do {
155 *q++ = v;
156 } while (--n);
157 }
158 s->max_exponent[ch] = max_scale;
159 }
160
162 {
163 int last_exp;
164 const uint16_t *ptr;
165 float *q, *q_end;
166
167 ptr =
s->exponent_bands[
s->frame_len_bits -
s->block_len_bits];
168 q =
s->exponents[ch];
169 q_end = q +
s->block_len;
170 if (
s->version == 1) {
171 last_exp = *exp_param++;
172 av_assert0(last_exp - 10 >= 0 && last_exp - 10 < 32);
174 q += *ptr++;
175 } else
176 last_exp = 36;
177 while (q < q_end) {
178 int exp = *exp_param++;
179 int code =
exp - last_exp + 60;
183 /* XXX: use a table */
184 q += *ptr++;
186 }
187 }
188
190 int total_gain)
191 {
192 int channels =
s->avctx->ch_layout.nb_channels;
194 float mdct_norm;
197 20, 20, 20, 20, 20,
198 20, 20, 20, 20, 20,
199 20, 20, 20, 20, 20,
200 20, 20, 20, 20, 20,
201 20, 20, 20, 20, 20
202 };
203
204 // FIXME remove duplication relative to decoder
205 if (
s->use_variable_block_len) {
207 } else {
208 /* fixed block len */
209 s->next_block_len_bits =
s->frame_len_bits;
210 s->prev_block_len_bits =
s->frame_len_bits;
211 s->block_len_bits =
s->frame_len_bits;
212 }
213
214 s->block_len = 1 <<
s->block_len_bits;
215 // av_assert0((s->block_pos + s->block_len) <= s->frame_len);
216 bsize =
s->frame_len_bits -
s->block_len_bits;
217
218 // FIXME factor
219 v =
s->coefs_end[bsize] -
s->coefs_start;
222 {
223 int n4 =
s->block_len / 2;
224 mdct_norm = 1.0 / (
float) n4;
226 mdct_norm *= sqrt(n4);
227 }
228
231
233 // FIXME only set channel_coded when needed, instead of always
234 s->channel_coded[ch] = 1;
235 if (
s->channel_coded[ch])
237 }
238
240 if (
s->channel_coded[ch]) {
242 float *coefs, *exponents,
mult;
244
245 coefs1 =
s->coefs1[ch];
246 exponents =
s->exponents[ch];
249 coefs = src_coefs[ch];
250 if (
s->use_noise_coding && 0) {
252 } else {
253 coefs +=
s->coefs_start;
255 for (
i = 0;
i < n;
i++) {
256 double t = *coefs++ / (exponents[
i] *
mult);
257 if (t < -32768 || t > 32767)
258 return -1;
259
261 }
262 }
263 }
264 }
265
266 v = 0;
268 int a =
s->channel_coded[ch];
271 }
272
273 if (!v)
274 return 1;
275
276 for (v = total_gain - 1; v >= 127; v -= 127)
279
281
282 if (
s->use_noise_coding) {
284 if (
s->channel_coded[ch]) {
286 n =
s->exponent_high_sizes[bsize];
287 for (
i = 0;
i < n;
i++) {
288 put_bits(&
s->pb, 1,
s->high_band_coded[ch][
i] = 0);
289 if (0)
290 nb_coefs[ch] -=
s->exponent_high_bands[bsize][
i];
291 }
292 }
293 }
294 }
295
297 if (
s->block_len_bits !=
s->frame_len_bits)
299
302 if (
s->channel_coded[ch]) {
303 if (
s->use_exp_vlc) {
305 } else {
307 // encode_exp_lsp(s, ch);
308 }
309 }
310 }
311 } else
313
315 if (
s->channel_coded[ch]) {
318 tindex = (ch == 1 &&
s->ms_stereo);
319 ptr = &
s->coefs1[ch][0];
321
323 for (; ptr < eptr; ptr++) {
324 if (*ptr) {
328 if (abs_level <= s->
coef_vlcs[tindex]->max_level)
329 if (run < s->
coef_vlcs[tindex]->levels[abs_level - 1])
330 code =
run +
s->int_table[tindex][abs_level - 1];
331
334 s->coef_vlcs[tindex]->huffcodes[
code]);
335
337 if (1 << coef_nb_bits <= abs_level)
338 return -1;
339
340 put_bits(&
s->pb, coef_nb_bits, abs_level);
342 }
343 // FIXME the sign is flipped somewhere
346 } else
348 }
350 put_bits(&
s->pb,
s->coef_vlcs[tindex]->huffbits[1],
351 s->coef_vlcs[tindex]->huffcodes[1]);
352 }
355 }
356 return 0;
357 }
358
360 uint8_t *buf, int buf_size, int total_gain)
361 {
363
364 if (
s->use_bit_reservoir)
367 return INT_MAX;
368
370
372 }
373
376 {
379
380 s->block_len_bits =
s->frame_len_bits;
// required by non variable block len
381 s->block_len = 1 <<
s->block_len_bits;
382
384
387
391
392 for (
i = 0;
i <
s->block_len;
i++) {
393 a =
s->coefs[0][
i] * 0.5;
394 b =
s->coefs[1][
i] * 0.5;
395 s->coefs[0][
i] =
a +
b;
396 s->coefs[1][
i] =
a -
b;
397 }
398 }
399
402
403 total_gain = 128;
404 for (
i = 64;
i;
i >>= 1) {
409 }
410
411 while(total_gain <= 128 && error > 0)
414 av_log(avctx,
AV_LOG_ERROR,
"Invalid input data or requested bitrate too low, cannot encode\n");
417 }
423
426
429
431 *got_packet_ptr = 1;
432 return 0;
433 }
434
435 #if CONFIG_WMAV1_ENCODER
448 };
449 #endif
450 #if CONFIG_WMAV2_ENCODER
463 };
464 #endif