| /******************************************************************** |
| * * |
| * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * |
| * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * |
| * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * |
| * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * |
| * * |
| * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * |
| * by the Xiph.Org Foundation http://www.xiph.org/ * |
| |
| ******************************************************************** |
| |
| function: libvorbis codec headers |
| last mod: $Id: codec.h 17021 2010-03-24 09:29:41Z xiphmont $ |
| |
| ********************************************************************/ |
| |
| #ifndef _vorbis_codec_h_ |
| #define _vorbis_codec_h_ |
| |
| #ifdef __cplusplus |
| extern "C" |
| { |
| #endif /* __cplusplus */ |
| |
| #include <ogg/ogg.h> |
| |
| 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; |
| long bitrate_window; |
| |
| void *codec_setup; |
| } vorbis_info; |
| |
| /* 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; |
| |
| float **pcm; |
| float **pcmret; |
| int pcm_storage; |
| int pcm_current; |
| int pcm_returned; |
| |
| int preextrapolate; |
| int eofflag; |
| |
| long lW; |
| long W; |
| long nW; |
| long centerW; |
| |
| ogg_int64_t granulepos; |
| ogg_int64_t sequence; |
| |
| ogg_int64_t glue_bits; |
| ogg_int64_t time_bits; |
| ogg_int64_t floor_bits; |
| ogg_int64_t res_bits; |
| |
| void *backend_state; |
| } vorbis_dsp_state; |
| |
| typedef struct vorbis_block{ |
| /* necessary stream state for linking to the framing abstraction */ |
| float **pcm; /* this is a pointer into local storage */ |
| oggpack_buffer opb; |
| |
| long lW; |
| long W; |
| long nW; |
| int pcmend; |
| int mode; |
| |
| int eofflag; |
| ogg_int64_t granulepos; |
| ogg_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; |
| |
| void *internal; |
| |
| } vorbis_block; |
| |
| /* 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 independent from other vorbis_blocks belonging to |
| that logical bitstream. *************************************************/ |
| |
| struct alloc_chain{ |
| void *ptr; |
| struct alloc_chain *next; |
| }; |
| |
| /* 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 *comment_lengths; |
| 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 */ |
| |
| /* Vorbis PRIMITIVES: general ***************************************/ |
| |
| extern void vorbis_info_init(vorbis_info *vi); |
| extern void vorbis_info_clear(vorbis_info *vi); |
| extern int vorbis_info_blocksize(vorbis_info *vi,int zo); |
| extern void vorbis_comment_init(vorbis_comment *vc); |
| extern void vorbis_comment_add(vorbis_comment *vc, const char *comment); |
| extern void vorbis_comment_add_tag(vorbis_comment *vc, |
| const char *tag, const char *contents); |
| extern char *vorbis_comment_query(vorbis_comment *vc, const char *tag, int count); |
| extern int vorbis_comment_query_count(vorbis_comment *vc, const char *tag); |
| 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); |
| extern double vorbis_granule_time(vorbis_dsp_state *v, |
| ogg_int64_t granulepos); |
| |
| extern const char *vorbis_version_string(void); |
| |
| /* Vorbis PRIMITIVES: analysis/DSP layer ****************************/ |
| |
| extern int vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi); |
| extern int vorbis_commentheader_out(vorbis_comment *vc, ogg_packet *op); |
| extern int vorbis_analysis_headerout(vorbis_dsp_state *v, |
| vorbis_comment *vc, |
| ogg_packet *op, |
| ogg_packet *op_comm, |
| ogg_packet *op_code); |
| extern float **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); |
| |
| extern int vorbis_bitrate_addblock(vorbis_block *vb); |
| extern int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd, |
| ogg_packet *op); |
| |
| /* Vorbis PRIMITIVES: synthesis layer *******************************/ |
| extern int vorbis_synthesis_idheader(ogg_packet *op); |
| 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_restart(vorbis_dsp_state *v); |
| extern int vorbis_synthesis(vorbis_block *vb,ogg_packet *op); |
| extern int vorbis_synthesis_trackonly(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,float ***pcm); |
| extern int vorbis_synthesis_lapout(vorbis_dsp_state *v,float ***pcm); |
| extern int vorbis_synthesis_read(vorbis_dsp_state *v,int samples); |
| extern long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op); |
| |
| extern int vorbis_synthesis_halfrate(vorbis_info *v,int flag); |
| extern int vorbis_synthesis_halfrate_p(vorbis_info *v); |
| |
| /* Vorbis ERRORS and return codes ***********************************/ |
| |
| #define OV_FALSE -1 |
| #define OV_EOF -2 |
| #define OV_HOLE -3 |
| |
| #define OV_EREAD -128 |
| #define OV_EFAULT -129 |
| #define OV_EIMPL -130 |
| #define OV_EINVAL -131 |
| #define OV_ENOTVORBIS -132 |
| #define OV_EBADHEADER -133 |
| #define OV_EVERSION -134 |
| #define OV_ENOTAUDIO -135 |
| #define OV_EBADPACKET -136 |
| #define OV_EBADLINK -137 |
| #define OV_ENOSEEK -138 |
| |
| #ifdef __cplusplus |
| } |
| #endif /* __cplusplus */ |
| |
| #endif |
| |