add window function memory reduction
[platform/upstream/libvorbis.git] / lib / window.c
1 /********************************************************************
2  *                                                                  *
3  * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
4  * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
5  * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6  * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
7  *                                                                  *
8  * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002             *
9  * by the XIPHOPHORUS Company http://www.xiph.org/                  *
10  *                                                                  *
11  ********************************************************************
12
13  function: window functions
14  last mod: $Id: window.c,v 1.16 2002/01/22 11:59:00 xiphmont Exp $
15
16  ********************************************************************/
17
18 #include <stdlib.h>
19 #include <math.h>
20 #include "os.h"
21 #include "misc.h"
22
23 float *_vorbis_window(int type, int left){
24   float *ret=_ogg_calloc(left,sizeof(*ret));
25   int i;
26
27   switch(type){
28   case 0:
29     /* The 'vorbis window' (window 0) is sin(sin(x)*sin(x)*2pi) */
30     {
31     
32       for(i=0;i<left;i++){
33         float x=(i+.5f)/left*M_PI/2.;
34         x=sin(x);
35         x*=x;
36         x*=M_PI/2.f;
37         x=sin(x);
38         ret[i]=x;
39       }
40     }
41     break;
42   default:
43     _ogg_free(ret);
44     return(NULL);
45   }
46   return(ret);
47 }
48
49 void _vorbis_apply_window(float *d,float *window[2],long *blocksizes,
50                           int lW,int W,int nW){
51
52   long n=blocksizes[W];
53   long ln=blocksizes[lW];
54   long rn=blocksizes[nW];
55
56   long leftbegin=n/4-ln/4;
57   long leftend=leftbegin+ln/2;
58
59   long rightbegin=n/2+n/4-rn/4;
60   long rightend=rightbegin+rn/2;
61   
62   int i,p;
63
64   for(i=0;i<leftbegin;i++)
65     d[i]=0.f;
66
67   for(p=0;i<leftend;i++,p++)
68     d[i]*=window[lW][p];
69
70   for(i=rightbegin,p=rn/2-1;i<rightend;i++,p--)
71     d[i]*=window[nW][p];
72
73   for(;i<n;i++)
74     d[i]=0.f;
75 }