38c5ba85ab
Fixes various bugs, including several ones with security relevance.
Changes: https://github.com/xiph/vorbis/releases/tag/v1.3.7
(cherry picked from commit 28ad2e8c72
)
242 lines
8.2 KiB
C++
242 lines
8.2 KiB
C++
/********************************************************************
|
|
* *
|
|
* 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 https://xiph.org/ *
|
|
|
|
********************************************************************
|
|
|
|
function: libvorbis codec headers
|
|
|
|
********************************************************************/
|
|
|
|
#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
|
|
|