misc/libtremor/window.c
changeset 5170 f7e49eff3708
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/libtremor/window.c	Sun Apr 24 22:57:57 2011 +0200
@@ -0,0 +1,83 @@
+/********************************************************************
+ *                                                                  *
+ * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE.   *
+ *                                                                  *
+ * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
+ * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
+ * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
+ *                                                                  *
+ * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002    *
+ * BY THE Xiph.Org FOUNDATION http://www.xiph.org/                  *
+ *                                                                  *
+ ********************************************************************
+
+ function: window functions
+
+ ********************************************************************/
+
+#include <stdlib.h>
+#include <math.h>
+#include "misc.h"
+#include "window.h"
+#include "window_lookup.h"
+
+const void *_vorbis_window(int type, int left){
+
+  switch(type){
+  case 0:
+
+    switch(left){
+    case 32:
+      return vwin64;
+    case 64:
+      return vwin128;
+    case 128:
+      return vwin256;
+    case 256:
+      return vwin512;
+    case 512:
+      return vwin1024;
+    case 1024:
+      return vwin2048;
+    case 2048:
+      return vwin4096;
+    case 4096:
+      return vwin8192;
+    default:
+      return(0);
+    }
+    break;
+  default:
+    return(0);
+  }
+}
+
+void _vorbis_apply_window(ogg_int32_t *d,const void *window_p[2],
+			  long *blocksizes,
+			  int lW,int W,int nW){
+  
+  LOOKUP_T *window[2]={window_p[0],window_p[1]};
+  long n=blocksizes[W];
+  long ln=blocksizes[lW];
+  long rn=blocksizes[nW];
+
+  long leftbegin=n/4-ln/4;
+  long leftend=leftbegin+ln/2;
+
+  long rightbegin=n/2+n/4-rn/4;
+  long rightend=rightbegin+rn/2;
+  
+  int i,p;
+
+  for(i=0;i<leftbegin;i++)
+    d[i]=0;
+
+  for(p=0;i<leftend;i++,p++)
+    d[i]=MULT31(d[i],window[lW][p]);
+
+  for(i=rightbegin,p=rn/2-1;i<rightend;i++,p--)
+    d[i]=MULT31(d[i],window[nW][p]);
+
+  for(;i<n;i++)
+    d[i]=0;
+}