Collect training data from the lib when compiled with -DTRAIN
[platform/upstream/libvorbis.git] / lib / res0.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: residue backend 0 implementation
15  last mod: $Id: res0.c,v 1.5 2000/02/12 08:33:09 xiphmont Exp $
16
17  ********************************************************************/
18
19 #include <stdlib.h>
20 #include <string.h>
21 #include <math.h>
22 #include <stdio.h>
23 #include "vorbis/codec.h"
24 #include "bitwise.h"
25 #include "registry.h"
26 #include "scales.h"
27
28 typedef struct {
29   vorbis_info_residue0 *info;
30   int bookpointers[64];
31 } vorbis_look_residue0;
32
33 void free_info(vorbis_info_residue *i){
34   if(i){
35     memset(i,0,sizeof(vorbis_info_residue0));
36     free(i);
37   }
38 }
39
40 void free_look(vorbis_look_residue *i){
41   if(i){
42     memset(i,0,sizeof(vorbis_look_residue0));
43     free(i);
44   }
45 }
46
47 /* not yet */
48 void pack(vorbis_info_residue *vr,oggpack_buffer *opb){
49   vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr;
50   int j,acc=0;
51   _oggpack_write(opb,info->begin,24);
52   _oggpack_write(opb,info->end,24);
53
54   _oggpack_write(opb,info->grouping-1,24);  /* residue vectors to group and 
55                                              code with a partitioned book */
56   _oggpack_write(opb,info->partitions-1,6); /* possible partition choices */
57   _oggpack_write(opb,info->groupspercode-1,6); /* partitioned group
58                                                 codes to encode at
59                                                 once */
60   _oggpack_write(opb,info->groupbook,8);  /* group huffman book */
61   for(j=0;j<info->partitions;j++){
62     _oggpack_write(opb,info->secondstages[j],4); /* zero *is* a valid choice */
63     acc+=info->secondstages[j];
64   }
65   for(j=0;j<acc;j++)
66     _oggpack_write(opb,info->booklist[j],8);
67
68 }
69
70 /* vorbis_info is for range checking */
71 vorbis_info_residue *unpack(vorbis_info *vi,oggpack_buffer *opb){
72   int j,acc=0;
73   vorbis_info_residue0 *ret=calloc(1,sizeof(vorbis_info_residue0));
74
75   ret->begin=_oggpack_read(opb,24);
76   ret->end=_oggpack_read(opb,24);
77   ret->grouping=_oggpack_read(opb,24)+1;
78   ret->partitions=_oggpack_read(opb,6)+1;
79   ret->groupspercode=_oggpack_read(opb,6)+1;
80   ret->groupbook=_oggpack_read(opb,8);
81   for(j=0;j<ret->partitions;j++)
82     acc+=ret->secondstages[j]=_oggpack_read(opb,4);
83   for(j=0;j<acc;j++)
84     ret->booklist[j]=_oggpack_read(opb,8);
85
86   if(ret->groupbook>=vi->books)goto errout;
87   for(j=0;j<acc;j++)
88     if(ret->booklist[j]>=vi->books)goto errout;
89
90   return(ret);
91  errout:
92   free_info(ret);
93   return(NULL);
94 }
95
96 vorbis_look_residue *look (vorbis_info *vi,vorbis_info_mode *vm,
97                           vorbis_info_residue *vr){
98   vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr;
99   vorbis_look_residue0 *look=calloc(1,sizeof(vorbis_look_residue0));
100   int j,acc=0;
101   look->info=info;
102   for(j=0;j<info->partitions;j++){
103     look->bookpointers[j]=acc;
104     acc+=info->secondstages[j];
105   }
106
107   return(look);
108 }
109
110 int forward(vorbis_block *vb,vorbis_look_residue *l,
111             double **in,int ch){
112   long i,j;
113   vorbis_look_residue0 *look=(vorbis_look_residue0 *)l;
114   vorbis_info_residue0 *info=look->info;
115   for(i=0;i<ch;i++)
116     for(j=0;j<vb->pcmend/2;j++)
117       _oggpack_write(&vb->opb,rint(in[i][j])+16,5);
118   return(0);
119 }
120
121 int inverse(vorbis_block *vb,vorbis_look_residue *l,double **in,int ch){
122   long i,j;
123   for(i=0;i<ch;i++)
124     for(j=0;j<vb->pcmend/2;j++)
125       in[i][j]*=_oggpack_read(&vb->opb,5)-16;
126   return(0);
127 }
128
129 vorbis_func_residue residue0_exportbundle={
130   &pack,
131   &unpack,
132   &look,
133   &free_info,
134   &free_look,
135   &forward,
136   &inverse
137 };