/tags/rel-0-2-0/FreeSpeech/audio_blocks/include/codec.h
# · C++ Header · 439 lines · 251 code · 81 blank · 107 comment · 0 complexity · 13c4b9b5e23fb908251bc4c653eb8218 MD5 · raw file
- /********************************************************************
- * *
- * THIS FILE IS PART OF THE Ogg Vorbis SOFTWARE CODEC SOURCE CODE. *
- * USE, DISTRIBUTION AND REPRODUCTION OF THIS SOURCE IS GOVERNED BY *
- * THE GNU PUBLIC LICENSE 2, WHICH IS INCLUDED WITH THIS SOURCE. *
- * PLEASE READ THESE TERMS DISTRIBUTING. *
- * *
- * THE OggSQUISH SOURCE CODE IS (C) COPYRIGHT 1994-2000 *
- * by Monty <monty@xiph.org> and The XIPHOPHORUS Company *
- * http://www.xiph.org/ *
- * *
- ********************************************************************
- function: libvorbis codec headers
- last mod: $Id: codec.h 711 2000-07-06 04:55:07Z jmvalin $
- ********************************************************************/
- #ifndef _vorbis_codec_h_
- #define _vorbis_codec_h_
- #ifdef __cplusplus
- extern "C"
- {
- #endif /* __cplusplus */
- #define MAX_BARK 27
- #include <sys/types.h>
- //#include "os_types.h"
- #include "codebook.h"
- #include "internal.h"
- typedef void vorbis_look_transform;
- typedef void vorbis_info_time;
- typedef void vorbis_look_time;
- typedef void vorbis_info_floor;
- typedef void vorbis_look_floor;
- typedef void vorbis_echstate_floor;
- typedef void vorbis_info_residue;
- typedef void vorbis_look_residue;
- typedef void vorbis_info_mapping;
- typedef void vorbis_look_mapping;
- /* mode ************************************************************/
- typedef struct {
- int blockflag;
- int windowtype;
- int transformtype;
- int mapping;
- } vorbis_info_mode;
- /* psychoacoustic setup ********************************************/
- typedef struct vorbis_info_psy{
- int athp;
- int decayp;
- int smoothp;
- int noisefitp;
- int noisefit_subblock;
- double noisefit_threshdB;
- double ath_att;
- int tonemaskp;
- double toneatt_125Hz[5];
- double toneatt_250Hz[5];
- double toneatt_500Hz[5];
- double toneatt_1000Hz[5];
- double toneatt_2000Hz[5];
- double toneatt_4000Hz[5];
- double toneatt_8000Hz[5];
- int peakattp;
- double peakatt_125Hz[5];
- double peakatt_250Hz[5];
- double peakatt_500Hz[5];
- double peakatt_1000Hz[5];
- double peakatt_2000Hz[5];
- double peakatt_4000Hz[5];
- double peakatt_8000Hz[5];
- int noisemaskp;
- double noiseatt_125Hz[5];
- double noiseatt_250Hz[5];
- double noiseatt_500Hz[5];
- double noiseatt_1000Hz[5];
- double noiseatt_2000Hz[5];
- double noiseatt_4000Hz[5];
- double noiseatt_8000Hz[5];
- double max_curve_dB;
- double attack_coeff;
- double decay_coeff;
- } vorbis_info_psy;
- /* vorbis_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 vorbis_info{
- int version;
- int channels;
- long rate;
- /* The below bitrate declarations are *hints*.
- Combinations of the three values carry the following implications:
-
- all three set to the same value:
- implies a fixed rate bitstream
- only nominal set:
- implies a VBR stream that averages the nominal bitrate. No hard
- upper/lower limit
- upper and or lower set:
- implies a VBR bitstream that obeys the bitrate limits. nominal
- may also be set to give a nominal rate.
- none set:
- the coder does not care to speculate.
- */
- long bitrate_upper;
- long bitrate_nominal;
- long bitrate_lower;
- /* 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 mid-side),
- different residue backends, etc. Each mode consists of a
- blocksize flag and a mapping (along with the mapping setup */
- int modes;
- int maps;
- int times;
- int floors;
- int residues;
- int books;
- int psys; /* encode only */
- vorbis_info_mode *mode_param[64];
- int map_type[64];
- vorbis_info_mapping *map_param[64];
- int time_type[64];
- vorbis_info_time *time_param[64];
- int floor_type[64];
- vorbis_info_floor *floor_param[64];
- int residue_type[64];
- vorbis_info_residue *residue_param[64];
- static_codebook *book_param[256];
- vorbis_info_psy *psy_param[64]; /* encode only */
-
- /* for block long/sort tuning; encode only */
- int envelopesa;
- double preecho_thresh;
- double preecho_clamp;
- } vorbis_info;
-
- /* ogg_page is used to encapsulate the data in one Ogg bitstream page *****/
- typedef struct {
- unsigned char *header;
- long header_len;
- unsigned char *body;
- long body_len;
- } ogg_page;
- /* ogg_stream_state contains the current encode/decode state of a logical
- Ogg bitstream **********************************************************/
- typedef struct {
- unsigned char *body_data; /* bytes from packet bodies */
- long body_storage; /* storage elements allocated */
- long body_fill; /* elements stored; fill mark */
- long body_returned; /* elements of fill returned */
- int *lacing_vals; /* The values that will go to the segment table */
- int64_t *pcm_vals; /* pcm_pos values for headers. Not compact
- this way, but it is simple coupled to the
- lacing fifo */
- long lacing_storage;
- long lacing_fill;
- long lacing_packet;
- long lacing_returned;
- unsigned char header[282]; /* working space for header encode */
- int header_fill;
- int e_o_s; /* set when we have buffered the last packet in the
- logical bitstream */
- int b_o_s; /* set after we've written the initial page
- of a logical bitstream */
- long serialno;
- int pageno;
- int64_t packetno; /* sequence number for decode; the framing
- knows where there's a hole in the data,
- but we need coupling so that the codec
- (which is in a seperate abstraction
- layer) also knows about the gap */
- int64_t pcmpos;
- } ogg_stream_state;
- /* ogg_packet is used to encapsulate the data and metadata belonging
- to a single raw Ogg/Vorbis packet *************************************/
- typedef struct {
- unsigned char *packet;
- long bytes;
- long b_o_s;
- long e_o_s;
- int64_t frameno;
- int64_t packetno; /* sequence number for decode; the framing
- knows where there's a hole in the data,
- but we need coupling so that the codec
- (which is in a seperate abstraction
- layer) also knows about the gap */
- } ogg_packet;
- typedef struct {
- unsigned char *data;
- int storage;
- int fill;
- int returned;
- int unsynced;
- int headerbytes;
- int bodybytes;
- } ogg_sync_state;
- /* vorbis_dsp_state buffers the current vorbis audio
- analysis/synthesis state. The DSP state belongs to a specific
- logical bitstream ****************************************************/
- typedef struct vorbis_dsp_state{
- int analysisp;
- vorbis_info *vi;
- int modebits;
- double **pcm;
- double **pcmret;
- int pcm_storage;
- int pcm_current;
- int pcm_returned;
- double *multipliers;
- int envelope_storage;
- int envelope_current;
- int eofflag;
- long lW;
- long W;
- long nW;
- long centerW;
- int64_t frameno;
- int64_t sequence;
- int64_t glue_bits;
- int64_t time_bits;
- int64_t floor_bits;
- int64_t res_bits;
- /* local lookup storage */
- envelope_lookup ve; /* envelope */
- double **window[2][2][2]; /* block, leadin, leadout, type */
- vorbis_look_transform **transform[2]; /* block, type */
- codebook *fullbooks;
- /* backend lookups are tied to the mode, not the backend or naked mapping */
- vorbis_look_mapping **mode;
- /* local storage, only used on the encoding side. This way the
- application does not need to worry about freeing some packets'
- memory and not others'; packet storage is always tracked.
- Cleared next call to a _dsp_ function */
- char *header;
- char *header1;
- char *header2;
- } vorbis_dsp_state;
- /* vorbis_block is a single block of data to be processed as part of
- the analysis/synthesis stream; it belongs to a specific logical
- bitstream, but is independant from other vorbis_blocks belonging to
- that logical bitstream. *************************************************/
- struct alloc_chain{
- void *ptr;
- struct alloc_chain *next;
- };
- typedef struct vorbis_block{
- /* necessary stream state for linking to the framing abstraction */
- double **pcm; /* this is a pointer into local storage */
- oggpack_buffer opb;
-
- long lW;
- long W;
- long nW;
- int pcmend;
- int mode;
- int eofflag;
- int64_t frameno;
- int64_t sequence;
- vorbis_dsp_state *vd; /* For read-only access of configuration */
- /* local storage to avoid remallocing; it's up to the mapping to
- structure it */
- void *localstore;
- long localtop;
- long localalloc;
- long totaluse;
- struct alloc_chain *reap;
- /* bitmetrics for the frame */
- long glue_bits;
- long time_bits;
- long floor_bits;
- long res_bits;
- } vorbis_block;
- //#include "vorbis/backends.h"
- /* vorbis_info contains all the setup information specific to the
- specific compression/decompression mode in progress (eg,
- psychoacoustic settings, channel setup, options, codebook
- etc). vorbis_info and substructures are in backends.h.
- *********************************************************************/
- /* the comments are not part of vorbis_info so that vorbis_info can be
- static storage */
- typedef struct vorbis_comment{
- /* unlimited user comment fields. libvorbis writes 'libvorbis'
- whatever vendor is set to in encode */
- char **user_comments;
- int comments;
- char *vendor;
- } vorbis_comment;
- /* libvorbis encodes in two abstraction layers; first we perform DSP
- and produce a packet (see docs/analysis.txt). The packet is then
- coded into a framed OggSquish bitstream by the second layer (see
- docs/framing.txt). Decode is the reverse process; we sync/frame
- the bitstream and extract individual packets, then decode the
- packet back into PCM audio.
- The extra framing/packetizing is used in streaming formats, such as
- files. Over the net (such as with UDP), the framing and
- packetization aren't necessary as they're provided by the transport
- and the streaming layer is not used */
- /* OggSquish BITSREAM PRIMITIVES: encoding **************************/
- extern int ogg_stream_packetin(ogg_stream_state *os, ogg_packet *op);
- extern int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og);
- /* OggSquish BITSREAM PRIMITIVES: decoding **************************/
- extern int ogg_sync_init(ogg_sync_state *oy);
- extern int ogg_sync_clear(ogg_sync_state *oy);
- extern int ogg_sync_destroy(ogg_sync_state *oy);
- extern int ogg_sync_reset(ogg_sync_state *oy);
- extern char *ogg_sync_buffer(ogg_sync_state *oy, long size);
- extern int ogg_sync_wrote(ogg_sync_state *oy, long bytes);
- extern long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og);
- extern int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og);
- extern int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og);
- extern int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op);
- /* OggSquish BITSREAM PRIMITIVES: general ***************************/
- extern int ogg_stream_init(ogg_stream_state *os,int serialno);
- extern int ogg_stream_clear(ogg_stream_state *os);
- extern int ogg_stream_reset(ogg_stream_state *os);
- extern int ogg_stream_destroy(ogg_stream_state *os);
- extern int ogg_stream_eof(ogg_stream_state *os);
- extern int ogg_page_version(ogg_page *og);
- extern int ogg_page_continued(ogg_page *og);
- extern int ogg_page_bos(ogg_page *og);
- extern int ogg_page_eos(ogg_page *og);
- extern int64_t ogg_page_frameno(ogg_page *og);
- extern int ogg_page_serialno(ogg_page *og);
- extern int ogg_page_pageno(ogg_page *og);
- /* Vorbis PRIMITIVES: general ***************************************/
- extern void vorbis_info_init(vorbis_info *vi);
- extern void vorbis_info_clear(vorbis_info *vi);
- extern void vorbis_comment_init(vorbis_comment *vc);
- extern void vorbis_comment_add(vorbis_comment *vc, char *comment);
- extern void vorbis_comment_clear(vorbis_comment *vc);
- extern int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb);
- extern int vorbis_block_clear(vorbis_block *vb);
- extern void vorbis_dsp_clear(vorbis_dsp_state *v);
- /* Vorbis PRIMITIVES: analysis/DSP layer ****************************/
- extern int vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi);
- extern int vorbis_analysis_headerout(vorbis_dsp_state *v,
- vorbis_comment *vc,
- ogg_packet *op,
- ogg_packet *op_comm,
- ogg_packet *op_code);
- extern double **vorbis_analysis_buffer(vorbis_dsp_state *v,int vals);
- extern int vorbis_analysis_wrote(vorbis_dsp_state *v,int vals);
- extern int vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb);
- extern int vorbis_analysis(vorbis_block *vb,ogg_packet *op);
- /* Vorbis PRIMITIVES: synthesis layer *******************************/
- extern int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc,
- ogg_packet *op);
- extern int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi);
- extern int vorbis_synthesis(vorbis_block *vb,ogg_packet *op);
- extern int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb);
- extern int vorbis_synthesis_pcmout(vorbis_dsp_state *v,double ***pcm);
- extern int vorbis_synthesis_read(vorbis_dsp_state *v,int samples);
- #ifdef __cplusplus
- }
- #endif /* __cplusplus */
- #endif