FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/wmaenc.c
Date: 2021-09-26 18:22:30
Exec Total Coverage
Lines: 204 235 86.8%
Branches: 99 144 68.8%

Line Branch Exec Source
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 "libavutil/attributes.h"
23 #include "libavutil/ffmath.h"
24
25 #include "avcodec.h"
26 #include "encode.h"
27 #include "internal.h"
28 #include "wma.h"
29 #include "libavutil/avassert.h"
30
31
32 2 static av_cold int encode_init(AVCodecContext *avctx)
33 {
34 2 WMACodecContext *s = avctx->priv_data;
35 int i, flags1, flags2, block_align;
36 uint8_t *extradata;
37 int ret;
38
39 2 s->avctx = avctx;
40
41
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (avctx->channels > MAX_CHANNELS) {
42 av_log(avctx, AV_LOG_ERROR,
43 "too many channels: got %i, need %i or fewer\n",
44 avctx->channels, MAX_CHANNELS);
45 return AVERROR(EINVAL);
46 }
47
48
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (avctx->sample_rate > 48000) {
49 av_log(avctx, AV_LOG_ERROR, "sample rate is too high: %d > 48kHz\n",
50 avctx->sample_rate);
51 return AVERROR(EINVAL);
52 }
53
54
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (avctx->bit_rate < 24 * 1000) {
55 av_log(avctx, AV_LOG_ERROR,
56 "bitrate too low: got %"PRId64", need 24000 or higher\n",
57 avctx->bit_rate);
58 return AVERROR(EINVAL);
59 }
60
61 /* extract flag info */
62 2 flags1 = 0;
63 2 flags2 = 1;
64
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
2 if (avctx->codec->id == AV_CODEC_ID_WMAV1) {
65 1 extradata = av_malloc(4);
66
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (!extradata)
67 return AVERROR(ENOMEM);
68 1 avctx->extradata_size = 4;
69 1 AV_WL16(extradata, flags1);
70 1 AV_WL16(extradata + 2, flags2);
71
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 } else if (avctx->codec->id == AV_CODEC_ID_WMAV2) {
72 1 extradata = av_mallocz(10);
73
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (!extradata)
74 return AVERROR(ENOMEM);
75 1 avctx->extradata_size = 10;
76 1 AV_WL32(extradata, flags1);
77 1 AV_WL16(extradata + 4, flags2);
78 } else {
79 av_assert0(0);
80 }
81 2 avctx->extradata = extradata;
82 2 s->use_exp_vlc = flags2 & 0x0001;
83 2 s->use_bit_reservoir = flags2 & 0x0002;
84 2 s->use_variable_block_len = flags2 & 0x0004;
85
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if (avctx->channels == 2)
86 2 s->ms_stereo = 1;
87
88
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
2 if ((ret = ff_wma_init(avctx, flags2)) < 0)
89 return ret;
90
91 /* init MDCT */
92
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
4 for (i = 0; i < s->nb_block_sizes; i++) {
93 2 ret = ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 0, 1.0);
94
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (ret < 0)
95 return ret;
96 }
97
98 2 block_align = avctx->bit_rate * (int64_t) s->frame_len /
99 2 (avctx->sample_rate * 8);
100 2 block_align = FFMIN(block_align, MAX_CODED_SUPERFRAME_SIZE);
101 2 avctx->block_align = block_align;
102 2 avctx->frame_size = avctx->initial_padding = s->frame_len;
103
104 2 return 0;
105 }
106
107 410 static int apply_window_and_mdct(AVCodecContext *avctx, const AVFrame *frame)
108 {
109 410 WMACodecContext *s = avctx->priv_data;
110 410 float **audio = (float **) frame->extended_data;
111 410 int len = frame->nb_samples;
112 410 int window_index = s->frame_len_bits - s->block_len_bits;
113 410 FFTContext *mdct = &s->mdct_ctx[window_index];
114 int ch;
115 410 const float *win = s->windows[window_index];
116 410 int window_len = 1 << s->block_len_bits;
117 410 float n = 2.0 * 32768.0 / window_len;
118
119
2/2
✓ Branch 0 taken 820 times.
✓ Branch 1 taken 410 times.
1230 for (ch = 0; ch < avctx->channels; ch++) {
120 820 memcpy(s->output, s->frame_out[ch], window_len * sizeof(*s->output));
121 820 s->fdsp->vector_fmul_scalar(s->frame_out[ch], audio[ch], n, len);
122 820 s->fdsp->vector_fmul_reverse(&s->output[window_len], s->frame_out[ch],
123 win, len);
124 820 s->fdsp->vector_fmul(s->frame_out[ch], s->frame_out[ch], win, len);
125 820 mdct->mdct_calc(mdct, s->coefs[ch], s->output);
126
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 820 times.
820 if (!isfinite(s->coefs[ch][0])) {
127 av_log(avctx, AV_LOG_ERROR, "Input contains NaN/+-Inf\n");
128 return AVERROR(EINVAL);
129 }
130 }
131
132 410 return 0;
133 }
134
135 // FIXME use for decoding too
136 6128 static void init_exp(WMACodecContext *s, int ch, const int *exp_param)
137 {
138 int n;
139 const uint16_t *ptr;
140 float v, *q, max_scale, *q_end;
141
142 6128 ptr = s->exponent_bands[s->frame_len_bits - s->block_len_bits];
143 6128 q = s->exponents[ch];
144 6128 q_end = q + s->block_len;
145 6128 max_scale = 0;
146
2/2
✓ Branch 0 taken 153200 times.
✓ Branch 1 taken 6128 times.
159328 while (q < q_end) {
147 /* XXX: use a table */
148 153200 v = ff_exp10(*exp_param++ *(1.0 / 16.0));
149
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 153200 times.
153200 max_scale = FFMAX(max_scale, v);
150 153200 n = *ptr++;
151 do {
152 12550144 *q++ = v;
153
2/2
✓ Branch 0 taken 12396944 times.
✓ Branch 1 taken 153200 times.
12550144 } while (--n);
154 }
155 6128 s->max_exponent[ch] = max_scale;
156 6128 }
157
158 6128 static void encode_exp_vlc(WMACodecContext *s, int ch, const int *exp_param)
159 {
160 int last_exp;
161 const uint16_t *ptr;
162 float *q, *q_end;
163
164 6128 ptr = s->exponent_bands[s->frame_len_bits - s->block_len_bits];
165 6128 q = s->exponents[ch];
166 6128 q_end = q + s->block_len;
167
2/2
✓ Branch 0 taken 3064 times.
✓ Branch 1 taken 3064 times.
6128 if (s->version == 1) {
168 3064 last_exp = *exp_param++;
169
2/4
✓ Branch 0 taken 3064 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3064 times.
3064 av_assert0(last_exp - 10 >= 0 && last_exp - 10 < 32);
170 3064 put_bits(&s->pb, 5, last_exp - 10);
171 3064 q += *ptr++;
172 } else
173 3064 last_exp = 36;
174
2/2
✓ Branch 0 taken 150136 times.
✓ Branch 1 taken 6128 times.
156264 while (q < q_end) {
175 150136 int exp = *exp_param++;
176 150136 int code = exp - last_exp + 60;
177 av_assert1(code >= 0 && code < 120);
178 150136 put_bits(&s->pb, ff_aac_scalefactor_bits[code],
179 150136 ff_aac_scalefactor_code[code]);
180 /* XXX: use a table */
181 150136 q += *ptr++;
182 150136 last_exp = exp;
183 }
184 6128 }
185
186 3064 static int encode_block(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE],
187 int total_gain)
188 {
189 int v, bsize, ch, coef_nb_bits, parse_exponents;
190 float mdct_norm;
191 int nb_coefs[MAX_CHANNELS];
192 static const int fixed_exp[25] = {
193 20, 20, 20, 20, 20,
194 20, 20, 20, 20, 20,
195 20, 20, 20, 20, 20,
196 20, 20, 20, 20, 20,
197 20, 20, 20, 20, 20
198 };
199
200 // FIXME remove duplication relative to decoder
201
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3064 times.
3064 if (s->use_variable_block_len) {
202 av_assert0(0); // FIXME not implemented
203 } else {
204 /* fixed block len */
205 3064 s->next_block_len_bits = s->frame_len_bits;
206 3064 s->prev_block_len_bits = s->frame_len_bits;
207 3064 s->block_len_bits = s->frame_len_bits;
208 }
209
210 3064 s->block_len = 1 << s->block_len_bits;
211 // av_assert0((s->block_pos + s->block_len) <= s->frame_len);
212 3064 bsize = s->frame_len_bits - s->block_len_bits;
213
214 // FIXME factor
215 3064 v = s->coefs_end[bsize] - s->coefs_start;
216
2/2
✓ Branch 0 taken 6128 times.
✓ Branch 1 taken 3064 times.
9192 for (ch = 0; ch < s->avctx->channels; ch++)
217 6128 nb_coefs[ch] = v;
218 {
219 3064 int n4 = s->block_len / 2;
220 3064 mdct_norm = 1.0 / (float) n4;
221
2/2
✓ Branch 0 taken 1532 times.
✓ Branch 1 taken 1532 times.
3064 if (s->version == 1)
222 1532 mdct_norm *= sqrt(n4);
223 }
224
225
1/2
✓ Branch 0 taken 3064 times.
✗ Branch 1 not taken.
3064 if (s->avctx->channels == 2)
226 3064 put_bits(&s->pb, 1, !!s->ms_stereo);
227
228
2/2
✓ Branch 0 taken 6128 times.
✓ Branch 1 taken 3064 times.
9192 for (ch = 0; ch < s->avctx->channels; ch++) {
229 // FIXME only set channel_coded when needed, instead of always
230 6128 s->channel_coded[ch] = 1;
231
1/2
✓ Branch 0 taken 6128 times.
✗ Branch 1 not taken.
6128 if (s->channel_coded[ch])
232 6128 init_exp(s, ch, fixed_exp);
233 }
234
235
2/2
✓ Branch 0 taken 6128 times.
✓ Branch 1 taken 3064 times.
9192 for (ch = 0; ch < s->avctx->channels; ch++) {
236
1/2
✓ Branch 0 taken 6128 times.
✗ Branch 1 not taken.
6128 if (s->channel_coded[ch]) {
237 WMACoef *coefs1;
238 float *coefs, *exponents, mult;
239 int i, n;
240
241 6128 coefs1 = s->coefs1[ch];
242 6128 exponents = s->exponents[ch];
243 6128 mult = ff_exp10(total_gain * 0.05) / s->max_exponent[ch];
244 6128 mult *= mdct_norm;
245 6128 coefs = src_coefs[ch];
246 if (s->use_noise_coding && 0) {
247 av_assert0(0); // FIXME not implemented
248 } else {
249 6128 coefs += s->coefs_start;
250 6128 n = nb_coefs[ch];
251
2/2
✓ Branch 0 taken 11413400 times.
✓ Branch 1 taken 6128 times.
11419528 for (i = 0; i < n; i++) {
252 11413400 double t = *coefs++ / (exponents[i] * mult);
253
2/4
✓ Branch 0 taken 11413400 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 11413400 times.
11413400 if (t < -32768 || t > 32767)
254 return -1;
255
256 11413400 coefs1[i] = lrint(t);
257 }
258 }
259 }
260 }
261
262 3064 v = 0;
263
2/2
✓ Branch 0 taken 6128 times.
✓ Branch 1 taken 3064 times.
9192 for (ch = 0; ch < s->avctx->channels; ch++) {
264 6128 int a = s->channel_coded[ch];
265 6128 put_bits(&s->pb, 1, a);
266 6128 v |= a;
267 }
268
269
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3064 times.
3064 if (!v)
270 return 1;
271
272
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3064 times.
3064 for (v = total_gain - 1; v >= 127; v -= 127)
273 put_bits(&s->pb, 7, 127);
274 3064 put_bits(&s->pb, 7, v);
275
276 3064 coef_nb_bits = ff_wma_total_gain_to_bits(total_gain);
277
278
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3064 times.
3064 if (s->use_noise_coding) {
279 for (ch = 0; ch < s->avctx->channels; ch++) {
280 if (s->channel_coded[ch]) {
281 int i, n;
282 n = s->exponent_high_sizes[bsize];
283 for (i = 0; i < n; i++) {
284 put_bits(&s->pb, 1, s->high_band_coded[ch][i] = 0);
285 if (0)
286 nb_coefs[ch] -= s->exponent_high_bands[bsize][i];
287 }
288 }
289 }
290 }
291
292 3064 parse_exponents = 1;
293
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3064 times.
3064 if (s->block_len_bits != s->frame_len_bits)
294 put_bits(&s->pb, 1, parse_exponents);
295
296
1/2
✓ Branch 0 taken 3064 times.
✗ Branch 1 not taken.
3064 if (parse_exponents) {
297
2/2
✓ Branch 0 taken 6128 times.
✓ Branch 1 taken 3064 times.
9192 for (ch = 0; ch < s->avctx->channels; ch++) {
298
1/2
✓ Branch 0 taken 6128 times.
✗ Branch 1 not taken.
6128 if (s->channel_coded[ch]) {
299
1/2
✓ Branch 0 taken 6128 times.
✗ Branch 1 not taken.
6128 if (s->use_exp_vlc) {
300 6128 encode_exp_vlc(s, ch, fixed_exp);
301 } else {
302 av_assert0(0); // FIXME not implemented
303 // encode_exp_lsp(s, ch);
304 }
305 }
306 }
307 } else
308 av_assert0(0); // FIXME not implemented
309
310
2/2
✓ Branch 0 taken 5755 times.
✓ Branch 1 taken 2680 times.
8435 for (ch = 0; ch < s->avctx->channels; ch++) {
311
1/2
✓ Branch 0 taken 5755 times.
✗ Branch 1 not taken.
5755 if (s->channel_coded[ch]) {
312 int run, tindex;
313 WMACoef *ptr, *eptr;
314
3/4
✓ Branch 0 taken 2691 times.
✓ Branch 1 taken 3064 times.
✓ Branch 2 taken 2691 times.
✗ Branch 3 not taken.
5755 tindex = (ch == 1 && s->ms_stereo);
315 5755 ptr = &s->coefs1[ch][0];
316 5755 eptr = ptr + nb_coefs[ch];
317
318 5755 run = 0;
319
2/2
✓ Branch 0 taken 10007446 times.
✓ Branch 1 taken 5371 times.
10012817 for (; ptr < eptr; ptr++) {
320
2/2
✓ Branch 0 taken 2918406 times.
✓ Branch 1 taken 7089040 times.
10007446 if (*ptr) {
321 2918406 int level = *ptr;
322 2918406 int abs_level = FFABS(level);
323 2918406 int code = 0;
324
2/2
✓ Branch 0 taken 2889049 times.
✓ Branch 1 taken 29357 times.
2918406 if (abs_level <= s->coef_vlcs[tindex]->max_level)
325
2/2
✓ Branch 0 taken 2884295 times.
✓ Branch 1 taken 4754 times.
2889049 if (run < s->coef_vlcs[tindex]->levels[abs_level - 1])
326 2884295 code = run + s->int_table[tindex][abs_level - 1];
327
328 av_assert2(code < s->coef_vlcs[tindex]->n);
329 2918406 put_bits(&s->pb, s->coef_vlcs[tindex]->huffbits[code],
330 2918406 s->coef_vlcs[tindex]->huffcodes[code]);
331
332
2/2
✓ Branch 0 taken 34111 times.
✓ Branch 1 taken 2884295 times.
2918406 if (code == 0) {
333
2/2
✓ Branch 0 taken 384 times.
✓ Branch 1 taken 33727 times.
34111 if (1 << coef_nb_bits <= abs_level)
334 384 return -1;
335
336 33727 put_bits(&s->pb, coef_nb_bits, abs_level);
337 33727 put_bits(&s->pb, s->frame_len_bits, run);
338 }
339 // FIXME the sign is flipped somewhere
340 2918022 put_bits(&s->pb, 1, level < 0);
341 2918022 run = 0;
342 } else
343 7089040 run++;
344 }
345
2/2
✓ Branch 0 taken 5152 times.
✓ Branch 1 taken 219 times.
5371 if (run)
346 5152 put_bits(&s->pb, s->coef_vlcs[tindex]->huffbits[1],
347 5152 s->coef_vlcs[tindex]->huffcodes[1]);
348 }
349
3/4
✓ Branch 0 taken 2803 times.
✓ Branch 1 taken 2568 times.
✓ Branch 2 taken 2803 times.
✗ Branch 3 not taken.
5371 if (s->version == 1 && s->avctx->channels >= 2)
350 2803 align_put_bits(&s->pb);
351 }
352 2680 return 0;
353 }
354
355 3064 static int encode_frame(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE],
356 uint8_t *buf, int buf_size, int total_gain)
357 {
358 3064 init_put_bits(&s->pb, buf, buf_size);
359
360
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3064 times.
3064 if (s->use_bit_reservoir)
361 av_assert0(0); // FIXME not implemented
362
2/2
✓ Branch 1 taken 384 times.
✓ Branch 2 taken 2680 times.
3064 else if (encode_block(s, src_coefs, total_gain) < 0)
363 384 return INT_MAX;
364
365 2680 align_put_bits(&s->pb);
366
367 2680 return put_bits_count(&s->pb) / 8 - s->avctx->block_align;
368 }
369
370 410 static int encode_superframe(AVCodecContext *avctx, AVPacket *avpkt,
371 const AVFrame *frame, int *got_packet_ptr)
372 {
373 410 WMACodecContext *s = avctx->priv_data;
374 int i, total_gain, ret, error;
375
376 410 s->block_len_bits = s->frame_len_bits; // required by non variable block len
377 410 s->block_len = 1 << s->block_len_bits;
378
379 410 ret = apply_window_and_mdct(avctx, frame);
380
381
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 410 times.
410 if (ret < 0)
382 return ret;
383
384
1/2
✓ Branch 0 taken 410 times.
✗ Branch 1 not taken.
410 if (s->ms_stereo) {
385 float a, b;
386 int i;
387
388
2/2
✓ Branch 0 taken 839680 times.
✓ Branch 1 taken 410 times.
840090 for (i = 0; i < s->block_len; i++) {
389 839680 a = s->coefs[0][i] * 0.5;
390 839680 b = s->coefs[1][i] * 0.5;
391 839680 s->coefs[0][i] = a + b;
392 839680 s->coefs[1][i] = a - b;
393 }
394 }
395
396
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 410 times.
410 if ((ret = ff_alloc_packet(avctx, avpkt, 2 * MAX_CODED_SUPERFRAME_SIZE)) < 0)
397 return ret;
398
399 410 total_gain = 128;
400
2/2
✓ Branch 0 taken 2870 times.
✓ Branch 1 taken 410 times.
3280 for (i = 64; i; i >>= 1) {
401 2870 error = encode_frame(s, s->coefs, avpkt->data, avpkt->size,
402 total_gain - i);
403
2/2
✓ Branch 0 taken 1331 times.
✓ Branch 1 taken 1539 times.
2870 if (error <= 0)
404 1331 total_gain -= i;
405 }
406
407
3/4
✓ Branch 0 taken 604 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 194 times.
✓ Branch 3 taken 410 times.
604 while(total_gain <= 128 && error > 0)
408 194 error = encode_frame(s, s->coefs, avpkt->data, avpkt->size, total_gain++);
409
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 410 times.
410 if (error > 0) {
410 av_log(avctx, AV_LOG_ERROR, "Invalid input data or requested bitrate too low, cannot encode\n");
411 avpkt->size = 0;
412 return AVERROR(EINVAL);
413 }
414
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 410 times.
410 av_assert0((put_bits_count(&s->pb) & 7) == 0);
415 410 i = avctx->block_align - put_bytes_count(&s->pb, 0);
416
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 410 times.
410 av_assert0(i>=0);
417
2/2
✓ Branch 0 taken 21750 times.
✓ Branch 1 taken 410 times.
22160 while(i--)
418 21750 put_bits(&s->pb, 8, 'N');
419
420 410 flush_put_bits(&s->pb);
421
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 410 times.
410 av_assert0(put_bits_ptr(&s->pb) - s->pb.buf == avctx->block_align);
422
423
1/2
✓ Branch 0 taken 410 times.
✗ Branch 1 not taken.
410 if (frame->pts != AV_NOPTS_VALUE)
424 410 avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->initial_padding);
425
426 410 avpkt->size = avctx->block_align;
427 410 *got_packet_ptr = 1;
428 410 return 0;
429 }
430
431 #if CONFIG_WMAV1_ENCODER
432 const AVCodec ff_wmav1_encoder = {
433 .name = "wmav1",
434 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 1"),
435 .type = AVMEDIA_TYPE_AUDIO,
436 .id = AV_CODEC_ID_WMAV1,
437 .priv_data_size = sizeof(WMACodecContext),
438 .init = encode_init,
439 .encode2 = encode_superframe,
440 .close = ff_wma_end,
441 .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
442 AV_SAMPLE_FMT_NONE },
443 .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
444 };
445 #endif
446 #if CONFIG_WMAV2_ENCODER
447 const AVCodec ff_wmav2_encoder = {
448 .name = "wmav2",
449 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"),
450 .type = AVMEDIA_TYPE_AUDIO,
451 .id = AV_CODEC_ID_WMAV2,
452 .priv_data_size = sizeof(WMACodecContext),
453 .init = encode_init,
454 .encode2 = encode_superframe,
455 .close = ff_wma_end,
456 .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
457 AV_SAMPLE_FMT_NONE },
458 .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
459 };
460 #endif
461