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