FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/wmaenc.c
Date: 2026-08-19 01:31:13
Exec Total Coverage
Lines: 208 238 87.4%
Functions: 7 7 100.0%
Branches: 103 144 71.5%

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