FFmpeg
Loading...
Searching...
No Matches
wmaenc.c
Go to the documentation of this file.
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
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
36{
37 WMACodecContext *s = avctx->priv_data;
38 int i, flags1, flags2, block_align;
39 uint8_t *extradata;
40 int ret;
41
42 s->avctx = avctx;
43
44 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",
48 return AVERROR(EINVAL);
49 }
50
51 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 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 flags1 = 0;
66 flags2 = 1;
67 if (avctx->codec->id == AV_CODEC_ID_WMAV1) {
69 if (!extradata)
70 return AVERROR(ENOMEM);
71 avctx->extradata_size = 4;
72 AV_WL16(extradata, flags1);
73 AV_WL16(extradata + 2, flags2);
74 } else if (avctx->codec->id == AV_CODEC_ID_WMAV2) {
76 if (!extradata)
77 return AVERROR(ENOMEM);
78 avctx->extradata_size = 10;
79 AV_WL32(extradata, flags1);
80 AV_WL16(extradata + 4, flags2);
81 } else {
82 av_unreachable("This function is only used with WMAV1/2 encoders");
83 }
84 avctx->extradata = extradata;
85 s->use_exp_vlc = flags2 & 0x0001;
86 s->use_bit_reservoir = flags2 & 0x0002;
87 s->use_variable_block_len = flags2 & 0x0004;
88 if (avctx->ch_layout.nb_channels == 2)
89 s->ms_stereo = 1;
90
91 if ((ret = ff_wma_init(avctx, flags2)) < 0)
92 return ret;
93
94 /* init MDCT */
95 for (i = 0; i < s->nb_block_sizes; i++) {
96 float scale = 1.0f;
97 ret = av_tx_init(&s->mdct_ctx[i], &s->mdct_fn[i], AV_TX_FLOAT_MDCT,
98 0, 1 << (s->frame_len_bits - i), &scale, 0);
99 if (ret < 0)
100 return ret;
101 }
102
103 block_align = avctx->bit_rate * (int64_t) s->frame_len /
104 (avctx->sample_rate * 8);
105 block_align = FFMIN(block_align, MAX_CODED_SUPERFRAME_SIZE);
106 avctx->block_align = block_align;
107 avctx->frame_size = avctx->initial_padding = s->frame_len;
108
109 return 0;
110}
111
113{
114 WMACodecContext *s = avctx->priv_data;
115 const float *const *audio = (const float *const *) frame->extended_data;
116 int len = frame->nb_samples;
117 int window_index = s->frame_len_bits - s->block_len_bits;
118 AVTXContext *mdct = s->mdct_ctx[window_index];
119 av_tx_fn mdct_fn = s->mdct_fn[window_index];
120 int ch;
121 const float *win = s->windows[window_index];
122 int window_len = 1 << s->block_len_bits;
123 float n = 2.0 * 32768.0 / window_len;
124
125 for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++) {
126 memcpy(s->output, s->frame_out[ch], window_len * sizeof(*s->output));
127 s->fdsp->vector_fmul_scalar(s->frame_out[ch], audio[ch], n, len);
128 s->fdsp->vector_fmul_reverse(&s->output[window_len], s->frame_out[ch],
129 win, len);
130 s->fdsp->vector_fmul(s->frame_out[ch], s->frame_out[ch], win, len);
131 mdct_fn(mdct, s->coefs[ch], s->output, sizeof(float));
132 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 return 0;
139}
140
141// FIXME use for decoding too
142static 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 ptr = s->exponent_bands[s->frame_len_bits - s->block_len_bits];
149 q = s->exponents[ch];
150 q_end = q + s->block_len;
151 max_scale = 0;
152 while (q < q_end) {
153 /* XXX: use a table */
154 v = ff_exp10(*exp_param++ *(1.0 / 16.0));
155 max_scale = FFMAX(max_scale, v);
156 n = *ptr++;
157 do {
158 *q++ = v;
159 } while (--n);
160 }
161 s->max_exponent[ch] = max_scale;
162}
163
164static 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 ptr = s->exponent_bands[s->frame_len_bits - s->block_len_bits];
171 q = s->exponents[ch];
172 q_end = q + s->block_len;
173 if (s->version == 1) {
174 last_exp = *exp_param++;
175 av_assert0(last_exp - 10 >= 0 && last_exp - 10 < 32);
176 put_bits(&s->pb, 5, last_exp - 10);
177 q += *ptr++;
178 } else
179 last_exp = 36;
180 while (q < q_end) {
181 int exp = *exp_param++;
182 int code = exp - last_exp + 60;
183 av_assert1(code >= 0 && code < 120);
186 /* XXX: use a table */
187 q += *ptr++;
188 last_exp = exp;
189 }
190}
191
192static int encode_block(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE],
193 int total_gain)
194{
195 int channels = s->avctx->ch_layout.nb_channels;
196 int v, bsize, ch, coef_nb_bits, parse_exponents;
197 float mdct_norm;
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 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 s->next_block_len_bits = s->frame_len_bits;
213 s->prev_block_len_bits = s->frame_len_bits;
214 s->block_len_bits = s->frame_len_bits;
215 }
216
217 s->block_len = 1 << s->block_len_bits;
218// av_assert0((s->block_pos + s->block_len) <= s->frame_len);
219 bsize = s->frame_len_bits - s->block_len_bits;
220
221 // FIXME factor
222 v = s->coefs_end[bsize] - s->coefs_start;
223 for (ch = 0; ch < channels; ch++)
224 nb_coefs[ch] = v;
225 {
226 int n4 = s->block_len / 2;
227 mdct_norm = 1.0 / (float) n4;
228 if (s->version == 1)
229 mdct_norm *= sqrt(n4);
230 }
231
232 if (channels == 2)
233 put_bits(&s->pb, 1, !!s->ms_stereo);
234
235 for (ch = 0; ch < channels; ch++) {
236 // FIXME only set channel_coded when needed, instead of always
237 s->channel_coded[ch] = 1;
238 if (s->channel_coded[ch])
239 init_exp(s, ch, fixed_exp);
240 }
241
242 for (ch = 0; ch < channels; ch++) {
243 if (s->channel_coded[ch]) {
244 WMACoef *coefs1;
245 float *coefs, *exponents, mult;
246 int i, n;
247
248 coefs1 = s->coefs1[ch];
249 exponents = s->exponents[ch];
250 mult = ff_exp10(total_gain * 0.05) / s->max_exponent[ch];
251 mult *= mdct_norm;
252 coefs = src_coefs[ch];
253 if (s->use_noise_coding && 0) {
254 av_assert0(0); // FIXME not implemented
255 } else {
256 coefs += s->coefs_start;
257 n = nb_coefs[ch];
258 for (i = 0; i < n; i++) {
259 double t = *coefs++ / (exponents[i] * mult);
260 if (t < -32768 || t > 32767)
261 return -1;
262
263 coefs1[i] = lrint(t);
264 }
265 }
266 }
267 }
268
269 v = 0;
270 for (ch = 0; ch < channels; ch++) {
271 int a = s->channel_coded[ch];
272 put_bits(&s->pb, 1, a);
273 v |= a;
274 }
275
276 if (!v)
277 return 1;
278
279 for (v = total_gain - 1; v >= 127; v -= 127)
280 put_bits(&s->pb, 7, 127);
281 put_bits(&s->pb, 7, v);
282
283 coef_nb_bits = ff_wma_total_gain_to_bits(total_gain);
284
285 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 parse_exponents = 1;
300 if (s->block_len_bits != s->frame_len_bits)
301 put_bits(&s->pb, 1, parse_exponents);
302
303 if (parse_exponents) {
304 for (ch = 0; ch < channels; ch++) {
305 if (s->channel_coded[ch]) {
306 if (s->use_exp_vlc) {
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 for (ch = 0; ch < channels; ch++) {
319 if (s->channel_coded[ch]) {
320 int run, tindex;
321 WMACoef *ptr, *eptr;
322 tindex = (ch == 1 && s->ms_stereo);
323 ptr = &s->coefs1[ch][0];
324 eptr = ptr + nb_coefs[ch];
325
326 run = 0;
327 for (; ptr < eptr; ptr++) {
328 if (*ptr) {
329 int level = *ptr;
330 int abs_level = FFABS(level);
331 int code = 0;
332 if (abs_level <= s->coef_vlcs[tindex]->max_level)
333 if (run < s->coef_vlcs[tindex]->levels[abs_level - 1])
334 code = run + s->int_table[tindex][abs_level - 1];
335
337 put_bits(&s->pb, s->coef_vlcs[tindex]->huffbits[code],
338 s->coef_vlcs[tindex]->huffcodes[code]);
339
340 if (code == 0) {
341 if (1 << coef_nb_bits <= abs_level)
342 return -1;
343
344 put_bits(&s->pb, coef_nb_bits, abs_level);
345 put_bits(&s->pb, s->frame_len_bits, run);
346 }
347 // FIXME the sign is flipped somewhere
348 put_bits(&s->pb, 1, level < 0);
349 run = 0;
350 } else
351 run++;
352 }
353 if (run)
354 put_bits(&s->pb, s->coef_vlcs[tindex]->huffbits[1],
355 s->coef_vlcs[tindex]->huffcodes[1]);
356 }
357 if (s->version == 1 && channels >= 2)
358 align_put_bits(&s->pb);
359 }
360 return 0;
361}
362
363static int encode_frame(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE],
364 uint8_t *buf, int buf_size, int total_gain)
365{
366 init_put_bits(&s->pb, buf, buf_size);
367
368 if (s->use_bit_reservoir)
369 av_unreachable("use_bit_reseroir unimplemented, set to 0 during init");
370 else if (encode_block(s, src_coefs, total_gain) < 0)
371 return INT_MAX;
372
373 align_put_bits(&s->pb);
374
375 return put_bits_count(&s->pb) / 8 - s->avctx->block_align;
376}
377
378static int encode_superframe(AVCodecContext *avctx, AVPacket *avpkt,
379 const AVFrame *frame, int *got_packet_ptr)
380{
381 WMACodecContext *s = avctx->priv_data;
382 int total_gain, ret, error;
383
384 s->block_len_bits = s->frame_len_bits; // required by non variable block len
385 s->block_len = 1 << s->block_len_bits;
386
387 ret = apply_window_and_mdct(avctx, frame);
388
389 if (ret < 0)
390 return ret;
391
392 if (s->ms_stereo) {
393 float a, b;
394
395 for (int i = 0; i < s->block_len; i++) {
396 a = s->coefs[0][i] * 0.5;
397 b = s->coefs[1][i] * 0.5;
398 s->coefs[0][i] = a + b;
399 s->coefs[1][i] = a - b;
400 }
401 }
402
403 if ((ret = ff_alloc_packet(avctx, avpkt, 2 * MAX_CODED_SUPERFRAME_SIZE)) < 0)
404 return ret;
405
406 total_gain = 128;
407 for (int i = 64; i; i >>= 1) {
408 error = encode_frame(s, s->coefs, avpkt->data, avpkt->size,
409 total_gain - i);
410 if (error <= 0)
411 total_gain -= i;
412 }
413
414 while(total_gain <= 128 && error > 0)
415 error = encode_frame(s, s->coefs, avpkt->data, avpkt->size, total_gain++);
416 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 av_assert0((put_bits_count(&s->pb) & 7) == 0);
421 int pad = avctx->block_align - put_bytes_count(&s->pb, 0);
422 av_assert0(pad >= 0);
423 while (pad--)
424 put_bits(&s->pb, 8, 'N');
425
426 flush_put_bits(&s->pb);
427 av_assert0(put_bytes_output(&s->pb) == avctx->block_align);
428
429 if (frame->pts != AV_NOPTS_VALUE)
430 avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->initial_padding);
431
432 avpkt->size = avctx->block_align;
433 *got_packet_ptr = 1;
434 return 0;
435}
436
437#if CONFIG_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,
444 .priv_data_size = sizeof(WMACodecContext),
445 .init = encode_init,
447 .close = ff_wma_end,
449 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
450};
451#endif
452#if CONFIG_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,
459 .priv_data_size = sizeof(WMACodecContext),
460 .init = encode_init,
462 .close = ff_wma_end,
464 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
465};
466#endif
#define MAX_CHANNELS
Definition aac.h:33
static int fixed_exp(int x)
const uint32_t ff_aac_scalefactor_code[121]
Definition aactab.c:181
const uint8_t ff_aac_scalefactor_bits[121]
Definition aactab.c:200
static int nb_coefs(int length, int level, uint64_t sn)
Definition af_afwtdn.c:515
static float win(SuperEqualizerContext *s, float n, int N)
const FFCodec ff_wmav2_encoder
const FFCodec ff_wmav1_encoder
channels
Definition aptx.h:31
static av_cold int encode_init(AVCodecContext *avctx)
Definition asvenc.c:373
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition avassert.h:68
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition avassert.h:58
#define av_unreachable(msg)
Asserts that are used as compiler optimization hints depending upon ASSERT_LEVEL and NBDEBUG.
Definition avassert.h:109
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
Libavcodec external API header.
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define FF_CODEC_ENCODE_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define CODEC_SAMPLEFMTS(...)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition common.h:74
long long int64_t
Definition coverity.c:34
static AVFrame * frame
static int parse_exponents(DBEContext *s, DBEChannel *c)
Definition dolby_e.c:663
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
Definition encode.c:62
static av_always_inline int64_t ff_samples_to_time_base(const AVCodecContext *avctx, int64_t samples)
Rescale from sample rate to AVCodecContext.time_base.
Definition encode.h:96
int8_t exp
Definition eval.c:76
internal math functions header
static av_always_inline double ff_exp10(double x)
Compute 10^x for floating point values.
Definition ffmath.h:42
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
Definition codec.h:147
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
@ AV_CODEC_ID_WMAV1
Definition codec_id.h:460
@ AV_CODEC_ID_WMAV2
Definition codec_id.h:461
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
Definition defs.h:40
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
@ AVMEDIA_TYPE_AUDIO
Definition avutil.h:201
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition samplefmt.h:66
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition avutil.h:247
int a
#define b
Definition input.c:43
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition intra.c:278
#define AV_WL32(p, v)
#define AV_WL16(p, v)
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
Definition j2kenc.c:154
static int16_t mult(Float11 *f1, Float11 *f2)
Definition g726.c:60
Macro definitions for various function/variable attributes.
#define av_cold
Definition attributes.h:117
#define isfinite(x)
Definition libm.h:361
#define FFMIN(a, b)
Definition macros.h:49
#define FFMAX(a, b)
Definition macros.h:47
Memory handling functions.
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
Definition put_bits.h:62
static int put_bits_count(PutBitContext *s)
Definition put_bits.h:90
static int put_bytes_count(const PutBitContext *s, int round_up)
Definition put_bits.h:110
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition put_bits.h:153
static int put_bytes_output(const PutBitContext *s)
Definition put_bits.h:99
static void align_put_bits(PutBitContext *s)
Pad the bitstream with zeros up to the next byte boundary.
Definition put_bits.h:445
const uint8_t * code
Definition spdifenc.c:433
int nb_channels
Number of channels in this layout.
main external API structure.
Definition avcodec.h:443
AVChannelLayout ch_layout
Audio channel layout.
Definition avcodec.h:1055
int64_t bit_rate
the average bitrate
Definition avcodec.h:493
const struct AVCodec * codec
Definition avcodec.h:452
int initial_padding
Audio only.
Definition avcodec.h:1114
int sample_rate
samples per second
Definition avcodec.h:1040
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition avcodec.h:526
int extradata_size
Definition avcodec.h:527
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs.
Definition avcodec.h:1075
int frame_size
Number of samples per channel in an audio frame.
Definition avcodec.h:1068
void * priv_data
Definition avcodec.h:470
enum AVCodecID id
Definition codec.h:189
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
This structure stores compressed data.
Definition packet.h:580
int size
Definition packet.h:604
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition packet.h:596
uint8_t * data
Definition packet.h:603
uint8_t run
Definition svq3.c:207
uint8_t level
Definition svq3.c:208
#define lrint
Definition tablegen.h:53
#define av_mallocz(s)
#define av_log(a,...)
static void error(const char *err)
av_cold int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type, int inv, int len, const void *scale, uint64_t flags)
Initialize a transform context with the given configuration (i)MDCTs with an odd length are currently...
Definition tx.c:903
@ AV_TX_FLOAT_MDCT
Standard MDCT with a sample data type of float, double or int32_t, respectively.
Definition tx.h:68
void(* av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride)
Function pointer to a function to perform the transform.
Definition tx.h:151
int len
int ff_wma_total_gain_to_bits(int total_gain)
Definition wma.c:353
av_cold int ff_wma_end(AVCodecContext *avctx)
Definition wma.c:367
av_cold int ff_wma_init(AVCodecContext *avctx, int flags2)
Definition wma.c:79
#define MAX_CODED_SUPERFRAME_SIZE
Definition wma.h:46
#define BLOCK_MAX_SIZE
Definition wma.h:36
float WMACoef
type for decoded coefficients, int16_t would be enough for wma 1/2
Definition wma.h:58
static const CoefVLCTable coef_vlcs[6]
Definition wmadata.h:1371
static void init_exp(WMACodecContext *s, int ch, const int *exp_param)
Definition wmaenc.c:142
static int encode_block(WMACodecContext *s, float(*src_coefs)[BLOCK_MAX_SIZE], int total_gain)
Definition wmaenc.c:192
static av_cold int encode_init(AVCodecContext *avctx)
Definition wmaenc.c:35
static int encode_frame(WMACodecContext *s, float(*src_coefs)[BLOCK_MAX_SIZE], uint8_t *buf, int buf_size, int total_gain)
Definition wmaenc.c:363
static int encode_superframe(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
Definition wmaenc.c:378
static void encode_exp_vlc(WMACodecContext *s, int ch, const int *exp_param)
Definition wmaenc.c:164
static int apply_window_and_mdct(AVCodecContext *avctx, const AVFrame *frame)
Definition wmaenc.c:112