FFmpeg coverage


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