nuclear@1: /******************************************************************** nuclear@1: * * nuclear@1: * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * nuclear@1: * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * nuclear@1: * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * nuclear@1: * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * nuclear@1: * * nuclear@1: * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * nuclear@1: * by the Xiph.Org Foundation http://www.xiph.org/ * nuclear@1: nuclear@1: ******************************************************************** nuclear@1: nuclear@1: function: libvorbis codec headers nuclear@1: last mod: $Id: codec.h 17021 2010-03-24 09:29:41Z xiphmont $ nuclear@1: nuclear@1: ********************************************************************/ nuclear@1: nuclear@1: #ifndef _vorbis_codec_h_ nuclear@1: #define _vorbis_codec_h_ nuclear@1: nuclear@1: #ifdef __cplusplus nuclear@1: extern "C" nuclear@1: { nuclear@1: #endif /* __cplusplus */ nuclear@1: nuclear@1: #include nuclear@1: nuclear@1: typedef struct vorbis_info{ nuclear@1: int version; nuclear@1: int channels; nuclear@1: long rate; nuclear@1: nuclear@1: /* The below bitrate declarations are *hints*. nuclear@1: Combinations of the three values carry the following implications: nuclear@1: nuclear@1: all three set to the same value: nuclear@1: implies a fixed rate bitstream nuclear@1: only nominal set: nuclear@1: implies a VBR stream that averages the nominal bitrate. No hard nuclear@1: upper/lower limit nuclear@1: upper and or lower set: nuclear@1: implies a VBR bitstream that obeys the bitrate limits. nominal nuclear@1: may also be set to give a nominal rate. nuclear@1: none set: nuclear@1: the coder does not care to speculate. nuclear@1: */ nuclear@1: nuclear@1: long bitrate_upper; nuclear@1: long bitrate_nominal; nuclear@1: long bitrate_lower; nuclear@1: long bitrate_window; nuclear@1: nuclear@1: void *codec_setup; nuclear@1: } vorbis_info; nuclear@1: nuclear@1: /* vorbis_dsp_state buffers the current vorbis audio nuclear@1: analysis/synthesis state. The DSP state belongs to a specific nuclear@1: logical bitstream ****************************************************/ nuclear@1: typedef struct vorbis_dsp_state{ nuclear@1: int analysisp; nuclear@1: vorbis_info *vi; nuclear@1: nuclear@1: float **pcm; nuclear@1: float **pcmret; nuclear@1: int pcm_storage; nuclear@1: int pcm_current; nuclear@1: int pcm_returned; nuclear@1: nuclear@1: int preextrapolate; nuclear@1: int eofflag; nuclear@1: nuclear@1: long lW; nuclear@1: long W; nuclear@1: long nW; nuclear@1: long centerW; nuclear@1: nuclear@1: ogg_int64_t granulepos; nuclear@1: ogg_int64_t sequence; nuclear@1: nuclear@1: ogg_int64_t glue_bits; nuclear@1: ogg_int64_t time_bits; nuclear@1: ogg_int64_t floor_bits; nuclear@1: ogg_int64_t res_bits; nuclear@1: nuclear@1: void *backend_state; nuclear@1: } vorbis_dsp_state; nuclear@1: nuclear@1: typedef struct vorbis_block{ nuclear@1: /* necessary stream state for linking to the framing abstraction */ nuclear@1: float **pcm; /* this is a pointer into local storage */ nuclear@1: oggpack_buffer opb; nuclear@1: nuclear@1: long lW; nuclear@1: long W; nuclear@1: long nW; nuclear@1: int pcmend; nuclear@1: int mode; nuclear@1: nuclear@1: int eofflag; nuclear@1: ogg_int64_t granulepos; nuclear@1: ogg_int64_t sequence; nuclear@1: vorbis_dsp_state *vd; /* For read-only access of configuration */ nuclear@1: nuclear@1: /* local storage to avoid remallocing; it's up to the mapping to nuclear@1: structure it */ nuclear@1: void *localstore; nuclear@1: long localtop; nuclear@1: long localalloc; nuclear@1: long totaluse; nuclear@1: struct alloc_chain *reap; nuclear@1: nuclear@1: /* bitmetrics for the frame */ nuclear@1: long glue_bits; nuclear@1: long time_bits; nuclear@1: long floor_bits; nuclear@1: long res_bits; nuclear@1: nuclear@1: void *internal; nuclear@1: nuclear@1: } vorbis_block; nuclear@1: nuclear@1: /* vorbis_block is a single block of data to be processed as part of nuclear@1: the analysis/synthesis stream; it belongs to a specific logical nuclear@1: bitstream, but is independent from other vorbis_blocks belonging to nuclear@1: that logical bitstream. *************************************************/ nuclear@1: nuclear@1: struct alloc_chain{ nuclear@1: void *ptr; nuclear@1: struct alloc_chain *next; nuclear@1: }; nuclear@1: nuclear@1: /* vorbis_info contains all the setup information specific to the nuclear@1: specific compression/decompression mode in progress (eg, nuclear@1: psychoacoustic settings, channel setup, options, codebook nuclear@1: etc). vorbis_info and substructures are in backends.h. nuclear@1: *********************************************************************/ nuclear@1: nuclear@1: /* the comments are not part of vorbis_info so that vorbis_info can be nuclear@1: static storage */ nuclear@1: typedef struct vorbis_comment{ nuclear@1: /* unlimited user comment fields. libvorbis writes 'libvorbis' nuclear@1: whatever vendor is set to in encode */ nuclear@1: char **user_comments; nuclear@1: int *comment_lengths; nuclear@1: int comments; nuclear@1: char *vendor; nuclear@1: nuclear@1: } vorbis_comment; nuclear@1: nuclear@1: nuclear@1: /* libvorbis encodes in two abstraction layers; first we perform DSP nuclear@1: and produce a packet (see docs/analysis.txt). The packet is then nuclear@1: coded into a framed OggSquish bitstream by the second layer (see nuclear@1: docs/framing.txt). Decode is the reverse process; we sync/frame nuclear@1: the bitstream and extract individual packets, then decode the nuclear@1: packet back into PCM audio. nuclear@1: nuclear@1: The extra framing/packetizing is used in streaming formats, such as nuclear@1: files. Over the net (such as with UDP), the framing and nuclear@1: packetization aren't necessary as they're provided by the transport nuclear@1: and the streaming layer is not used */ nuclear@1: nuclear@1: /* Vorbis PRIMITIVES: general ***************************************/ nuclear@1: nuclear@1: extern void vorbis_info_init(vorbis_info *vi); nuclear@1: extern void vorbis_info_clear(vorbis_info *vi); nuclear@1: extern int vorbis_info_blocksize(vorbis_info *vi,int zo); nuclear@1: extern void vorbis_comment_init(vorbis_comment *vc); nuclear@1: extern void vorbis_comment_add(vorbis_comment *vc, const char *comment); nuclear@1: extern void vorbis_comment_add_tag(vorbis_comment *vc, nuclear@1: const char *tag, const char *contents); nuclear@1: extern char *vorbis_comment_query(vorbis_comment *vc, const char *tag, int count); nuclear@1: extern int vorbis_comment_query_count(vorbis_comment *vc, const char *tag); nuclear@1: extern void vorbis_comment_clear(vorbis_comment *vc); nuclear@1: nuclear@1: extern int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb); nuclear@1: extern int vorbis_block_clear(vorbis_block *vb); nuclear@1: extern void vorbis_dsp_clear(vorbis_dsp_state *v); nuclear@1: extern double vorbis_granule_time(vorbis_dsp_state *v, nuclear@1: ogg_int64_t granulepos); nuclear@1: nuclear@1: extern const char *vorbis_version_string(void); nuclear@1: nuclear@1: /* Vorbis PRIMITIVES: analysis/DSP layer ****************************/ nuclear@1: nuclear@1: extern int vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi); nuclear@1: extern int vorbis_commentheader_out(vorbis_comment *vc, ogg_packet *op); nuclear@1: extern int vorbis_analysis_headerout(vorbis_dsp_state *v, nuclear@1: vorbis_comment *vc, nuclear@1: ogg_packet *op, nuclear@1: ogg_packet *op_comm, nuclear@1: ogg_packet *op_code); nuclear@1: extern float **vorbis_analysis_buffer(vorbis_dsp_state *v,int vals); nuclear@1: extern int vorbis_analysis_wrote(vorbis_dsp_state *v,int vals); nuclear@1: extern int vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb); nuclear@1: extern int vorbis_analysis(vorbis_block *vb,ogg_packet *op); nuclear@1: nuclear@1: extern int vorbis_bitrate_addblock(vorbis_block *vb); nuclear@1: extern int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd, nuclear@1: ogg_packet *op); nuclear@1: nuclear@1: /* Vorbis PRIMITIVES: synthesis layer *******************************/ nuclear@1: extern int vorbis_synthesis_idheader(ogg_packet *op); nuclear@1: extern int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc, nuclear@1: ogg_packet *op); nuclear@1: nuclear@1: extern int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi); nuclear@1: extern int vorbis_synthesis_restart(vorbis_dsp_state *v); nuclear@1: extern int vorbis_synthesis(vorbis_block *vb,ogg_packet *op); nuclear@1: extern int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op); nuclear@1: extern int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb); nuclear@1: extern int vorbis_synthesis_pcmout(vorbis_dsp_state *v,float ***pcm); nuclear@1: extern int vorbis_synthesis_lapout(vorbis_dsp_state *v,float ***pcm); nuclear@1: extern int vorbis_synthesis_read(vorbis_dsp_state *v,int samples); nuclear@1: extern long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op); nuclear@1: nuclear@1: extern int vorbis_synthesis_halfrate(vorbis_info *v,int flag); nuclear@1: extern int vorbis_synthesis_halfrate_p(vorbis_info *v); nuclear@1: nuclear@1: /* Vorbis ERRORS and return codes ***********************************/ nuclear@1: nuclear@1: #define OV_FALSE -1 nuclear@1: #define OV_EOF -2 nuclear@1: #define OV_HOLE -3 nuclear@1: nuclear@1: #define OV_EREAD -128 nuclear@1: #define OV_EFAULT -129 nuclear@1: #define OV_EIMPL -130 nuclear@1: #define OV_EINVAL -131 nuclear@1: #define OV_ENOTVORBIS -132 nuclear@1: #define OV_EBADHEADER -133 nuclear@1: #define OV_EVERSION -134 nuclear@1: #define OV_ENOTAUDIO -135 nuclear@1: #define OV_EBADPACKET -136 nuclear@1: #define OV_EBADLINK -137 nuclear@1: #define OV_ENOSEEK -138 nuclear@1: nuclear@1: #ifdef __cplusplus nuclear@1: } nuclear@1: #endif /* __cplusplus */ nuclear@1: nuclear@1: #endif nuclear@1: