]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/commitdiff
Support for getting (i)MDCT output multiplied by a constant scaling factor.
authorserge <serge@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Sat, 16 May 2009 14:17:08 +0000 (14:17 +0000)
committerserge <serge@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Sat, 16 May 2009 14:17:08 +0000 (14:17 +0000)
Scaling (i)MDCT output has no runtime overhead and can be used to improve
performance of audio codecs. All the changes are only needed in
'ff_mdct_init' function and slow down initialization a bit.

git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18855 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b

15 files changed:
libavcodec/aac.c
libavcodec/aacenc.c
libavcodec/ac3dec.c
libavcodec/atrac3.c
libavcodec/cook.c
libavcodec/dca.c
libavcodec/dsputil.h
libavcodec/fft-test.c
libavcodec/mdct.c
libavcodec/nellymoserdec.c
libavcodec/nellymoserenc.c
libavcodec/vorbis_dec.c
libavcodec/vorbis_enc.c
libavcodec/wmadec.c
libavcodec/wmaenc.c

index 5427d7c672c51f131f4646c91c10280c21391434..25c74b8157cd50180245512d32f8d1a2a6e60ccd 100644 (file)
@@ -500,8 +500,8 @@ static av_cold int aac_decode_init(AVCodecContext * avccontext) {
         ff_aac_scalefactor_code, sizeof(ff_aac_scalefactor_code[0]), sizeof(ff_aac_scalefactor_code[0]),
         352);
 
-    ff_mdct_init(&ac->mdct, 11, 1);
-    ff_mdct_init(&ac->mdct_small, 8, 1);
+    ff_mdct_init(&ac->mdct, 11, 1, 1.0);
+    ff_mdct_init(&ac->mdct_small, 8, 1, 1.0);
     // window initialization
     ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024);
     ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128);
index cdc8ba04057430e375713b4ee7eae4d060294bfa..5537b7eac49649ec09ab9e6fc397da866a9ae822 100644 (file)
@@ -214,8 +214,8 @@ static av_cold int aac_encode_init(AVCodecContext *avctx)
     s->samplerate_index = i;
 
     dsputil_init(&s->dsp, avctx);
-    ff_mdct_init(&s->mdct1024, 11, 0);
-    ff_mdct_init(&s->mdct128,   8, 0);
+    ff_mdct_init(&s->mdct1024, 11, 0, 1.0);
+    ff_mdct_init(&s->mdct128,   8, 0, 1.0);
     // window init
     ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024);
     ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128);
index b3382bd1202368d8694d39e271527103c6e75079..7d9d0142df2ac04cfb43e823198941b1625fc521 100644 (file)
@@ -194,8 +194,8 @@ static av_cold int ac3_decode_init(AVCodecContext *avctx)
 
     ac3_common_init();
     ac3_tables_init();
-    ff_mdct_init(&s->imdct_256, 8, 1);
-    ff_mdct_init(&s->imdct_512, 9, 1);
+    ff_mdct_init(&s->imdct_256, 8, 1, 1.0);
+    ff_mdct_init(&s->imdct_512, 9, 1, 1.0);
     ff_kbd_window_init(s->window, 5.0, 256);
     dsputil_init(&s->dsp, avctx);
     av_lfg_init(&s->dith_state, 0);
index 49a818e3a725858f1b0edef806b9b0d1193f2d7a..c0825cb5b5a4b3232b7fdb657f6ac0381874ed88 100644 (file)
@@ -268,7 +268,7 @@ static av_cold void init_atrac3_transforms(ATRAC3Context *q) {
     }
 
     /* Initialize the MDCT transform. */
-    ff_mdct_init(&mdct_ctx, 9, 1);
+    ff_mdct_init(&mdct_ctx, 9, 1, 1.0);
 }
 
 /**
index fa9dc2b7cefde96eb93696b3279f588f3670de53..b90949fb70aca7291855adeeeab6b96ea284481f 100644 (file)
@@ -259,7 +259,7 @@ static av_cold int init_cook_mlt(COOKContext *q) {
         q->mlt_window[j] *= sqrt(2.0 / q->samples_per_channel);
 
     /* Initialize the MDCT. */
