window.c 2.07 KB
Newer Older
Monty's avatar
 
Monty committed
1 2 3 4
/********************************************************************
 *                                                                  *
 * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE.   *
 *                                                                  *
Monty's avatar
 
Monty committed
5 6 7 8
 * 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.       *
 *                                                                  *
Monty's avatar
 
Monty committed
9 10 11 12 13 14 15 16 17 18 19 20
 * 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"
Monty's avatar
 
Monty committed
21 22
#include "window.h"
#include "window_lookup.h"
Monty's avatar
 
Monty committed
23

Monty's avatar
 
Monty committed
24
const void *_vorbis_window(int type, int left){
Monty's avatar
 
Monty committed
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

  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:
Monty's avatar
 
Monty committed
47
      return(0);
Monty's avatar
 
Monty committed
48 49 50
    }
    break;
  default:
Monty's avatar
 
Monty committed
51
    return(0);
Monty's avatar
 
Monty committed
52 53 54
  }
}

Monty's avatar
 
Monty committed
55
void _vorbis_apply_window(ogg_int32_t *d,const void *window_p[2],
Monty's avatar
 
Monty committed
56
			  long *blocksizes,
Monty's avatar
 
Monty committed
57
			  int lW,int W,int nW){
Monty's avatar
 
Monty committed
58
  
Monty's avatar
 
Monty committed
59
  LOOKUP_T *window[2]={window_p[0],window_p[1]};
Monty's avatar
 
Monty committed
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
  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;
}