/************************************************************************ * Copyright (C) 2002-2009, Xiph.org Foundation * Copyright (C) 2010, Robin Watts for Pinknoise Productions Ltd * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. * * Neither the names of the Xiph.org Foundation nor Pinknoise * Productions Ltd nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ************************************************************************ function: libvorbis codec headers ************************************************************************/ #ifndef _V_CODECI_H_ #define _V_CODECI_H_ #define CHUNKSIZE 1024 #include "codebook.h" #include "ivorbiscodec.h" #define VI_TRANSFORMB 1 #define VI_WINDOWB 1 #define VI_TIMEB 1 #define VI_FLOORB 2 #define VI_RESB 3 #define VI_MAPB 1 typedef void vorbis_info_floor; /* vorbis_dsp_state buffers the current vorbis audio analysis/synthesis state. The DSP state belongs to a specific logical bitstream ****************************************************/ struct vorbis_dsp_state{ vorbis_info *vi; oggpack_buffer opb; ogg_int32_t **work; ogg_int32_t **mdctright; int out_begin; int out_end; long lW; long W; ogg_int64_t granulepos; ogg_int64_t sequence; ogg_int64_t sample_count; }; /* Floor backend generic *****************************************/ extern vorbis_info_floor *floor0_info_unpack(vorbis_info *,oggpack_buffer *); extern void floor0_free_info(vorbis_info_floor *); extern int floor0_memosize(vorbis_info_floor *); extern ogg_int32_t *floor0_inverse1(struct vorbis_dsp_state *, vorbis_info_floor *,ogg_int32_t *); extern int floor0_inverse2 (struct vorbis_dsp_state *,vorbis_info_floor *, ogg_int32_t *buffer,ogg_int32_t *); extern vorbis_info_floor *floor1_info_unpack(vorbis_info *,oggpack_buffer *); extern void floor1_free_info(vorbis_info_floor *); extern int floor1_memosize(vorbis_info_floor *); extern ogg_int32_t *floor1_inverse1(struct vorbis_dsp_state *, vorbis_info_floor *,ogg_int32_t *); extern int floor1_inverse2 (struct vorbis_dsp_state *,vorbis_info_floor *, ogg_int32_t *buffer,ogg_int32_t *); typedef struct{ int order; long rate; long barkmap; int ampbits; int ampdB; int numbooks; /* <= 16 */ char books[16]; } vorbis_info_floor0; typedef struct{ char class_dim; /* 1 to 8 */ char class_subs; /* 0,1,2,3 (bits: 1<<n poss) */ unsigned char class_book; /* subs ^ dim entries */ unsigned char class_subbook[8]; /* [VIF_CLASS][subs] */ } floor1class; typedef struct{ floor1class *klass; /* [VIF_CLASS] */ char *partitionclass; /* [VIF_PARTS]; 0 to 15 */ ogg_uint16_t *postlist; /* [VIF_POSIT+2]; first two implicit */ char *forward_index; /* [VIF_POSIT+2]; */ char *hineighbor; /* [VIF_POSIT]; */ char *loneighbor; /* [VIF_POSIT]; */ int partitions; /* 0 to 31 */ int posts; int mult; /* 1 2 3 or 4 */ } vorbis_info_floor1; /* Residue backend generic *****************************************/ typedef struct vorbis_info_residue{ int type; unsigned char *stagemasks; unsigned char *stagebooks; /* block-partitioned VQ coded straight residue */ long begin; long end; /* first stage (lossless partitioning) */ int grouping; /* group n vectors per partition */ char partitions; /* possible codebooks for a partition */ unsigned char groupbook; /* huffbook for partitioning */ char stages; } vorbis_info_residue; extern void res_clear_info(vorbis_info_residue *info); extern int res_unpack(vorbis_info_residue *info, vorbis_info *vi,oggpack_buffer *opb); extern int res_inverse(vorbis_dsp_state *,vorbis_info_residue *info, ogg_int32_t **in,int *nonzero,int ch); /* mode ************************************************************/ typedef struct { unsigned char blockflag; unsigned char mapping; } vorbis_info_mode; /* Mapping backend generic *****************************************/ typedef struct coupling_step{ unsigned char mag; unsigned char ang; } coupling_step; typedef struct submap{ char floor; char residue; } submap; typedef struct vorbis_info_mapping{ int submaps; unsigned char *chmuxlist; submap *submaplist; int coupling_steps; coupling_step *coupling; } vorbis_info_mapping; extern int mapping_info_unpack(vorbis_info_mapping *,vorbis_info *, oggpack_buffer *); extern void mapping_clear_info(vorbis_info_mapping *); extern int mapping_inverse(struct vorbis_dsp_state *,vorbis_info_mapping *); /* codec_setup_info contains all the setup information specific to the specific compression/decompression mode in progress (eg, psychoacoustic settings, channel setup, options, codebook etc). *********************************************************************/ typedef struct codec_setup_info { /* Vorbis supports only short and long blocks, but allows the encoder to choose the sizes */ long blocksizes[2]; /* modes are the primary means of supporting on-the-fly different blocksizes, different channel mappings (LR or M/A), different residue backends, etc. Each mode consists of a blocksize flag and a mapping (along with the mapping setup */ int modes; int maps; int floors; int residues; int books; vorbis_info_mode *mode_param; vorbis_info_mapping *map_param; char *floor_type; vorbis_info_floor **floor_param; vorbis_info_residue *residue_param; codebook *book_param; } codec_setup_info; extern int vorbis_dsp_init(vorbis_dsp_state *v, vorbis_info *vi); extern void vorbis_dsp_clear(vorbis_dsp_state *v); extern vorbis_dsp_state *vorbis_dsp_create(vorbis_info *vi); extern void vorbis_dsp_destroy(vorbis_dsp_state *v); extern int vorbis_dsp_headerin(vorbis_info *vi,vorbis_comment *vc, ogg_packet *op); extern int vorbis_dsp_restart(vorbis_dsp_state *v); extern int vorbis_dsp_synthesis(vorbis_dsp_state *vd, ogg_packet *op,int decodep); extern int vorbis_dsp_pcmout(vorbis_dsp_state *v, ogg_int16_t *pcm,int samples); extern int vorbis_dsp_read(vorbis_dsp_state *v,int samples); extern long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op); #endif