annotate ffmpeg/libavcodec/wmaenc.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
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