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
23
28
29
31 {
33 int i, flags1, flags2, block_align;
35
37
40 "too many channels: got %i, need %i or fewer\n",
43 }
44
49 }
50
53 "bitrate too low: got %i, need 24000 or higher\n",
56 }
57
58 /* extract flag infos */
59 flags1 = 0;
60 flags2 = 1;
63 if (!extradata)
70 if (!extradata)
75 } else {
77 }
84
86
87 /* init MDCT */
90
96
97 return 0;
98 }
99
101 {
107 int ch;
108 const float *win = s->
windows[window_index];
110 float n = 2.0 * 32768.0 / window_len;
111
119 }
120 }
121
122 // FIXME use for decoding too
124 {
126 const uint16_t *ptr;
127 float v, *q, max_scale, *q_end;
128
132 max_scale = 0;
133 while (q < q_end) {
134 /* XXX: use a table */
135 v = pow(10, *exp_param++ *(1.0 / 16.0));
136 max_scale =
FFMAX(max_scale, v);
137 n = *ptr++;
138 do {
140 } while (--n);
141 }
143 }
144
146 {
147 int last_exp;
148 const uint16_t *ptr;
149 float *q, *q_end;
150
155 last_exp = *exp_param++;
156 av_assert0(last_exp - 10 >= 0 && last_exp - 10 < 32);
158 q += *ptr++;
159 } else
160 last_exp = 36;
161 while (q < q_end) {
162 int exp = *exp_param++;
163 int code = exp - last_exp + 60;
167 /* XXX: use a table */
168 q += *ptr++;
169 last_exp = exp;
170 }
171 }
172
174 int total_gain)
175 {
176 int v, bsize, ch, coef_nb_bits, parse_exponents;
177 float mdct_norm;
179 static const int fixed_exp[25] = {
180 20, 20, 20, 20, 20,
181 20, 20, 20, 20, 20,
182 20, 20, 20, 20, 20,
183 20, 20, 20, 20, 20,
184 20, 20, 20, 20, 20
185 };
186
187 // FIXME remove duplication relative to decoder
190 } else {
191 /* fixed block len */
195 }
196
198 // av_assert0((s->block_pos + s->block_len) <= s->frame_len);
200
201 // FIXME factor
204 nb_coefs[ch] = v;
205 {
207 mdct_norm = 1.0 / (float) n4;
209 mdct_norm *= sqrt(n4);
210 }
211
214
216 // FIXME only set channel_coded when needed, instead of always
220 }
221
225 float *coefs, *exponents,
mult;
227
230 mult = pow(10, total_gain * 0.05) / s->
max_exponent[ch];
231 mult *= mdct_norm;
232 coefs = src_coefs[ch];
235 } else {
237 n = nb_coefs[ch];
238 for (i = 0; i <
n; i++) {
239 double t = *coefs++ / (exponents[i] *
mult);
240 if (t < -32768 || t > 32767)
241 return -1;
242
243 coefs1[i] =
lrint(t);
244 }
245 }
246 }
247 }
248
249 v = 0;
254 }
255
256 if (!v)
257 return 1;
258
259 for (v = total_gain - 1; v >= 127; v -= 127)
262
264
270 for (i = 0; i <
n; i++) {
272 if (0)
274 }
275 }
276 }
277 }
278
279 parse_exponents = 1;
282
283 if (parse_exponents) {
288 } else {
290 // encode_exp_lsp(s, ch);
291 }
292 }
293 }
294 } else
296
303 eptr = ptr + nb_coefs[ch];
304
305 run = 0;
306 for (; ptr < eptr; ptr++) {
307 if (*ptr) {
309 int abs_level =
FFABS(level);
310 int code = 0;
311 if (abs_level <= s->
coef_vlcs[tindex]->max_level)
312 if (run < s->
coef_vlcs[tindex]->levels[abs_level - 1])
313 code = run + s->
int_table[tindex][abs_level - 1];
314
318
319 if (code == 0) {
320 if (1 << coef_nb_bits <= abs_level)
321 return -1;
322
325 }
326 // FIXME the sign is flipped somewhere
328 run = 0;
329 } else
330 run++;
331 }
332 if (run)
335 }
338 }
339 return 0;
340 }
341
344 {
346
350 return INT_MAX;
351
353
355 }
356
359 {
361 int i, total_gain,
ret, error;
362
365
367
370 int i;
371
373 a = s->
coefs[0][i] * 0.5;
374 b = s->
coefs[1][i] * 0.5;
377 }
378 }
379
382
383 total_gain = 128;
384 for (i = 64; i; i >>= 1) {
386 total_gain - i);
387 if (error <= 0)
388 total_gain -= i;
389 }
390
391 while(total_gain <= 128 && error > 0)
393 if (error > 0) {
394 av_log(avctx,
AV_LOG_ERROR,
"Invalid input data or requested bitrate too low, cannot encode\n");
397 }
401 while(i--)
403
406
409
411 *got_packet_ptr = 1;
412 return 0;
413 }
414
415 #if CONFIG_WMAV1_ENCODER
427 };
428 #endif
429 #if CONFIG_WMAV2_ENCODER
441 };
442 #endif