2 * WMA compatible encoder
3 * Copyright (c) 2007 Michael Niedermayer
5 * This file is part of FFmpeg.
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.
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.
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
22 #include "libavutil/attributes.h"
27 #include "libavutil/avassert.h"
30 static av_cold
int encode_init(AVCodecContext
*avctx
)
32 WMACodecContext
*s
= avctx
->priv_data
;
33 int i
, flags1
, flags2
, block_align
;
38 if (avctx
->channels
> MAX_CHANNELS
) {
39 av_log(avctx
, AV_LOG_ERROR
,
40 "too many channels: got %i, need %i or fewer\n",
41 avctx
->channels
, MAX_CHANNELS
);
42 return AVERROR(EINVAL
);
45 if (avctx
->sample_rate
> 48000) {
46 av_log(avctx
, AV_LOG_ERROR
, "sample rate is too high: %d > 48kHz\n",
48 return AVERROR(EINVAL
);
51 if (avctx
->bit_rate
< 24 * 1000) {
52 av_log(avctx
, AV_LOG_ERROR
,
53 "bitrate too low: got %i, need 24000 or higher\n",
55 return AVERROR(EINVAL
);
58 /* extract flag infos */
61 if (avctx
->codec
->id
== AV_CODEC_ID_WMAV1
) {
62 extradata
= av_malloc(4);
63 avctx
->extradata_size
= 4;
64 AV_WL16(extradata
, flags1
);
65 AV_WL16(extradata
+ 2, flags2
);
66 } else if (avctx
->codec
->id
== AV_CODEC_ID_WMAV2
) {
67 extradata
= av_mallocz(10);
68 avctx
->extradata_size
= 10;
69 AV_WL32(extradata
, flags1
);
70 AV_WL16(extradata
+ 4, flags2
);
74 avctx
->extradata
= extradata
;
75 s
->use_exp_vlc
= flags2
& 0x0001;
76 s
->use_bit_reservoir
= flags2
& 0x0002;
77 s
->use_variable_block_len
= flags2
& 0x0004;
78 if (avctx
->channels
== 2)
81 ff_wma_init(avctx
, flags2
);
84 for (i
= 0; i
< s
->nb_block_sizes
; i
++)
85 ff_mdct_init(&s
->mdct_ctx
[i
], s
->frame_len_bits
- i
+ 1, 0, 1.0);
87 block_align
= avctx
->bit_rate
* (int64_t) s
->frame_len
/
88 (avctx
->sample_rate
* 8);
89 block_align
= FFMIN(block_align
, MAX_CODED_SUPERFRAME_SIZE
);
90 avctx
->block_align
= block_align
;
91 avctx
->frame_size
= avctx
->initial_padding
= s
->frame_len
;
96 static void apply_window_and_mdct(AVCodecContext
*avctx
, const AVFrame
*frame
)
98 WMACodecContext
*s
= avctx
->priv_data
;
99 float **audio
= (float **) frame
->extended_data
;
100 int len
= frame
->nb_samples
;
101 int window_index
= s
->frame_len_bits
- s
->block_len_bits
;
102 FFTContext
*mdct
= &s
->mdct_ctx
[window_index
];
104 const float *win
= s
->windows
[window_index
];
105 int window_len
= 1 << s
->block_len_bits
;
106 float n
= 2.0 * 32768.0 / window_len
;
108 for (ch
= 0; ch
< avctx
->channels
; ch
++) {
109 memcpy(s
->output
, s
->frame_out
[ch
], window_len
* sizeof(*s
->output
));
110 s
->fdsp
->vector_fmul_scalar(s
->frame_out
[ch
], audio
[ch
], n
, len
);
111 s
->fdsp
->vector_fmul_reverse(&s
->output
[window_len
], s
->frame_out
[ch
],
113 s
->fdsp
->vector_fmul(s
->frame_out
[ch
], s
->frame_out
[ch
], win
, len
);
114 mdct
->mdct_calc(mdct
, s
->coefs
[ch
], s
->output
);
118 // FIXME use for decoding too
119 static void init_exp(WMACodecContext
*s
, int ch
, const int *exp_param
)
123 float v
, *q
, max_scale
, *q_end
;
125 ptr
= s
->exponent_bands
[s
->frame_len_bits
- s
->block_len_bits
];
126 q
= s
->exponents
[ch
];
127 q_end
= q
+ s
->block_len
;
130 /* XXX: use a table */
131 v
= pow(10, *exp_param
++ *(1.0 / 16.0));
132 max_scale
= FFMAX(max_scale
, v
);
138 s
->max_exponent
[ch
] = max_scale
;
141 static void encode_exp_vlc(WMACodecContext
*s
, int ch
, const int *exp_param
)
147 ptr
= s
->exponent_bands
[s
->frame_len_bits
- s
->block_len_bits
];
148 q
= s
->exponents
[ch
];
149 q_end
= q
+ s
->block_len
;
150 if (s
->version
== 1) {
151 last_exp
= *exp_param
++;
152 av_assert0(last_exp
- 10 >= 0 && last_exp
- 10 < 32);
153 put_bits(&s
->pb
, 5, last_exp
- 10);
158 int exp
= *exp_param
++;
159 int code
= exp
- last_exp
+ 60;
160 av_assert1(code
>= 0 && code
< 120);
161 put_bits(&s
->pb
, ff_aac_scalefactor_bits
[code
],
162 ff_aac_scalefactor_code
[code
]);
163 /* XXX: use a table */
169 static int encode_block(WMACodecContext
*s
, float (*src_coefs
)[BLOCK_MAX_SIZE
],
172 int v
, bsize
, ch
, coef_nb_bits
, parse_exponents
;
174 int nb_coefs
[MAX_CHANNELS
];
175 static const int fixed_exp
[25] = {
183 // FIXME remove duplication relative to decoder
184 if (s
->use_variable_block_len
) {
185 av_assert0(0); // FIXME not implemented
187 /* fixed block len */
188 s
->next_block_len_bits
= s
->frame_len_bits
;
189 s
->prev_block_len_bits
= s
->frame_len_bits
;
190 s
->block_len_bits
= s
->frame_len_bits
;
193 s
->block_len
= 1 << s
->block_len_bits
;
194 // av_assert0((s->block_pos + s->block_len) <= s->frame_len);
195 bsize
= s
->frame_len_bits
- s
->block_len_bits
;
198 v
= s
->coefs_end
[bsize
] - s
->coefs_start
;
199 for (ch
= 0; ch
< s
->avctx
->channels
; ch
++)
202 int n4
= s
->block_len
/ 2;
203 mdct_norm
= 1.0 / (float) n4
;
205 mdct_norm
*= sqrt(n4
);
208 if (s
->avctx
->channels
== 2)
209 put_bits(&s
->pb
, 1, !!s
->ms_stereo
);
211 for (ch
= 0; ch
< s
->avctx
->channels
; ch
++) {
212 // FIXME only set channel_coded when needed, instead of always
213 s
->channel_coded
[ch
] = 1;
214 if (s
->channel_coded
[ch
])
215 init_exp(s
, ch
, fixed_exp
);
218 for (ch
= 0; ch
< s
->avctx
->channels
; ch
++) {
219 if (s
->channel_coded
[ch
]) {
221 float *coefs
, *exponents
, mult
;
224 coefs1
= s
->coefs1
[ch
];
225 exponents
= s
->exponents
[ch
];
226 mult
= pow(10, total_gain
* 0.05) / s
->max_exponent
[ch
];
228 coefs
= src_coefs
[ch
];
229 if (s
->use_noise_coding
&& 0) {
230 av_assert0(0); // FIXME not implemented
232 coefs
+= s
->coefs_start
;
234 for (i
= 0; i
< n
; i
++) {
235 double t
= *coefs
++ / (exponents
[i
] * mult
);
236 if (t
< -32768 || t
> 32767)
239 coefs1
[i
] = lrint(t
);
246 for (ch
= 0; ch
< s
->avctx
->channels
; ch
++) {
247 int a
= s
->channel_coded
[ch
];
248 put_bits(&s
->pb
, 1, a
);
255 for (v
= total_gain
- 1; v
>= 127; v
-= 127)
256 put_bits(&s
->pb
, 7, 127);
257 put_bits(&s
->pb
, 7, v
);
259 coef_nb_bits
= ff_wma_total_gain_to_bits(total_gain
);
261 if (s
->use_noise_coding
) {
262 for (ch
= 0; ch
< s
->avctx
->channels
; ch
++) {
263 if (s
->channel_coded
[ch
]) {
265 n
= s
->exponent_high_sizes
[bsize
];
266 for (i
= 0; i
< n
; i
++) {
267 put_bits(&s
->pb
, 1, s
->high_band_coded
[ch
][i
] = 0);
269 nb_coefs
[ch
] -= s
->exponent_high_bands
[bsize
][i
];
276 if (s
->block_len_bits
!= s
->frame_len_bits
)
277 put_bits(&s
->pb
, 1, parse_exponents
);
279 if (parse_exponents
) {
280 for (ch
= 0; ch
< s
->avctx
->channels
; ch
++) {
281 if (s
->channel_coded
[ch
]) {
282 if (s
->use_exp_vlc
) {
283 encode_exp_vlc(s
, ch
, fixed_exp
);
285 av_assert0(0); // FIXME not implemented
286 // encode_exp_lsp(s, ch);
291 av_assert0(0); // FIXME not implemented
293 for (ch
= 0; ch
< s
->avctx
->channels
; ch
++) {
294 if (s
->channel_coded
[ch
]) {
297 tindex
= (ch
== 1 && s
->ms_stereo
);
298 ptr
= &s
->coefs1
[ch
][0];
299 eptr
= ptr
+ nb_coefs
[ch
];
302 for (; ptr
< eptr
; ptr
++) {
305 int abs_level
= FFABS(level
);
307 if (abs_level
<= s
->coef_vlcs
[tindex
]->max_level
)
308 if (run
< s
->coef_vlcs
[tindex
]->levels
[abs_level
- 1])
309 code
= run
+ s
->int_table
[tindex
][abs_level
- 1];
311 av_assert2(code
< s
->coef_vlcs
[tindex
]->n
);
312 put_bits(&s
->pb
, s
->coef_vlcs
[tindex
]->huffbits
[code
],
313 s
->coef_vlcs
[tindex
]->huffcodes
[code
]);
316 if (1 << coef_nb_bits
<= abs_level
)
319 put_bits(&s
->pb
, coef_nb_bits
, abs_level
);
320 put_bits(&s
->pb
, s
->frame_len_bits
, run
);
322 // FIXME the sign is flipped somewhere
323 put_bits(&s
->pb
, 1, level
< 0);
329 put_bits(&s
->pb
, s
->coef_vlcs
[tindex
]->huffbits
[1],
330 s
->coef_vlcs
[tindex
]->huffcodes
[1]);
332 if (s
->version
== 1 && s
->avctx
->channels
>= 2)
333 avpriv_align_put_bits(&s
->pb
);
338 static int encode_frame(WMACodecContext
*s
, float (*src_coefs
)[BLOCK_MAX_SIZE
],
339 uint8_t *buf
, int buf_size
, int total_gain
)
341 init_put_bits(&s
->pb
, buf
, buf_size
);
343 if (s
->use_bit_reservoir
)
344 av_assert0(0); // FIXME not implemented
345 else if (encode_block(s
, src_coefs
, total_gain
) < 0)
348 avpriv_align_put_bits(&s
->pb
);
350 return put_bits_count(&s
->pb
) / 8 - s
->avctx
->block_align
;
353 static int encode_superframe(AVCodecContext
*avctx
, AVPacket
*avpkt
,
354 const AVFrame
*frame
, int *got_packet_ptr
)
356 WMACodecContext
*s
= avctx
->priv_data
;
357 int i
, total_gain
, ret
, error
;
359 s
->block_len_bits
= s
->frame_len_bits
; // required by non variable block len
360 s
->block_len
= 1 << s
->block_len_bits
;
362 apply_window_and_mdct(avctx
, frame
);
368 for (i
= 0; i
< s
->block_len
; i
++) {
369 a
= s
->coefs
[0][i
] * 0.5;
370 b
= s
->coefs
[1][i
] * 0.5;
371 s
->coefs
[0][i
] = a
+ b
;
372 s
->coefs
[1][i
] = a
- b
;
376 if ((ret
= ff_alloc_packet2(avctx
, avpkt
, 2 * MAX_CODED_SUPERFRAME_SIZE
)) < 0)
380 for (i
= 64; i
; i
>>= 1) {
381 error
= encode_frame(s
, s
->coefs
, avpkt
->data
, avpkt
->size
,
387 while(total_gain
<= 128 && error
> 0)
388 error
= encode_frame(s
, s
->coefs
, avpkt
->data
, avpkt
->size
, total_gain
++);
390 av_log(avctx
, AV_LOG_ERROR
, "Invalid input data or requested bitrate too low, cannot encode\n");
392 return AVERROR(EINVAL
);
394 av_assert0((put_bits_count(&s
->pb
) & 7) == 0);
395 i
= avctx
->block_align
- (put_bits_count(&s
->pb
)+7)/8;
398 put_bits(&s
->pb
, 8, 'N');
400 flush_put_bits(&s
->pb
);
401 av_assert0(put_bits_ptr(&s
->pb
) - s
->pb
.buf
== avctx
->block_align
);
403 if (frame
->pts
!= AV_NOPTS_VALUE
)
404 avpkt
->pts
= frame
->pts
- ff_samples_to_time_base(avctx
, avctx
->initial_padding
);
406 avpkt
->size
= avctx
->block_align
;
411 #if CONFIG_WMAV1_ENCODER
412 AVCodec ff_wmav1_encoder
= {
414 .long_name
= NULL_IF_CONFIG_SMALL("Windows Media Audio 1"),
415 .type
= AVMEDIA_TYPE_AUDIO
,
416 .id
= AV_CODEC_ID_WMAV1
,
417 .priv_data_size
= sizeof(WMACodecContext
),
419 .encode2
= encode_superframe
,
421 .sample_fmts
= (const enum AVSampleFormat
[]) { AV_SAMPLE_FMT_FLTP
,
422 AV_SAMPLE_FMT_NONE
},
425 #if CONFIG_WMAV2_ENCODER
426 AVCodec ff_wmav2_encoder
= {
428 .long_name
= NULL_IF_CONFIG_SMALL("Windows Media Audio 2"),
429 .type
= AVMEDIA_TYPE_AUDIO
,
430 .id
= AV_CODEC_ID_WMAV2
,
431 .priv_data_size
= sizeof(WMACodecContext
),
433 .encode2
= encode_superframe
,
435 .sample_fmts
= (const enum AVSampleFormat
[]) { AV_SAMPLE_FMT_FLTP
,
436 AV_SAMPLE_FMT_NONE
},