changeset 10174:89cd870ca180 libavcodec

Add two more sizes to ff_sine_windows[] and also pad it with NULLs so that FF_ELEMS(ff_sine_windows[x]) == 1 << x. Fix issue 1384.
author vitor
date Tue, 15 Sep 2009 16:18:16 +0000
parents f55ca9a2b948
children 5cf49858179a
files dsputil.h mdct.c twinvq.c wma.c wmaprodec.c
diffstat 5 files changed, 15 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/dsputil.h	Tue Sep 15 15:06:04 2009 +0000
+++ b/dsputil.h	Tue Sep 15 16:18:16 2009 +0000
@@ -760,13 +760,15 @@
  * @param   n       size of half window
  */
 void ff_sine_window_init(float *window, int n);
+extern float ff_sine_32  [  32];
+extern float ff_sine_64  [  64];
 extern float ff_sine_128 [ 128];
 extern float ff_sine_256 [ 256];
 extern float ff_sine_512 [ 512];
 extern float ff_sine_1024[1024];
 extern float ff_sine_2048[2048];
 extern float ff_sine_4096[4096];
-extern float * const ff_sine_windows[6];
+extern float * const ff_sine_windows[13];
 
 int ff_mdct_init(MDCTContext *s, int nbits, int inverse, double scale);
 void ff_imdct_calc_c(MDCTContext *s, FFTSample *output, const FFTSample *input);
--- a/mdct.c	Tue Sep 15 15:06:04 2009 +0000
+++ b/mdct.c	Tue Sep 15 16:18:16 2009 +0000
@@ -48,13 +48,17 @@
        window[i] = sqrt(local_window[i] / sum);
 }
 
+DECLARE_ALIGNED(16, float, ff_sine_32  [  32]);
+DECLARE_ALIGNED(16, float, ff_sine_64  [  64]);
 DECLARE_ALIGNED(16, float, ff_sine_128 [ 128]);
 DECLARE_ALIGNED(16, float, ff_sine_256 [ 256]);
 DECLARE_ALIGNED(16, float, ff_sine_512 [ 512]);
 DECLARE_ALIGNED(16, float, ff_sine_1024[1024]);
 DECLARE_ALIGNED(16, float, ff_sine_2048[2048]);
 DECLARE_ALIGNED(16, float, ff_sine_4096[4096]);
-float * const ff_sine_windows[6] = {
+float * const ff_sine_windows[] = {
+    NULL, NULL, NULL, NULL, NULL, // unused
+    ff_sine_32 , ff_sine_64 ,
     ff_sine_128, ff_sine_256, ff_sine_512, ff_sine_1024, ff_sine_2048, ff_sine_4096
 };
 
--- a/twinvq.c	Tue Sep 15 15:06:04 2009 +0000
+++ b/twinvq.c	Tue Sep 15 16:18:16 2009 +0000
@@ -648,7 +648,7 @@
         tctx->dsp.vector_fmul_window(out2,
                                      prev_buf + (bsize-wsize)/2,
                                      buf1 + bsize*j,
-                                     ff_sine_windows[av_log2(wsize) - 7],
+                                     ff_sine_windows[av_log2(wsize)],
                                      0.0,
                                      wsize/2);
         out2 += wsize;
@@ -903,9 +903,9 @@
     }
 
 
-    ff_sine_window_init(ff_sine_windows[av_log2(size_m)     - 7], size_m  );
-    ff_sine_window_init(ff_sine_windows[av_log2(size_s/2)   - 7], size_s/2);
-    ff_sine_window_init(ff_sine_windows[av_log2(mtab->size) - 7], mtab->size);
+    ff_sine_window_init(ff_sine_windows[av_log2(size_m)    ], size_m  );
+    ff_sine_window_init(ff_sine_windows[av_log2(size_s/2)  ], size_s/2);
+    ff_sine_window_init(ff_sine_windows[av_log2(mtab->size)], mtab->size);
 }
 
 /**
--- a/wma.c	Tue Sep 15 15:06:04 2009 +0000
+++ b/wma.c	Tue Sep 15 16:18:16 2009 +0000
@@ -341,8 +341,8 @@
     for (i = 0; i < s->nb_block_sizes; i++) {
         int n;
         n = 1 << (s->frame_len_bits - i);
-        ff_sine_window_init(ff_sine_windows[s->frame_len_bits - i - 7], n);
-        s->windows[i] = ff_sine_windows[s->frame_len_bits - i - 7];
+        ff_sine_window_init(ff_sine_windows[s->frame_len_bits - i], n);
+        s->windows[i] = ff_sine_windows[s->frame_len_bits - i];
     }
 
     s->reset_block_lengths = 1;
--- a/wmaprodec.c	Tue Sep 15 15:06:04 2009 +0000
+++ b/wmaprodec.c	Tue Sep 15 16:18:16 2009 +0000
@@ -426,7 +426,7 @@
     /** init MDCT windows: simple sinus window */
     for (i = 0; i < WMAPRO_BLOCK_SIZES; i++) {
         const int n       = 1 << (WMAPRO_BLOCK_MAX_BITS - i);
-        const int win_idx = WMAPRO_BLOCK_MAX_BITS - i - 7;
+        const int win_idx = WMAPRO_BLOCK_MAX_BITS - i;
         ff_sine_window_init(ff_sine_windows[win_idx], n);
         s->windows[WMAPRO_BLOCK_SIZES - i - 1] = ff_sine_windows[win_idx];
     }