167 lines
5.3 KiB
C++
167 lines
5.3 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-2009 *
|
|
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
|
* *
|
|
********************************************************************
|
|
|
|
function: libvorbis codec headers
|
|
|
|
********************************************************************/
|
|
|
|
#ifndef _V_CODECI_H_
|
|
#define _V_CODECI_H_
|
|
|
|
#include "envelope.h"
|
|
#include "codebook.h"
|
|
|
|
#define BLOCKTYPE_IMPULSE 0
|
|
#define BLOCKTYPE_PADDING 1
|
|
#define BLOCKTYPE_TRANSITION 0
|
|
#define BLOCKTYPE_LONG 1
|
|
|
|
#define PACKETBLOBS 15
|
|
|
|
typedef struct vorbis_block_internal{
|
|
float **pcmdelay; /* this is a pointer into local storage */
|
|
float ampmax;
|
|
int blocktype;
|
|
|
|
oggpack_buffer *packetblob[PACKETBLOBS]; /* initialized, must be freed;
|
|
blob [PACKETBLOBS/2] points to
|
|
the oggpack_buffer in the
|
|
main vorbis_block */
|
|
} vorbis_block_internal;
|
|
|
|
typedef void vorbis_look_floor;
|
|
typedef void vorbis_look_residue;
|
|
typedef void vorbis_look_transform;
|
|
|
|
/* mode ************************************************************/
|
|
typedef struct {
|
|
int blockflag;
|
|
int windowtype;
|
|
int transformtype;
|
|
int mapping;
|
|
} vorbis_info_mode;
|
|
|
|
typedef void vorbis_info_floor;
|
|
typedef void vorbis_info_residue;
|
|
typedef void vorbis_info_mapping;
|
|
|
|
#include "psy.h"
|
|
#include "bitrate.h"
|
|
|
|
typedef struct private_state {
|
|
/* local lookup storage */
|
|
envelope_lookup *ve; /* envelope lookup */
|
|
int window[2];
|
|
vorbis_look_transform **transform[2]; /* block, type */
|
|
drft_lookup fft_look[2];
|
|
|
|
int modebits;
|
|
vorbis_look_floor **flr;
|
|
vorbis_look_residue **residue;
|
|
vorbis_look_psy *psy;
|
|
vorbis_look_psy_global *psy_g_look;
|
|
|
|
/* 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 */
|
|
unsigned char *header;
|
|
unsigned char *header1;
|
|
unsigned char *header2;
|
|
|
|
bitrate_manager_state bms;
|
|
|
|
ogg_int64_t sample_count;
|
|
} private_state;
|
|
|
|
/* codec_setup_info contains all the setup information specific to the
|
|
specific compression/decompression mode in progress (eg,
|
|
psychoacoustic settings, channel setup, options, codebook
|
|
etc).
|
|
*********************************************************************/
|
|
|
|
#include "highlevel.h"
|
|
typedef struct codec_setup_info {
|
|
|
|
/* 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 M/A),
|
|
different residue backends, etc. Each mode consists of a
|
|
blocksize flag and a mapping (along with the mapping setup */
|
|
|
|
int modes;
|
|
int maps;
|
|
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 floor_type[64];
|
|
vorbis_info_floor *floor_param[64];
|
|
int residue_type[64];
|
|
vorbis_info_residue *residue_param[64];
|
|
static_codebook *book_param[256];
|
|
codebook *fullbooks;
|
|
|
|
vorbis_info_psy *psy_param[4]; /* encode only */
|
|
vorbis_info_psy_global psy_g_param;
|
|
|
|
bitrate_manager_info bi;
|
|
highlevel_encode_setup hi; /* used only by vorbisenc.c. It's a
|
|
highly redundant structure, but
|
|
improves clarity of program flow. */
|
|
int halfrate_flag; /* painless downsample for decode */
|
|
} codec_setup_info;
|
|
|
|
extern vorbis_look_psy_global *_vp_global_look(vorbis_info *vi);
|
|
extern void _vp_global_free(vorbis_look_psy_global *look);
|
|
|
|
|
|
|
|
typedef struct {
|
|
int sorted_index[VIF_POSIT+2];
|
|
int forward_index[VIF_POSIT+2];
|
|
int reverse_index[VIF_POSIT+2];
|
|
|
|
int hineighbor[VIF_POSIT];
|
|
int loneighbor[VIF_POSIT];
|
|
int posts;
|
|
|
|
int n;
|
|
int quant_q;
|
|
vorbis_info_floor1 *vi;
|
|
|
|
long phrasebits;
|
|
long postbits;
|
|
long frames;
|
|
} vorbis_look_floor1;
|
|
|
|
|
|
|
|
extern int *floor1_fit(vorbis_block *vb,vorbis_look_floor1 *look,
|
|
const float *logmdct, /* in */
|
|
const float *logmask);
|
|
extern int *floor1_interpolate_fit(vorbis_block *vb,vorbis_look_floor1 *look,
|
|
int *A,int *B,
|
|
int del);
|
|
extern int floor1_encode(oggpack_buffer *opb,vorbis_block *vb,
|
|
vorbis_look_floor1 *look,
|
|
int *post,int *ilogmask);
|
|
#endif
|