1 /********************************************************************
2  *                                                                  *
3  * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE.   *
4  *                                                                  *
5  * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
6  * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
7  * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
8  *                                                                  *
9  * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002    *
10  * BY THE Xiph.Org FOUNDATION http://www.xiph.org/                  *
11  *                                                                  *
12  ********************************************************************
13 
14  function: window functions
15 
16  ********************************************************************/
17 
18 #include <stdlib.h>
19 #include <math.h>
20 #include "misc.h"
21 #include "window.h"
22 #include "window_lookup.h"
23 
_vorbis_window(int type,int left)24 const void *_vorbis_window(int type, int left){
25 
26   switch(type){
27   case 0:
28 
29     switch(left){
30     case 32:
31       return vwin64;
32     case 64:
33       return vwin128;
34     case 128:
35       return vwin256;
36     case 256:
37       return vwin512;
38     case 512:
39       return vwin1024;
40     case 1024:
41       return vwin2048;
42     case 2048:
43       return vwin4096;
44     case 4096:
45       return vwin8192;
46     default:
47       return(0);
48     }
49     break;
50   default:
51     return(0);
52   }
53 }
54 
_vorbis_apply_window(ogg_int32_t * d,const void * window_p[2],long * blocksizes,int lW,int W,int nW)55 void _vorbis_apply_window(ogg_int32_t *d,const void *window_p[2],
56 			  long *blocksizes,
57 			  int lW,int W,int nW){
58 
59   LOOKUP_T *window[2]={window_p[0],window_p[1]};
60   long n=blocksizes[W];
61   long ln=blocksizes[lW];
62   long rn=blocksizes[nW];
63 
64   long leftbegin=n/4-ln/4;
65   long leftend=leftbegin+ln/2;
66 
67   long rightbegin=n/2+n/4-rn/4;
68   long rightend=rightbegin+rn/2;
69 
70   int i,p;
71 
72   for(i=0;i<leftbegin;i++)
73     d[i]=0;
74 
75   for(p=0;i<leftend;i++,p++)
76     d[i]=MULT31(d[i],window[lW][p]);
77 
78   for(i=rightbegin,p=rn/2-1;i<rightend;i++,p--)
79     d[i]=MULT31(d[i],window[nW][p]);
80 
81   for(;i<n;i++)
82     d[i]=0;
83 }
84