yading@10
|
1 /*
|
yading@10
|
2 * WMA compatible encoder
|
yading@10
|
3 * Copyright (c) 2007 Michael Niedermayer
|
yading@10
|
4 *
|
yading@10
|
5 * This file is part of FFmpeg.
|
yading@10
|
6 *
|
yading@10
|
7 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
8 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
9 * License as published by the Free Software Foundation; either
|
yading@10
|
10 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
11 *
|
yading@10
|
12 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
15 * Lesser General Public License for more details.
|
yading@10
|
16 *
|
yading@10
|
17 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
18 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
20 */
|
yading@10
|
21
|
yading@10
|
22 #include "avcodec.h"
|
yading@10
|
23 #include "internal.h"
|
yading@10
|
24 #include "wma.h"
|
yading@10
|
25 #include "libavutil/avassert.h"
|
yading@10
|
26
|
yading@10
|
27
|
yading@10
|
28 static int encode_init(AVCodecContext * avctx){
|
yading@10
|
29 WMACodecContext *s = avctx->priv_data;
|
yading@10
|
30 int i, flags1, flags2, block_align;
|
yading@10
|
31 uint8_t *extradata;
|
yading@10
|
32
|
yading@10
|
33 s->avctx = avctx;
|
yading@10
|
34
|
yading@10
|
35 if(avctx->channels > MAX_CHANNELS) {
|
yading@10
|
36 av_log(avctx, AV_LOG_ERROR, "too many channels: got %i, need %i or fewer\n",
|
yading@10
|
37 avctx->channels, MAX_CHANNELS);
|
yading@10
|
38 return AVERROR(EINVAL);
|
yading@10
|
39 }
|
yading@10
|
40
|
yading@10
|
41 if (avctx->sample_rate > 48000) {
|
yading@10
|
42 av_log(avctx, AV_LOG_ERROR, "sample rate is too high: %d > 48kHz\n",
|
yading@10
|
43 avctx->sample_rate);
|
yading@10
|
44 return AVERROR(EINVAL);
|
yading@10
|
45 }
|
yading@10
|
46
|
yading@10
|
47 if(avctx->bit_rate < 24*1000) {
|
yading@10
|
48 av_log(avctx, AV_LOG_ERROR, "bitrate too low: got %i, need 24000 or higher\n",
|
yading@10
|
49 avctx->bit_rate);
|
yading@10
|
50 return AVERROR(EINVAL);
|
yading@10
|
51 }
|
yading@10
|
52
|
yading@10
|
53 /* extract flag infos */
|
yading@10
|
54 flags1 = 0;
|
yading@10
|
55 flags2 = 1;
|
yading@10
|
56 if (avctx->codec->id == AV_CODEC_ID_WMAV1) {
|
yading@10
|
57 extradata= av_malloc(4);
|
yading@10
|
58 avctx->extradata_size= 4;
|
yading@10
|
59 AV_WL16(extradata, flags1);
|
yading@10
|
60 AV_WL16(extradata+2, flags2);
|
yading@10
|
61 } else if (avctx->codec->id == AV_CODEC_ID_WMAV2) {
|
yading@10
|
62 extradata= av_mallocz(10);
|
yading@10
|
63 avctx->extradata_size= 10;
|
yading@10
|
64 AV_WL32(extradata, flags1);
|
yading@10
|
65 AV_WL16(extradata+4, flags2);
|
yading@10
|
66 }else
|
yading@10
|
67 av_assert0(0);
|
yading@10
|
68 avctx->extradata= extradata;
|
yading@10
|
69 s->use_exp_vlc = flags2 & 0x0001;
|
yading@10
|
70 s->use_bit_reservoir = flags2 & 0x0002;
|
yading@10
|
71 s->use_variable_block_len = flags2 & 0x0004;
|
yading@10
|
72 if (avctx->channels == 2)
|
yading@10
|
73 s->ms_stereo = 1;
|
yading@10
|
74
|
yading@10
|
75 ff_wma_init(avctx, flags2);
|
yading@10
|
76
|
yading@10
|
77 /* init MDCT */
|
yading@10
|
78 for(i = 0; i < s->nb_block_sizes; i++)
|
yading@10
|
79 ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 0, 1.0);
|
yading@10
|
80
|
yading@10
|
81 block_align = avctx->bit_rate * (int64_t)s->frame_len /
|
yading@10
|
82 (avctx->sample_rate * 8);
|
yading@10
|
83 block_align = FFMIN(block_align, MAX_CODED_SUPERFRAME_SIZE);
|
yading@10
|
84 avctx->block_align = block_align;
|
yading@10
|
85
|
yading@10
|
86 avctx->frame_size = avctx->delay = s->frame_len;
|
yading@10
|
87
|
yading@10
|
88 return 0;
|
yading@10
|
89 }
|
yading@10
|
90
|
yading@10
|
91
|
yading@10
|
92 static void apply_window_and_mdct(AVCodecContext * avctx, const AVFrame *frame)
|
yading@10
|
93 {
|
yading@10
|
94 WMACodecContext *s = avctx->priv_data;
|
yading@10
|
95 float **audio = (float **)frame->extended_data;
|
yading@10
|
96 int len = frame->nb_samples;
|
yading@10
|
97 int window_index= s->frame_len_bits - s->block_len_bits;
|
yading@10
|
98 FFTContext *mdct = &s->mdct_ctx[window_index];
|
yading@10
|
99 int ch;
|
yading@10
|
100 const float * win = s->windows[window_index];
|
yading@10
|
101 int window_len = 1 << s->block_len_bits;
|
yading@10
|
102 float n = 2.0 * 32768.0 / window_len;
|
yading@10
|
103
|
yading@10
|
104 for (ch = 0; ch < avctx->channels; ch++) {
|
yading@10
|
105 memcpy(s->output, s->frame_out[ch], window_len * sizeof(*s->output));
|
yading@10
|
106 s->fdsp.vector_fmul_scalar(s->frame_out[ch], audio[ch], n, len);
|
yading@10
|
107 s->fdsp.vector_fmul_reverse(&s->output[window_len], s->frame_out[ch], win, len);
|
yading@10
|
108 s->fdsp.vector_fmul(s->frame_out[ch], s->frame_out[ch], win, len);
|
yading@10
|
109 mdct->mdct_calc(mdct, s->coefs[ch], s->output);
|
yading@10
|
110 }
|
yading@10
|
111 }
|
yading@10
|
112
|
yading@10
|
113 //FIXME use for decoding too
|
yading@10
|
114 static void init_exp(WMACodecContext *s, int ch, const int *exp_param){
|
yading@10
|
115 int n;
|
yading@10
|
116 const uint16_t *ptr;
|
yading@10
|
117 float v, *q, max_scale, *q_end;
|
yading@10
|
118
|
yading@10
|
119 ptr = s->exponent_bands[s->frame_len_bits - s->block_len_bits];
|
yading@10
|
120 q = s->exponents[ch];
|
yading@10
|
121 q_end = q + s->block_len;
|
yading@10
|
122 max_scale = 0;
|
yading@10
|
123 while (q < q_end) {
|
yading@10
|
124 /* XXX: use a table */
|
yading@10
|
125 v = pow(10, *exp_param++ * (1.0 / 16.0));
|
yading@10
|
126 max_scale= FFMAX(max_scale, v);
|
yading@10
|
127 n = *ptr++;
|
yading@10
|
128 do {
|
yading@10
|
129 *q++ = v;
|
yading@10
|
130 } while (--n);
|
yading@10
|
131 }
|
yading@10
|
132 s->max_exponent[ch] = max_scale;
|
yading@10
|
133 }
|
yading@10
|
134
|
yading@10
|
135 static void encode_exp_vlc(WMACodecContext *s, int ch, const int *exp_param){
|
yading@10
|
136 int last_exp;
|
yading@10
|
137 const uint16_t *ptr;
|
yading@10
|
138 float *q, *q_end;
|
yading@10
|
139
|
yading@10
|
140 ptr = s->exponent_bands[s->frame_len_bits - s->block_len_bits];
|
yading@10
|
141 q = s->exponents[ch];
|
yading@10
|
142 q_end = q + s->block_len;
|
yading@10
|
143 if (s->version == 1) {
|
yading@10
|
144 last_exp= *exp_param++;
|
yading@10
|
145 av_assert0(last_exp-10 >= 0 && last_exp-10 < 32);
|
yading@10
|
146 put_bits(&s->pb, 5, last_exp - 10);
|
yading@10
|
147 q+= *ptr++;
|
yading@10
|
148 }else
|
yading@10
|
149 last_exp = 36;
|
yading@10
|
150 while (q < q_end) {
|
yading@10
|
151 int exp = *exp_param++;
|
yading@10
|
152 int code = exp - last_exp + 60;
|
yading@10
|
153 av_assert1(code >= 0 && code < 120);
|
yading@10
|
154 put_bits(&s->pb, ff_aac_scalefactor_bits[code], ff_aac_scalefactor_code[code]);
|
yading@10
|
155 /* XXX: use a table */
|
yading@10
|
156 q+= *ptr++;
|
yading@10
|
157 last_exp= exp;
|
yading@10
|
158 }
|
yading@10
|
159 }
|
yading@10
|
160
|
yading@10
|
161 static int encode_block(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE], int total_gain){
|
yading@10
|
162 int v, bsize, ch, coef_nb_bits, parse_exponents;
|
yading@10
|
163 float mdct_norm;
|
yading@10
|
164 int nb_coefs[MAX_CHANNELS];
|
yading@10
|
165 static const int fixed_exp[25]={20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20};
|
yading@10
|
166
|
yading@10
|
167 //FIXME remove duplication relative to decoder
|
yading@10
|
168 if (s->use_variable_block_len) {
|
yading@10
|
169 av_assert0(0); //FIXME not implemented
|
yading@10
|
170 }else{
|
yading@10
|
171 /* fixed block len */
|
yading@10
|
172 s->next_block_len_bits = s->frame_len_bits;
|
yading@10
|
173 s->prev_block_len_bits = s->frame_len_bits;
|
yading@10
|
174 s->block_len_bits = s->frame_len_bits;
|
yading@10
|
175 }
|
yading@10
|
176
|
yading@10
|
177 s->block_len = 1 << s->block_len_bits;
|
yading@10
|
178 // assert((s->block_pos + s->block_len) <= s->frame_len);
|
yading@10
|
179 bsize = s->frame_len_bits - s->block_len_bits;
|
yading@10
|
180
|
yading@10
|
181 //FIXME factor
|
yading@10
|
182 v = s->coefs_end[bsize] - s->coefs_start;
|
yading@10
|
183 for (ch = 0; ch < s->avctx->channels; ch++)
|
yading@10
|
184 nb_coefs[ch] = v;
|
yading@10
|
185 {
|
yading@10
|
186 int n4 = s->block_len / 2;
|
yading@10
|
187 mdct_norm = 1.0 / (float)n4;
|
yading@10
|
188 if (s->version == 1) {
|
yading@10
|
189 mdct_norm *= sqrt(n4);
|
yading@10
|
190 }
|
yading@10
|
191 }
|
yading@10
|
192
|
yading@10
|
193 if (s->avctx->channels == 2) {
|
yading@10
|
194 put_bits(&s->pb, 1, !!s->ms_stereo);
|
yading@10
|
195 }
|
yading@10
|
196
|
yading@10
|
197 for (ch = 0; ch < s->avctx->channels; ch++) {
|
yading@10
|
198 s->channel_coded[ch] = 1; //FIXME only set channel_coded when needed, instead of always
|
yading@10
|
199 if (s->channel_coded[ch]) {
|
yading@10
|
200 init_exp(s, ch, fixed_exp);
|
yading@10
|
201 }
|
yading@10
|
202 }
|
yading@10
|
203
|
yading@10
|
204 for (ch = 0; ch < s->avctx->channels; ch++) {
|
yading@10
|
205 if (s->channel_coded[ch]) {
|
yading@10
|
206 WMACoef *coefs1;
|
yading@10
|
207 float *coefs, *exponents, mult;
|
yading@10
|
208 int i, n;
|
yading@10
|
209
|
yading@10
|
210 coefs1 = s->coefs1[ch];
|
yading@10
|
211 exponents = s->exponents[ch];
|
yading@10
|
212 mult = pow(10, total_gain * 0.05) / s->max_exponent[ch];
|
yading@10
|
213 mult *= mdct_norm;
|
yading@10
|
214 coefs = src_coefs[ch];
|
yading@10
|
215 if (s->use_noise_coding && 0) {
|
yading@10
|
216 av_assert0(0); //FIXME not implemented
|
yading@10
|
217 } else {
|
yading@10
|
218 coefs += s->coefs_start;
|
yading@10
|
219 n = nb_coefs[ch];
|
yading@10
|
220 for(i = 0;i < n; i++){
|
yading@10
|
221 double t= *coefs++ / (exponents[i] * mult);
|
yading@10
|
222 if(t<-32768 || t>32767)
|
yading@10
|
223 return -1;
|
yading@10
|
224
|
yading@10
|
225 coefs1[i] = lrint(t);
|
yading@10
|
226 }
|
yading@10
|
227 }
|
yading@10
|
228 }
|
yading@10
|
229 }
|
yading@10
|
230
|
yading@10
|
231 v = 0;
|
yading@10
|
232 for (ch = 0; ch < s->avctx->channels; ch++) {
|
yading@10
|
233 int a = s->channel_coded[ch];
|
yading@10
|
234 put_bits(&s->pb, 1, a);
|
yading@10
|
235 v |= a;
|
yading@10
|
236 }
|
yading@10
|
237
|
yading@10
|
238 if (!v)
|
yading@10
|
239 return 1;
|
yading@10
|
240
|
yading@10
|
241 for(v= total_gain-1; v>=127; v-= 127)
|
yading@10
|
242 put_bits(&s->pb, 7, 127);
|
yading@10
|
243 put_bits(&s->pb, 7, v);
|
yading@10
|
244
|
yading@10
|
245 coef_nb_bits= ff_wma_total_gain_to_bits(total_gain);
|
yading@10
|
246
|
yading@10
|
247 if (s->use_noise_coding) {
|
yading@10
|
248 for (ch = 0; ch < s->avctx->channels; ch++) {
|
yading@10
|
249 if (s->channel_coded[ch]) {
|
yading@10
|
250 int i, n;
|
yading@10
|
251 n = s->exponent_high_sizes[bsize];
|
yading@10
|
252 for(i=0;i<n;i++) {
|
yading@10
|
253 put_bits(&s->pb, 1, s->high_band_coded[ch][i]= 0);
|
yading@10
|
254 if (0)
|
yading@10
|
255 nb_coefs[ch] -= s->exponent_high_bands[bsize][i];
|
yading@10
|
256 }
|
yading@10
|
257 }
|
yading@10
|
258 }
|
yading@10
|
259 }
|
yading@10
|
260
|
yading@10
|
261 parse_exponents = 1;
|
yading@10
|
262 if (s->block_len_bits != s->frame_len_bits) {
|
yading@10
|
263 put_bits(&s->pb, 1, parse_exponents);
|
yading@10
|
264 }
|
yading@10
|
265
|
yading@10
|
266 if (parse_exponents) {
|
yading@10
|
267 for (ch = 0; ch < s->avctx->channels; ch++) {
|
yading@10
|
268 if (s->channel_coded[ch]) {
|
yading@10
|
269 if (s->use_exp_vlc) {
|
yading@10
|
270 encode_exp_vlc(s, ch, fixed_exp);
|
yading@10
|
271 } else {
|
yading@10
|
272 av_assert0(0); //FIXME not implemented
|
yading@10
|
273 // encode_exp_lsp(s, ch);
|
yading@10
|
274 }
|
yading@10
|
275 }
|
yading@10
|
276 }
|
yading@10
|
277 } else {
|
yading@10
|
278 av_assert0(0); //FIXME not implemented
|
yading@10
|
279 }
|
yading@10
|
280
|
yading@10
|
281 for (ch = 0; ch < s->avctx->channels; ch++) {
|
yading@10
|
282 if (s->channel_coded[ch]) {
|
yading@10
|
283 int run, tindex;
|
yading@10
|
284 WMACoef *ptr, *eptr;
|
yading@10
|
285 tindex = (ch == 1 && s->ms_stereo);
|
yading@10
|
286 ptr = &s->coefs1[ch][0];
|
yading@10
|
287 eptr = ptr + nb_coefs[ch];
|
yading@10
|
288
|
yading@10
|
289 run=0;
|
yading@10
|
290 for(;ptr < eptr; ptr++){
|
yading@10
|
291 if(*ptr){
|
yading@10
|
292 int level= *ptr;
|
yading@10
|
293 int abs_level= FFABS(level);
|
yading@10
|
294 int code= 0;
|
yading@10
|
295 if(abs_level <= s->coef_vlcs[tindex]->max_level){
|
yading@10
|
296 if(run < s->coef_vlcs[tindex]->levels[abs_level-1])
|
yading@10
|
297 code= run + s->int_table[tindex][abs_level-1];
|
yading@10
|
298 }
|
yading@10
|
299
|
yading@10
|
300 av_assert2(code < s->coef_vlcs[tindex]->n);
|
yading@10
|
301 put_bits(&s->pb, s->coef_vlcs[tindex]->huffbits[code], s->coef_vlcs[tindex]->huffcodes[code]);
|
yading@10
|
302
|
yading@10
|
303 if(code == 0){
|
yading@10
|
304 if(1<<coef_nb_bits <= abs_level)
|
yading@10
|
305 return -1;
|
yading@10
|
306
|
yading@10
|
307 put_bits(&s->pb, coef_nb_bits, abs_level);
|
yading@10
|
308 put_bits(&s->pb, s->frame_len_bits, run);
|
yading@10
|
309 }
|
yading@10
|
310 put_bits(&s->pb, 1, level < 0); //FIXME the sign is fliped somewhere
|
yading@10
|
311 run=0;
|
yading@10
|
312 }else{
|
yading@10
|
313 run++;
|
yading@10
|
314 }
|
yading@10
|
315 }
|
yading@10
|
316 if(run)
|
yading@10
|
317 put_bits(&s->pb, s->coef_vlcs[tindex]->huffbits[1], s->coef_vlcs[tindex]->huffcodes[1]);
|
yading@10
|
318 }
|
yading@10
|
319 if (s->version == 1 && s->avctx->channels >= 2) {
|
yading@10
|
320 avpriv_align_put_bits(&s->pb);
|
yading@10
|
321 }
|
yading@10
|
322 }
|
yading@10
|
323 return 0;
|
yading@10
|
324 }
|
yading@10
|
325
|
yading@10
|
326 static int encode_frame(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE], uint8_t *buf, int buf_size, int total_gain){
|
yading@10
|
327 init_put_bits(&s->pb, buf, buf_size);
|
yading@10
|
328
|
yading@10
|
329 if (s->use_bit_reservoir) {
|
yading@10
|
330 av_assert0(0);//FIXME not implemented
|
yading@10
|
331 }else{
|
yading@10
|
332 if(encode_block(s, src_coefs, total_gain) < 0)
|
yading@10
|
333 return INT_MAX;
|
yading@10
|
334 }
|
yading@10
|
335
|
yading@10
|
336 avpriv_align_put_bits(&s->pb);
|
yading@10
|
337
|
yading@10
|
338 return put_bits_count(&s->pb) / 8 - s->avctx->block_align;
|
yading@10
|
339 }
|
yading@10
|
340
|
yading@10
|
341 static int encode_superframe(AVCodecContext *avctx, AVPacket *avpkt,
|
yading@10
|
342 const AVFrame *frame, int *got_packet_ptr)
|
yading@10
|
343 {
|
yading@10
|
344 WMACodecContext *s = avctx->priv_data;
|
yading@10
|
345 int i, total_gain, ret, error;
|
yading@10
|
346
|
yading@10
|
347 s->block_len_bits= s->frame_len_bits; //required by non variable block len
|
yading@10
|
348 s->block_len = 1 << s->block_len_bits;
|
yading@10
|
349
|
yading@10
|
350 apply_window_and_mdct(avctx, frame);
|
yading@10
|
351
|
yading@10
|
352 if (s->ms_stereo) {
|
yading@10
|
353 float a, b;
|
yading@10
|
354 int i;
|
yading@10
|
355
|
yading@10
|
356 for(i = 0; i < s->block_len; i++) {
|
yading@10
|
357 a = s->coefs[0][i]*0.5;
|
yading@10
|
358 b = s->coefs[1][i]*0.5;
|
yading@10
|
359 s->coefs[0][i] = a + b;
|
yading@10
|
360 s->coefs[1][i] = a - b;
|
yading@10
|
361 }
|
yading@10
|
362 }
|
yading@10
|
363
|
yading@10
|
364 if ((ret = ff_alloc_packet2(avctx, avpkt, 2 * MAX_CODED_SUPERFRAME_SIZE)) < 0)
|
yading@10
|
365 return ret;
|
yading@10
|
366
|
yading@10
|
367 total_gain= 128;
|
yading@10
|
368 for(i=64; i; i>>=1){
|
yading@10
|
369 error = encode_frame(s, s->coefs, avpkt->data, avpkt->size,
|
yading@10
|
370 total_gain - i);
|
yading@10
|
371 if(error<=0)
|
yading@10
|
372 total_gain-= i;
|
yading@10
|
373 }
|
yading@10
|
374
|
yading@10
|
375 while(total_gain <= 128 && error > 0)
|
yading@10
|
376 error = encode_frame(s, s->coefs, avpkt->data, avpkt->size, total_gain++);
|
yading@10
|
377 av_assert0((put_bits_count(&s->pb) & 7) == 0);
|
yading@10
|
378 i= avctx->block_align - (put_bits_count(&s->pb)+7)/8;
|
yading@10
|
379 av_assert0(i>=0);
|
yading@10
|
380 while(i--)
|
yading@10
|
381 put_bits(&s->pb, 8, 'N');
|
yading@10
|
382
|
yading@10
|
383 flush_put_bits(&s->pb);
|
yading@10
|
384 av_assert0(put_bits_ptr(&s->pb) - s->pb.buf == avctx->block_align);
|
yading@10
|
385
|
yading@10
|
386 if (frame->pts != AV_NOPTS_VALUE)
|
yading@10
|
387 avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->delay);
|
yading@10
|
388
|
yading@10
|
389 avpkt->size = avctx->block_align;
|
yading@10
|
390 *got_packet_ptr = 1;
|
yading@10
|
391 return 0;
|
yading@10
|
392 }
|
yading@10
|
393
|
yading@10
|
394 #if CONFIG_WMAV1_ENCODER
|
yading@10
|
395 AVCodec ff_wmav1_encoder = {
|
yading@10
|
396 .name = "wmav1",
|
yading@10
|
397 .type = AVMEDIA_TYPE_AUDIO,
|
yading@10
|
398 .id = AV_CODEC_ID_WMAV1,
|
yading@10
|
399 .priv_data_size = sizeof(WMACodecContext),
|
yading@10
|
400 .init = encode_init,
|
yading@10
|
401 .encode2 = encode_superframe,
|
yading@10
|
402 .close = ff_wma_end,
|
yading@10
|
403 .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
|
yading@10
|
404 AV_SAMPLE_FMT_NONE },
|
yading@10
|
405 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 1"),
|
yading@10
|
406 };
|
yading@10
|
407 #endif
|
yading@10
|
408 #if CONFIG_WMAV2_ENCODER
|
yading@10
|
409 AVCodec ff_wmav2_encoder = {
|
yading@10
|
410 .name = "wmav2",
|
yading@10
|
411 .type = AVMEDIA_TYPE_AUDIO,
|
yading@10
|
412 .id = AV_CODEC_ID_WMAV2,
|
yading@10
|
413 .priv_data_size = sizeof(WMACodecContext),
|
yading@10
|
414 .init = encode_init,
|
yading@10
|
415 .encode2 = encode_superframe,
|
yading@10
|
416 .close = ff_wma_end,
|
yading@10
|
417 .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
|
yading@10
|
418 AV_SAMPLE_FMT_NONE },
|
yading@10
|
419 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"),
|
yading@10
|
420 };
|
yading@10
|
421 #endif
|