1 /************************************************************************
2  * Copyright (C) 2002-2009, Xiph.org Foundation
3  * Copyright (C) 2010, Robin Watts for Pinknoise Productions Ltd
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  *     * Redistributions of source code must retain the above copyright
11  * notice, this list of conditions and the following disclaimer.
12  *     * Redistributions in binary form must reproduce the above
13  * copyright notice, this list of conditions and the following disclaimer
14  * in the documentation and/or other materials provided with the
15  * distribution.
16  *     * Neither the names of the Xiph.org Foundation nor Pinknoise
17  * Productions Ltd nor the names of its contributors may be used to
18  * endorse or promote products derived from this software without
19  * specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  ************************************************************************
33 
34  function: libvorbis codec headers
35 
36  ************************************************************************/
37 
38 #ifndef _V_CODECI_H_
39 #define _V_CODECI_H_
40 
41 #define CHUNKSIZE 1024
42 
43 #include "codebook.h"
44 #include "ivorbiscodec.h"
45 
46 #define VI_TRANSFORMB 1
47 #define VI_WINDOWB 1
48 #define VI_TIMEB 1
49 #define VI_FLOORB 2
50 #define VI_RESB 3
51 #define VI_MAPB 1
52 
53 typedef void vorbis_info_floor;
54 
55 /* vorbis_dsp_state buffers the current vorbis audio
56    analysis/synthesis state.  The DSP state belongs to a specific
57    logical bitstream ****************************************************/
58 struct vorbis_dsp_state{
59   vorbis_info    *vi;
60   oggpack_buffer  opb;
61 
62   ogg_int32_t   **work;
63   ogg_int32_t   **mdctright;
64   int             out_begin;
65   int             out_end;
66 
67   long lW;
68   long W;
69 
70   ogg_int64_t granulepos;
71   ogg_int64_t sequence;
72   ogg_int64_t sample_count;
73 
74 };
75 
76 
77 /* Floor backend generic *****************************************/
78 
79 extern vorbis_info_floor *floor0_info_unpack(vorbis_info *,oggpack_buffer *);
80 extern void floor0_free_info(vorbis_info_floor *);
81 extern int floor0_memosize(vorbis_info_floor *);
82 extern ogg_int32_t *floor0_inverse1(struct vorbis_dsp_state *,
83 				    vorbis_info_floor *,ogg_int32_t *);
84 extern int floor0_inverse2 (struct vorbis_dsp_state *,vorbis_info_floor *,
85 			    ogg_int32_t *buffer,ogg_int32_t *);
86 
87 extern vorbis_info_floor *floor1_info_unpack(vorbis_info *,oggpack_buffer *);
88 extern void floor1_free_info(vorbis_info_floor *);
89 extern int floor1_memosize(vorbis_info_floor *);
90 extern ogg_int32_t *floor1_inverse1(struct vorbis_dsp_state *,
91 				    vorbis_info_floor *,ogg_int32_t *);
92 extern int floor1_inverse2 (struct vorbis_dsp_state *,vorbis_info_floor *,
93 			    ogg_int32_t *buffer,ogg_int32_t *);
94 
95 typedef struct{
96   int   order;
97   long  rate;
98   long  barkmap;
99 
100   int   ampbits;
101   int   ampdB;
102 
103   int   numbooks; /* <= 16 */
104   char  books[16];
105 
106 } vorbis_info_floor0;
107 
108 typedef struct{
109   char  class_dim;        /* 1 to 8 */
110   char  class_subs;       /* 0,1,2,3 (bits: 1<<n poss) */
111   unsigned char  class_book;       /* subs ^ dim entries */
112   unsigned char  class_subbook[8]; /* [VIF_CLASS][subs] */
113 } floor1class;
114 
115 typedef struct{
116   floor1class  *klass;          /* [VIF_CLASS] */
117   ogg_uint8_t  *partitionclass; /* [VIF_PARTS]; 0 to 15 */
118   ogg_uint16_t *postlist;       /* [VIF_POSIT+2]; first two implicit */
119   ogg_uint8_t  *forward_index;  /* [VIF_POSIT+2]; */
120   ogg_uint8_t  *hineighbor;     /* [VIF_POSIT]; */
121   ogg_uint8_t  *loneighbor;     /* [VIF_POSIT]; */
122 
123   int          partitions;    /* 0 to 31 */
124   int          posts;
125   int          mult;          /* 1 2 3 or 4 */
126 
127 } vorbis_info_floor1;
128 
129 /* Residue backend generic *****************************************/
130 
131 typedef struct vorbis_info_residue{
132   int type;
133   unsigned char *stagemasks;
134   unsigned char *stagebooks;
135 
136 /* block-partitioned VQ coded straight residue */
137   long begin;
138   long end;
139 
140   /* first stage (lossless partitioning) */
141   int           grouping;         /* group n vectors per partition */
142   char          partitions;       /* possible codebooks for a partition */
143   unsigned char groupbook;        /* huffbook for partitioning */
144   char          stages;
145 } vorbis_info_residue;
146 
147 extern void res_clear_info(vorbis_info_residue *info);
148 extern int res_unpack(vorbis_info_residue *info,
149 		      vorbis_info *vi,oggpack_buffer *opb);
150 extern int res_inverse(vorbis_dsp_state *,vorbis_info_residue *info,
151 		       ogg_int32_t **in,int *nonzero,int ch);
152 
153 /* mode ************************************************************/
154 typedef struct {
155   unsigned char blockflag;
156   unsigned char mapping;
157 } vorbis_info_mode;
158 
159 /* Mapping backend generic *****************************************/
160 typedef struct coupling_step{
161   unsigned char mag;
162   unsigned char ang;
163 } coupling_step;
164 
165 typedef struct submap{
166   char floor;
167   char residue;
168 } submap;
169 
170 typedef struct vorbis_info_mapping{
171   int            submaps;
172 
173   unsigned char *chmuxlist;
174   submap        *submaplist;
175 
176   int            coupling_steps;
177   coupling_step *coupling;
178 } vorbis_info_mapping;
179 
180 extern int mapping_info_unpack(vorbis_info_mapping *,vorbis_info *,
181 			       oggpack_buffer *);
182 extern void mapping_clear_info(vorbis_info_mapping *);
183 extern int mapping_inverse(struct vorbis_dsp_state *,vorbis_info_mapping *);
184 
185 /* codec_setup_info contains all the setup information specific to the
186    specific compression/decompression mode in progress (eg,
187    psychoacoustic settings, channel setup, options, codebook
188    etc).
189 *********************************************************************/
190 
191 typedef struct codec_setup_info {
192 
193   /* Vorbis supports only short and long blocks, but allows the
194      encoder to choose the sizes */
195 
196   long blocksizes[2];
197 
198   /* modes are the primary means of supporting on-the-fly different
199      blocksizes, different channel mappings (LR or M/A),
200      different residue backends, etc.  Each mode consists of a
201      blocksize flag and a mapping (along with the mapping setup */
202 
203   int        modes;
204   int        maps;
205   int        floors;
206   int        residues;
207   int        books;
208 
209   vorbis_info_mode       *mode_param;
210   vorbis_info_mapping    *map_param;
211   char                   *floor_type;
212   vorbis_info_floor     **floor_param;
213   vorbis_info_residue    *residue_param;
214   codebook               *book_param;
215 
216 } codec_setup_info;
217 
218 extern int      vorbis_dsp_init(vorbis_dsp_state *v, vorbis_info *vi);
219 extern void     vorbis_dsp_clear(vorbis_dsp_state *v);
220 extern vorbis_dsp_state *vorbis_dsp_create(vorbis_info *vi);
221 extern void     vorbis_dsp_destroy(vorbis_dsp_state *v);
222 extern int      vorbis_dsp_headerin(vorbis_info *vi,vorbis_comment *vc,
223 				    ogg_packet *op);
224 
225 extern int      vorbis_dsp_restart(vorbis_dsp_state *v);
226 extern int      vorbis_dsp_synthesis(vorbis_dsp_state *vd,
227 				     ogg_packet *op,int decodep);
228 extern int      vorbis_dsp_pcmout(vorbis_dsp_state *v,
229 				  ogg_int16_t *pcm,int samples);
230 extern int      vorbis_dsp_read(vorbis_dsp_state *v,int samples);
231 extern long     vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op);
232 
233 
234 
235 #endif
236