window.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. function: window functions
  14. ********************************************************************/
  15. #include <stdlib.h>
  16. #include <math.h>
  17. #include "misc.h"
  18. #include "window.h"
  19. #include "window_lookup.h"
  20. const void *_vorbis_window(int type, int left){
  21. switch(type){
  22. case 0:
  23. switch(left){
  24. case 32:
  25. return vwin64;
  26. case 64:
  27. return vwin128;
  28. case 128:
  29. return vwin256;
  30. case 256:
  31. return vwin512;
  32. case 512:
  33. return vwin1024;
  34. case 1024:
  35. return vwin2048;
  36. case 2048:
  37. return vwin4096;
  38. case 4096:
  39. return vwin8192;
  40. default:
  41. return(0);
  42. }
  43. break;
  44. default:
  45. return(0);
  46. }
  47. }
  48. void _vorbis_apply_window(ogg_int32_t *d,const void *window_p[2],
  49. long *blocksizes,
  50. int lW,int W,int nW){
  51. LOOKUP_T *window[2]={window_p[0],window_p[1]};
  52. long n=blocksizes[W];
  53. long ln=blocksizes[lW];
  54. long rn=blocksizes[nW];
  55. long leftbegin=n/4-ln/4;
  56. long leftend=leftbegin+ln/2;
  57. long rightbegin=n/2+n/4-rn/4;
  58. long rightend=rightbegin+rn/2;
  59. int i,p;
  60. for(i=0;i<leftbegin;i++)
  61. d[i]=0;
  62. for(p=0;i<leftend;i++,p++)
  63. d[i]=MULT31(d[i],window[lW][p]);
  64. for(i=rightbegin,p=rn/2-1;i<rightend;i++,p--)
  65. d[i]=MULT31(d[i],window[nW][p]);
  66. for(;i<n;i++)
  67. d[i]=0;
  68. }