-    if (ff_mdct_init(&q->mdct_ctx, av_log2(mlt_size)+1, 1)) {
+    if (ff_mdct_init(&q->mdct_ctx, av_log2(mlt_size)+1, 1, 1.0)) {
       av_free(q->mlt_window);
       return -1;
     }
index 1529fdd6b8b86e22c223862fddca0012c06624b3..b42d3df0832c893e8a8e1ab57940ac0fecb223ec 100644 (file)
@@ -1318,7 +1318,7 @@ static av_cold int dca_decode_init(AVCodecContext * avctx)
     dca_init_vlcs();
 
     dsputil_init(&s->dsp, avctx);
-    ff_mdct_init(&s->imdct, 6, 1);
+    ff_mdct_init(&s->imdct, 6, 1, 1.0);
 
     for(i = 0; i < 6; i++)
         s->samples_chanptr[i] = s->samples + i * 256;
index 9dc89409c422c13aa2e8e8636080e92ac25a2ec6..f54d74d285cf7c4695b359e762d72c916557b737 100644 (file)
@@ -771,7 +771,7 @@ extern float ff_sine_2048[2048];
 extern float ff_sine_4096[4096];
 extern float *ff_sine_windows[6];
 
-int ff_mdct_init(MDCTContext *s, int nbits, int inverse);
+int ff_mdct_init(MDCTContext *s, int nbits, int inverse, double scale);
 void ff_imdct_calc_c(MDCTContext *s, FFTSample *output, const FFTSample *input);
 void ff_imdct_half_c(MDCTContext *s, FFTSample *output, const FFTSample *input);
 void ff_imdct_calc_3dn(MDCTContext *s, FFTSample *output, const FFTSample *input);
index 1cefa3202f22167f951f9ac2e4ac155420d730f6..a1e436c11c28feb71f86cabdfcdb2556b9f7fe62 100644 (file)
@@ -223,7 +223,7 @@ int main(int argc, char **argv)
             av_log(NULL, AV_LOG_INFO,"IMDCT");
         else
             av_log(NULL, AV_LOG_INFO,"MDCT");
-        ff_mdct_init(m, fft_nbits, do_inverse);
+        ff_mdct_init(m, fft_nbits, do_inverse, 1.0);
     } else {
         if (do_inverse)
             av_log(NULL, AV_LOG_INFO,"IFFT");
index 7bd4d77f6831be70777a166c39e6161e066298ad..8a42adb4f33917c4427d88abe77b74239f756c9d 100644 (file)
@@ -68,10 +68,10 @@ av_cold void ff_sine_window_init(float *window, int n) {
 /**
  * init MDCT or IMDCT computation.
  */
-av_cold int ff_mdct_init(MDCTContext *s, int nbits, int inverse)
+av_cold int ff_mdct_init(MDCTContext *s, int nbits, int inverse, double scale)
 {
     int n, n4, i;
-    double alpha;
+    double alpha, theta;
 
     memset(s, 0, sizeof(*s));
     n = 1 << nbits;
@@ -85,10 +85,12 @@ av_cold int ff_mdct_init(MDCTContext *s, int nbits, int inverse)
     if (!s->tsin)
         goto fail;
 
+    theta = 1.0 / 8.0 + (scale < 0 ? n4 : 0);
+    scale = sqrt(fabs(scale));
     for(i=0;i<n4;i++) {
-        alpha = 2 * M_PI * (i + 1.0 / 8.0) / n;
-        s->tcos[i] = -cos(alpha);
-        s->tsin[i] = -sin(alpha);
+        alpha = 2 * M_PI * (i + theta) / n;
+        s->tcos[i] = -cos(alpha) * scale;
+        s->tsin[i] = -sin(alpha) * scale;
     }
     if (ff_fft_init(&s->fft, s->nbits - 2, inverse) < 0)
         goto fail;
index 98f0ec32248e18691fe1125882f9226541e45783..a1f55266bf7a9bed6dabb08604714551081452c5 100644 (file)
@@ -130,7 +130,7 @@ static av_cold int decode_init(AVCodecContext * avctx) {
 
     s->avctx = avctx;
     av_lfg_init(&s->random_state, ff_random_get_seed());
-    ff_mdct_init(&s->imdct_ctx, 8, 1);
+    ff_mdct_init(&s->imdct_ctx, 8, 1, 1.0);
 
     dsputil_init(&s->dsp, avctx);
 
index 1bb6c666ab5a2d2f99fc51a88457fc8a9b16b097..52ee2bc03be91d98fa6928fcebbc8ce62e92861f 100644 (file)
@@ -145,7 +145,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
 
     avctx->frame_size = NELLY_SAMPLES;
     s->avctx = avctx;
-    ff_mdct_init(&s->mdct_ctx, 8, 0);
+    ff_mdct_init(&s->mdct_ctx, 8, 0, 1.0);
     dsputil_init(&s->dsp, avctx);
 
     /* Generate overlap window */
index b304e7be8fad0b7bffa83eea0fa4a95323255708..f7b10e61b372746932fb789c647503cd09da9a37 100644 (file)
@@ -896,8 +896,8 @@ static int vorbis_parse_id_hdr(vorbis_context *vc){
     vc->saved           = av_mallocz((vc->blocksize[1]/4)*vc->audio_channels * sizeof(float));
     vc->previous_window=0;
 
-    ff_mdct_init(&vc->mdct[0], bl0, 1);
-    ff_mdct_init(&vc->mdct[1], bl1, 1);
+    ff_mdct_init(&vc->mdct[0], bl0, 1, 1.0);
+    ff_mdct_init(&vc->mdct[1], bl1, 1, 1.0);
 
     AV_DEBUG(" vorbis version %d \n audio_channels %d \n audio_samplerate %d \n bitrate_max %d \n bitrate_nom %d \n bitrate_min %d \n blk_0 %d blk_1 %d \n ",
             vc->version, vc->audio_channels, vc->audio_samplerate, vc->bitrate_maximum, vc->bitrate_nominal, vc->bitrate_minimum, vc->blocksize[0], vc->blocksize[1]);
index 9c91859abee480620914402b04cf83b716994486..b6533aca534a9d52a73e23b029b2b345c7b59046 100644 (file)
@@ -359,8 +359,8 @@ static void create_vorbis_context(vorbis_enc_context * venc, AVCodecContext * av
     venc->win[0] = ff_vorbis_vwin[venc->log2_blocksize[0] - 6];
     venc->win[1] = ff_vorbis_vwin[venc->log2_blocksize[1] - 6];
 
-    ff_mdct_init(&venc->mdct[0], venc->log2_blocksize[0], 0);
-    ff_mdct_init(&venc->mdct[1], venc->log2_blocksize[1], 0);
+    ff_mdct_init(&venc->mdct[0], venc->log2_blocksize[0], 0, 1.0);
+    ff_mdct_init(&venc->mdct[1], venc->log2_blocksize[1], 0, 1.0);
 }
 
 static void put_float(PutBitContext * pb, float f) {
index 67d934f0f43b4436f9ef7d88537be66942df8269..e06990230a0ebbdb0d790a435ef9da6e598e06dc 100644 (file)
@@ -110,7 +110,7 @@ static int wma_decode_init(AVCodecContext * avctx)
 
     /* init MDCT */
     for(i = 0; i < s->nb_block_sizes; i++)
-        ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 1);
+        ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 1, 1.0);
 
     if (s->use_noise_coding) {
         init_vlc(&s->hgain_vlc, HGAINVLCBITS, sizeof(ff_wma_hgain_huffbits),
index a8ba6b0b66563057402b03463b7d72677793edd9..95e5929c7d7bf0c270322e2c12599ce4cef43cfa 100644 (file)
@@ -63,7 +63,7 @@ static int encode_init(AVCodecContext * avctx){
 
     /* init MDCT */
     for(i = 0; i < s->nb_block_sizes; i++)
-        ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 0);
+        ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 0, 1.0);
 
     avctx->block_align=
     s->block_align= avctx->bit_rate*(int64_t)s->frame_len / (avctx->sample_rate*8);