The lib and vq, at least, build again. Tackling the examples and xmms
[platform/upstream/libvorbis.git] / lib / floor0.c
1 /********************************************************************
2  *                                                                  *
3  * THIS FILE IS PART OF THE Ogg Vorbis SOFTWARE CODEC SOURCE CODE.  *
4  * USE, DISTRIBUTION AND REPRODUCTION OF THIS SOURCE IS GOVERNED BY *
5  * THE GNU PUBLIC LICENSE 2, WHICH IS INCLUDED WITH THIS SOURCE.    *
6  * PLEASE READ THESE TERMS DISTRIBUTING.                            *
7  *                                                                  *
8  * THE OggSQUISH SOURCE CODE IS (C) COPYRIGHT 1994-2000             *
9  * by Monty <monty@xiph.org> and The XIPHOPHORUS Company            *
10  * http://www.xiph.org/                                             *
11  *                                                                  *
12  ********************************************************************
13
14  function: floor backend 0 implementation
15  last mod: $Id: floor0.c,v 1.3 2000/01/28 09:05:09 xiphmont Exp $
16
17  ********************************************************************/
18
19 #include <stdlib.h>
20 #include <string.h>
21 #include "vorbis/codec.h"
22 #include "bitwise.h"
23 #include "registry.h"
24
25 static void free_info(vorbis_info_floor *i){
26   vorbis_info_floor0 *d=(vorbis_info_floor0 *)i;
27   if(d){
28     if(d->books)free(d->books);
29     memset(i,0,sizeof(vorbis_info_floor0));
30   }
31 }
32 static void free_look(vorbis_look_floor *i){
33 }
34
35 static void pack (vorbis_info_floor *i,oggpack_buffer *opb){
36   vorbis_info_floor0 *d=(vorbis_info_floor0 *)i;
37   int j;
38   _oggpack_write(opb,d->order,8);
39   _oggpack_write(opb,d->rate,16);
40   _oggpack_write(opb,d->barkmap,16);
41   _oggpack_write(opb,d->stages,8);
42   for(j=0;j<d->stages;j++)
43     _oggpack_write(opb,d->books[j],8);
44 }
45
46 static vorbis_info_floor *unpack (vorbis_info *vi,oggpack_buffer *opb){
47   int j;
48   vorbis_info_floor0 *d=malloc(sizeof(vorbis_info_floor0));
49   d->order=_oggpack_read(opb,8);
50   d->rate=_oggpack_read(opb,16);
51   d->barkmap=_oggpack_read(opb,16);
52   d->stages=_oggpack_read(opb,8);
53   
54   if(d->order<1)goto err_out;
55   if(d->rate<1)goto err_out;
56   if(d->barkmap<1)goto err_out;
57   if(d->stages<1)goto err_out;
58
59   d->books=alloca(sizeof(int)*d->stages);
60   for(j=0;j<d->stages;j++){
61     d->books[j]=_oggpack_read(opb,8);
62     if(d->books[j]<0 || d->books[j]>=vi->books)goto err_out;
63   }
64   return(d);  
65  err_out:
66   free_info(d);
67   return(NULL);
68 }
69
70 static vorbis_look_floor *look (vorbis_info *vi,vorbis_info_mode *mi,
71                               vorbis_info_floor *i){
72
73 }
74
75 static int forward(vorbis_block *vb,vorbis_look_floor *i,
76                     double *in,double *out){
77
78
79       /* Convert our floor to a set of lpc coefficients 
80       vb->amp[i]=sqrt(vorbis_curve_to_lpc(floor,lpc,vl));
81
82       LSP <-> LPC is orthogonal and LSP quantizes more stably 
83       vorbis_lpc_to_lsp(lpc,lsp,vl->m);
84
85       code the spectral envelope; mutates the lsp coeffs to reflect
86       what was actually encoded 
87       _vs_spectrum_encode(vb,vb->amp[i],lsp);
88
89       Generate residue from the decoded envelope, which will be
90          slightly different to the pre-encoding floor due to
91          quantization.  Slow, yes, but perhaps more accurate 
92
93       vorbis_lsp_to_lpc(lsp,lpc,vl->m); 
94       vorbis_lpc_to_curve(curve,lpc,vb->amp[i],vl);*/
95   return(0);
96 }
97 static int inverse(vorbis_block *vb,vorbis_look_floor *i,
98                     double *buf){
99   return(0);
100 }
101
102 /* export hooks */
103 vorbis_func_floor floor0_exportbundle={
104   &pack,&unpack,&look,&free_info,&free_look,&forward,&inverse
105 };
106
107