mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 555121 - Update in-tree libvorbis to 1.3.1. rs=chris.double
--HG-- extra : rebase_source : 660f5c0c93d1f62fc8e63e4e4f665974b8d620d1
This commit is contained in:
parent
e3a4c442e6
commit
15fdce5e2a
@ -3,12 +3,10 @@ subversion repository using the update.sh script. The only changes
|
|||||||
made were those applied by update.sh and the addition/upate of
|
made were those applied by update.sh and the addition/upate of
|
||||||
Makefile.in files for the Mozilla build system.
|
Makefile.in files for the Mozilla build system.
|
||||||
|
|
||||||
The svn revision number used was r16597.
|
The upstream release used was libvorbis 1.3.1.
|
||||||
|
|
||||||
Some files are renamed during the copy to prevent clashes with object
|
Some files are renamed during the copy to prevent clashes with object
|
||||||
file names with other Mozilla libraries.
|
file names with other Mozilla libraries.
|
||||||
|
|
||||||
alloca.diff - Bug 469639 - Failed to build firefox trunk on OpenSolaris
|
alloca.diff - Bug 469639 - Failed to build firefox trunk on OpenSolaris
|
||||||
bug487519.patch: fix for bug 487519.
|
bug487519.patch: fix for bug 487519.
|
||||||
bug498855.patch: fix for bug 498855
|
|
||||||
bug550184.patch: fix for bug 550184 (Xiph trac 1656)
|
|
||||||
|
@ -1,36 +0,0 @@
|
|||||||
diff --git a/media/libvorbis/lib/vorbis_synthesis.c b/media/libvorbis/lib/vorbis_synthesis.c
|
|
||||||
index b7b2399..05774fd 100644
|
|
||||||
--- a/media/libvorbis/lib/vorbis_synthesis.c
|
|
||||||
+++ b/media/libvorbis/lib/vorbis_synthesis.c
|
|
||||||
@@ -19,22 +19,26 @@
|
|
||||||
#include <ogg/ogg.h>
|
|
||||||
#include "vorbis/codec.h"
|
|
||||||
#include "codec_internal.h"
|
|
||||||
#include "registry.h"
|
|
||||||
#include "misc.h"
|
|
||||||
#include "os.h"
|
|
||||||
|
|
||||||
int vorbis_synthesis(vorbis_block *vb,ogg_packet *op){
|
|
||||||
- vorbis_dsp_state *vd=vb->vd;
|
|
||||||
- private_state *b=vd->backend_state;
|
|
||||||
- vorbis_info *vi=vd->vi;
|
|
||||||
- codec_setup_info *ci=vi->codec_setup;
|
|
||||||
- oggpack_buffer *opb=&vb->opb;
|
|
||||||
+ vorbis_dsp_state *vd= vb ? vb->vd : 0;
|
|
||||||
+ private_state *b= vd ? vd->backend_state : 0;
|
|
||||||
+ vorbis_info *vi= vd ? vd->vi : 0;
|
|
||||||
+ codec_setup_info *ci= vi ? vi->codec_setup : 0;
|
|
||||||
+ oggpack_buffer *opb=vb ? &vb->opb : 0;
|
|
||||||
int type,mode,i;
|
|
||||||
+
|
|
||||||
+ if (!vd || !b || !vi || !ci || !opb) {
|
|
||||||
+ return OV_EBADPACKET;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
/* first things first. Make sure decode is ready */
|
|
||||||
_vorbis_block_ripcord(vb);
|
|
||||||
oggpack_readinit(opb,op->packet,op->bytes);
|
|
||||||
|
|
||||||
/* Check the packet type */
|
|
||||||
if(oggpack_read(opb,1)!=0){
|
|
||||||
/* Oops. This is not an audio data packet */
|
|
@ -1,18 +0,0 @@
|
|||||||
diff --git a/media/libvorbis/lib/vorbis_info.c b/media/libvorbis/lib/vorbis_info.c
|
|
||||||
index 30088d8..8583224 100644
|
|
||||||
--- a/media/libvorbis/lib/vorbis_info.c
|
|
||||||
+++ b/media/libvorbis/lib/vorbis_info.c
|
|
||||||
@@ -628,12 +628,12 @@ int vorbis_analysis_headerout(vorbis_dsp_state *v,
|
|
||||||
oggpack_writeclear(&opb);
|
|
||||||
return(0);
|
|
||||||
err_out:
|
|
||||||
- oggpack_writeclear(&opb);
|
|
||||||
memset(op,0,sizeof(*op));
|
|
||||||
memset(op_comm,0,sizeof(*op_comm));
|
|
||||||
memset(op_code,0,sizeof(*op_code));
|
|
||||||
|
|
||||||
if(b){
|
|
||||||
+ oggpack_writeclear(&opb);
|
|
||||||
if(b->header)_ogg_free(b->header);
|
|
||||||
if(b->header1)_ogg_free(b->header1);
|
|
||||||
if(b->header2)_ogg_free(b->header2);
|
|
@ -11,7 +11,7 @@
|
|||||||
********************************************************************
|
********************************************************************
|
||||||
|
|
||||||
function: libvorbis codec headers
|
function: libvorbis codec headers
|
||||||
last mod: $Id: codec.h 16037 2009-05-26 21:10:58Z xiphmont $
|
last mod: $Id: codec.h 17021 2010-03-24 09:29:41Z xiphmont $
|
||||||
|
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
@ -121,7 +121,7 @@ typedef struct vorbis_block{
|
|||||||
|
|
||||||
/* vorbis_block is a single block of data to be processed as part of
|
/* vorbis_block is a single block of data to be processed as part of
|
||||||
the analysis/synthesis stream; it belongs to a specific logical
|
the analysis/synthesis stream; it belongs to a specific logical
|
||||||
bitstream, but is independant from other vorbis_blocks belonging to
|
bitstream, but is independent from other vorbis_blocks belonging to
|
||||||
that logical bitstream. *************************************************/
|
that logical bitstream. *************************************************/
|
||||||
|
|
||||||
struct alloc_chain{
|
struct alloc_chain{
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
function: libvorbis backend and mapping structures; needed for
|
function: libvorbis backend and mapping structures; needed for
|
||||||
static mode headers
|
static mode headers
|
||||||
last mod: $Id: backends.h 16552 2009-09-12 02:09:04Z xiphmont $
|
last mod: $Id: backends.h 16962 2010-03-11 07:30:34Z xiphmont $
|
||||||
|
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
@ -93,10 +93,10 @@ typedef struct{
|
|||||||
void (*free_info) (vorbis_info_residue *);
|
void (*free_info) (vorbis_info_residue *);
|
||||||
void (*free_look) (vorbis_look_residue *);
|
void (*free_look) (vorbis_look_residue *);
|
||||||
long **(*class) (struct vorbis_block *,vorbis_look_residue *,
|
long **(*class) (struct vorbis_block *,vorbis_look_residue *,
|
||||||
float **,int *,int);
|
int **,int *,int);
|
||||||
int (*forward) (oggpack_buffer *,struct vorbis_block *,
|
int (*forward) (oggpack_buffer *,struct vorbis_block *,
|
||||||
vorbis_look_residue *,
|
vorbis_look_residue *,
|
||||||
float **,float **,int *,int,long **);
|
int **,int *,int,long **,int);
|
||||||
int (*inverse) (struct vorbis_block *,vorbis_look_residue *,
|
int (*inverse) (struct vorbis_block *,vorbis_look_residue *,
|
||||||
float **,int *,int);
|
float **,int *,int);
|
||||||
} vorbis_func_residue;
|
} vorbis_func_residue;
|
||||||
@ -114,8 +114,8 @@ typedef struct vorbis_info_residue0{
|
|||||||
int secondstages[64]; /* expanded out to pointers in lookup */
|
int secondstages[64]; /* expanded out to pointers in lookup */
|
||||||
int booklist[512]; /* list of second stage books */
|
int booklist[512]; /* list of second stage books */
|
||||||
|
|
||||||
const float classmetric1[64];
|
const int classmetric1[64];
|
||||||
const float classmetric2[64];
|
const int classmetric2[64];
|
||||||
} vorbis_info_residue0;
|
} vorbis_info_residue0;
|
||||||
|
|
||||||
/* Mapping backend generic *****************************************/
|
/* Mapping backend generic *****************************************/
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
********************************************************************
|
********************************************************************
|
||||||
|
|
||||||
function: basic shared codebook operations
|
function: basic shared codebook operations
|
||||||
last mod: $Id: codebook.h 16227 2009-07-08 06:58:46Z xiphmont $
|
last mod: $Id: codebook.h 17030 2010-03-25 06:52:55Z xiphmont $
|
||||||
|
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
@ -52,50 +52,9 @@ typedef struct static_codebook{
|
|||||||
long *quantlist; /* map == 1: (int)(entries^(1/dim)) element column map
|
long *quantlist; /* map == 1: (int)(entries^(1/dim)) element column map
|
||||||
map == 2: list of dim*entries quantized entry vals
|
map == 2: list of dim*entries quantized entry vals
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* encode helpers ********************************************************/
|
|
||||||
struct encode_aux_nearestmatch *nearest_tree;
|
|
||||||
struct encode_aux_threshmatch *thresh_tree;
|
|
||||||
struct encode_aux_pigeonhole *pigeon_tree;
|
|
||||||
|
|
||||||
int allocedp;
|
int allocedp;
|
||||||
} static_codebook;
|
} static_codebook;
|
||||||
|
|
||||||
/* this structures an arbitrary trained book to quickly find the
|
|
||||||
nearest cell match */
|
|
||||||
typedef struct encode_aux_nearestmatch{
|
|
||||||
/* pre-calculated partitioning tree */
|
|
||||||
long *ptr0;
|
|
||||||
long *ptr1;
|
|
||||||
|
|
||||||
long *p; /* decision points (each is an entry) */
|
|
||||||
long *q; /* decision points (each is an entry) */
|
|
||||||
long aux; /* number of tree entries */
|
|
||||||
long alloc;
|
|
||||||
} encode_aux_nearestmatch;
|
|
||||||
|
|
||||||
/* assumes a maptype of 1; encode side only, so that's OK */
|
|
||||||
typedef struct encode_aux_threshmatch{
|
|
||||||
float *quantthresh;
|
|
||||||
long *quantmap;
|
|
||||||
int quantvals;
|
|
||||||
int threshvals;
|
|
||||||
} encode_aux_threshmatch;
|
|
||||||
|
|
||||||
typedef struct encode_aux_pigeonhole{
|
|
||||||
float min;
|
|
||||||
float del;
|
|
||||||
|
|
||||||
int mapentries;
|
|
||||||
int quantvals;
|
|
||||||
long *pigeonmap;
|
|
||||||
|
|
||||||
long fittotal;
|
|
||||||
long *fitlist;
|
|
||||||
long *fitmap;
|
|
||||||
long *fitlength;
|
|
||||||
} encode_aux_pigeonhole;
|
|
||||||
|
|
||||||
typedef struct codebook{
|
typedef struct codebook{
|
||||||
long dim; /* codebook dimensions (elements per vector) */
|
long dim; /* codebook dimensions (elements per vector) */
|
||||||
long entries; /* codebook entries */
|
long entries; /* codebook entries */
|
||||||
@ -114,9 +73,12 @@ typedef struct codebook{
|
|||||||
int dec_firsttablen;
|
int dec_firsttablen;
|
||||||
int dec_maxlength;
|
int dec_maxlength;
|
||||||
|
|
||||||
|
/* The current encoder uses only centered, integer-only lattice books. */
|
||||||
|
int quantvals;
|
||||||
|
int minval;
|
||||||
|
int delta;
|
||||||
} codebook;
|
} codebook;
|
||||||
|
|
||||||
extern void vorbis_staticbook_clear(static_codebook *b);
|
|
||||||
extern void vorbis_staticbook_destroy(static_codebook *b);
|
extern void vorbis_staticbook_destroy(static_codebook *b);
|
||||||
extern int vorbis_book_init_encode(codebook *dest,const static_codebook *source);
|
extern int vorbis_book_init_encode(codebook *dest,const static_codebook *source);
|
||||||
extern int vorbis_book_init_decode(codebook *dest,const static_codebook *source);
|
extern int vorbis_book_init_decode(codebook *dest,const static_codebook *source);
|
||||||
@ -137,12 +99,9 @@ extern long vorbis_book_codelen(codebook *book,int entry);
|
|||||||
|
|
||||||
|
|
||||||
extern int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *b);
|
extern int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *b);
|
||||||
extern int vorbis_staticbook_unpack(oggpack_buffer *b,static_codebook *c);
|
extern static_codebook *vorbis_staticbook_unpack(oggpack_buffer *b);
|
||||||
|
|
||||||
extern int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b);
|
extern int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b);
|
||||||
extern int vorbis_book_errorv(codebook *book, float *a);
|
|
||||||
extern int vorbis_book_encodev(codebook *book, int best,float *a,
|
|
||||||
oggpack_buffer *b);
|
|
||||||
|
|
||||||
extern long vorbis_book_decode(codebook *book, oggpack_buffer *b);
|
extern long vorbis_book_decode(codebook *book, oggpack_buffer *b);
|
||||||
extern long vorbis_book_decodevs_add(codebook *book, float *a,
|
extern long vorbis_book_decodevs_add(codebook *book, float *a,
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
********************************************************************
|
********************************************************************
|
||||||
|
|
||||||
function: highlevel encoder setup struct seperated out for vorbisenc clarity
|
function: highlevel encoder setup struct seperated out for vorbisenc clarity
|
||||||
last mod: $Id: highlevel.h 16227 2009-07-08 06:58:46Z xiphmont $
|
last mod: $Id: highlevel.h 16995 2010-03-23 03:44:44Z xiphmont $
|
||||||
|
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
@ -23,14 +23,14 @@ typedef struct highlevel_byblocktype {
|
|||||||
} highlevel_byblocktype;
|
} highlevel_byblocktype;
|
||||||
|
|
||||||
typedef struct highlevel_encode_setup {
|
typedef struct highlevel_encode_setup {
|
||||||
const void *setup;
|
|
||||||
int set_in_stone;
|
int set_in_stone;
|
||||||
|
const void *setup;
|
||||||
double base_setting;
|
double base_setting;
|
||||||
double long_setting;
|
|
||||||
double short_setting;
|
|
||||||
double impulse_noisetune;
|
double impulse_noisetune;
|
||||||
|
|
||||||
|
/* bitrate management below all settable */
|
||||||
|
float req;
|
||||||
int managed;
|
int managed;
|
||||||
long bitrate_min;
|
long bitrate_min;
|
||||||
long bitrate_av;
|
long bitrate_av;
|
||||||
@ -41,9 +41,11 @@ typedef struct highlevel_encode_setup {
|
|||||||
|
|
||||||
int impulse_block_p;
|
int impulse_block_p;
|
||||||
int noise_normalize_p;
|
int noise_normalize_p;
|
||||||
|
int coupling_p;
|
||||||
|
|
||||||
double stereo_point_setting;
|
double stereo_point_setting;
|
||||||
double lowpass_kHz;
|
double lowpass_kHz;
|
||||||
|
int lowpass_altered;
|
||||||
|
|
||||||
double ath_floating_dB;
|
double ath_floating_dB;
|
||||||
double ath_absolute_dB;
|
double ath_absolute_dB;
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
********************************************************************
|
********************************************************************
|
||||||
|
|
||||||
function: random psychoacoustics (not including preecho)
|
function: random psychoacoustics (not including preecho)
|
||||||
last mod: $Id: psy.h 16227 2009-07-08 06:58:46Z xiphmont $
|
last mod: $Id: psy.h 16946 2010-03-03 16:12:40Z xiphmont $
|
||||||
|
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
@ -57,8 +57,7 @@ typedef struct vorbis_info_psy{
|
|||||||
|
|
||||||
float max_curve_dB;
|
float max_curve_dB;
|
||||||
|
|
||||||
int normal_channel_p;
|
int normal_p;
|
||||||
int normal_point_p;
|
|
||||||
int normal_start;
|
int normal_start;
|
||||||
int normal_partition;
|
int normal_partition;
|
||||||
double normal_thresh;
|
double normal_thresh;
|
||||||
@ -122,12 +121,6 @@ extern void *_vi_psy_dup(void *source);
|
|||||||
extern void _vi_psy_free(vorbis_info_psy *i);
|
extern void _vi_psy_free(vorbis_info_psy *i);
|
||||||
extern vorbis_info_psy *_vi_psy_copy(vorbis_info_psy *i);
|
extern vorbis_info_psy *_vi_psy_copy(vorbis_info_psy *i);
|
||||||
|
|
||||||
extern void _vp_remove_floor(vorbis_look_psy *p,
|
|
||||||
float *mdct,
|
|
||||||
int *icodedflr,
|
|
||||||
float *residue,
|
|
||||||
int sliding_lowpass);
|
|
||||||
|
|
||||||
extern void _vp_noisemask(vorbis_look_psy *p,
|
extern void _vp_noisemask(vorbis_look_psy *p,
|
||||||
float *logmdct,
|
float *logmdct,
|
||||||
float *logmask);
|
float *logmask);
|
||||||
@ -148,38 +141,14 @@ extern void _vp_offset_and_mix(vorbis_look_psy *p,
|
|||||||
|
|
||||||
extern float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd);
|
extern float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd);
|
||||||
|
|
||||||
extern float **_vp_quantize_couple_memo(vorbis_block *vb,
|
extern void _vp_couple_quantize_normalize(int blobno,
|
||||||
vorbis_info_psy_global *g,
|
vorbis_info_psy_global *g,
|
||||||
vorbis_look_psy *p,
|
vorbis_look_psy *p,
|
||||||
vorbis_info_mapping0 *vi,
|
vorbis_info_mapping0 *vi,
|
||||||
float **mdct);
|
float **mdct,
|
||||||
|
int **iwork,
|
||||||
extern void _vp_couple(int blobno,
|
int *nonzero,
|
||||||
vorbis_info_psy_global *g,
|
int sliding_lowpass,
|
||||||
vorbis_look_psy *p,
|
int ch);
|
||||||
vorbis_info_mapping0 *vi,
|
|
||||||
float **res,
|
|
||||||
float **mag_memo,
|
|
||||||
int **mag_sort,
|
|
||||||
int **ifloor,
|
|
||||||
int *nonzero,
|
|
||||||
int sliding_lowpass);
|
|
||||||
|
|
||||||
extern void _vp_noise_normalize(vorbis_look_psy *p,
|
|
||||||
float *in,float *out,int *sortedindex);
|
|
||||||
|
|
||||||
extern void _vp_noise_normalize_sort(vorbis_look_psy *p,
|
|
||||||
float *magnitudes,int *sortedindex);
|
|
||||||
|
|
||||||
extern int **_vp_quantize_couple_sort(vorbis_block *vb,
|
|
||||||
vorbis_look_psy *p,
|
|
||||||
vorbis_info_mapping0 *vi,
|
|
||||||
float **mags);
|
|
||||||
|
|
||||||
extern void hf_reduction(vorbis_info_psy_global *g,
|
|
||||||
vorbis_look_psy *p,
|
|
||||||
vorbis_info_mapping0 *vi,
|
|
||||||
float **mdct);
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
********************************************************************
|
********************************************************************
|
||||||
|
|
||||||
function: basic codebook pack/unpack/code/decode operations
|
function: basic codebook pack/unpack/code/decode operations
|
||||||
last mod: $Id: codebook.c 16597 2009-10-01 02:54:22Z tterribe $
|
last mod: $Id: codebook.c 17030 2010-03-25 06:52:55Z xiphmont $
|
||||||
|
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
@ -146,9 +146,9 @@ int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *opb){
|
|||||||
|
|
||||||
/* unpacks a codebook from the packet buffer into the codebook struct,
|
/* unpacks a codebook from the packet buffer into the codebook struct,
|
||||||
readies the codebook auxiliary structures for decode *************/
|
readies the codebook auxiliary structures for decode *************/
|
||||||
int vorbis_staticbook_unpack(oggpack_buffer *opb,static_codebook *s){
|
static_codebook *vorbis_staticbook_unpack(oggpack_buffer *opb){
|
||||||
long i,j;
|
long i,j;
|
||||||
memset(s,0,sizeof(*s));
|
static_codebook *s=_ogg_calloc(1,sizeof(*s));
|
||||||
s->allocedp=1;
|
s->allocedp=1;
|
||||||
|
|
||||||
/* make sure alignment is correct */
|
/* make sure alignment is correct */
|
||||||
@ -207,7 +207,7 @@ int vorbis_staticbook_unpack(oggpack_buffer *opb,static_codebook *s){
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* EOF */
|
/* EOF */
|
||||||
return(-1);
|
goto _eofout;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do we have a mapping to unpack? */
|
/* Do we have a mapping to unpack? */
|
||||||
@ -249,12 +249,12 @@ int vorbis_staticbook_unpack(oggpack_buffer *opb,static_codebook *s){
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* all set */
|
/* all set */
|
||||||
return(0);
|
return(s);
|
||||||
|
|
||||||
_errout:
|
_errout:
|
||||||
_eofout:
|
_eofout:
|
||||||
vorbis_staticbook_clear(s);
|
vorbis_staticbook_destroy(s);
|
||||||
return(-1);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* returns the number of bits ************************************************/
|
/* returns the number of bits ************************************************/
|
||||||
@ -264,37 +264,6 @@ int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b){
|
|||||||
return(book->c->lengthlist[a]);
|
return(book->c->lengthlist[a]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* One the encode side, our vector writers are each designed for a
|
|
||||||
specific purpose, and the encoder is not flexible without modification:
|
|
||||||
|
|
||||||
The LSP vector coder uses a single stage nearest-match with no
|
|
||||||
interleave, so no step and no error return. This is specced by floor0
|
|
||||||
and doesn't change.
|
|
||||||
|
|
||||||
Residue0 encoding interleaves, uses multiple stages, and each stage
|
|
||||||
peels of a specific amount of resolution from a lattice (thus we want
|
|
||||||
to match by threshold, not nearest match). Residue doesn't *have* to
|
|
||||||
be encoded that way, but to change it, one will need to add more
|
|
||||||
infrastructure on the encode side (decode side is specced and simpler) */
|
|
||||||
|
|
||||||
/* floor0 LSP (single stage, non interleaved, nearest match) */
|
|
||||||
/* returns entry number and *modifies a* to the quantization value *****/
|
|
||||||
int vorbis_book_errorv(codebook *book,float *a){
|
|
||||||
int dim=book->dim,k;
|
|
||||||
int best=_best(book,a,1);
|
|
||||||
for(k=0;k<dim;k++)
|
|
||||||
a[k]=(book->valuelist+best*dim)[k];
|
|
||||||
return(best);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* returns the number of bits and *modifies a* to the quantization value *****/
|
|
||||||
int vorbis_book_encodev(codebook *book,int best,float *a,oggpack_buffer *b){
|
|
||||||
int k,dim=book->dim;
|
|
||||||
for(k=0;k<dim;k++)
|
|
||||||
a[k]=(book->valuelist+best*dim)[k];
|
|
||||||
return(vorbis_book_encode(book,best,b));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* the 'eliminate the decode tree' optimization actually requires the
|
/* the 'eliminate the decode tree' optimization actually requires the
|
||||||
codewords to be MSb first, not LSb. This is an annoying inelegancy
|
codewords to be MSb first, not LSb. This is an annoying inelegancy
|
||||||
(and one of the first places where carefully thought out design
|
(and one of the first places where carefully thought out design
|
||||||
@ -495,144 +464,3 @@ long vorbis_book_decodevv_add(codebook *book,float **a,long offset,int ch,
|
|||||||
}
|
}
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _V_SELFTEST
|
|
||||||
/* Simple enough; pack a few candidate codebooks, unpack them. Code a
|
|
||||||
number of vectors through (keeping track of the quantized values),
|
|
||||||
and decode using the unpacked book. quantized version of in should
|
|
||||||
exactly equal out */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "vorbis/book/lsp20_0.vqh"
|
|
||||||
#include "vorbis/book/res0a_13.vqh"
|
|
||||||
#define TESTSIZE 40
|
|
||||||
|
|
||||||
float test1[TESTSIZE]={
|
|
||||||
0.105939f,
|
|
||||||
0.215373f,
|
|
||||||
0.429117f,
|
|
||||||
0.587974f,
|
|
||||||
|
|
||||||
0.181173f,
|
|
||||||
0.296583f,
|
|
||||||
0.515707f,
|
|
||||||
0.715261f,
|
|
||||||
|
|
||||||
0.162327f,
|
|
||||||
0.263834f,
|
|
||||||
0.342876f,
|
|
||||||
0.406025f,
|
|
||||||
|
|
||||||
0.103571f,
|
|
||||||
0.223561f,
|
|
||||||
0.368513f,
|
|
||||||
0.540313f,
|
|
||||||
|
|
||||||
0.136672f,
|
|
||||||
0.395882f,
|
|
||||||
0.587183f,
|
|
||||||
0.652476f,
|
|
||||||
|
|
||||||
0.114338f,
|
|
||||||
0.417300f,
|
|
||||||
0.525486f,
|
|
||||||
0.698679f,
|
|
||||||
|
|
||||||
0.147492f,
|
|
||||||
0.324481f,
|
|
||||||
0.643089f,
|
|
||||||
0.757582f,
|
|
||||||
|
|
||||||
0.139556f,
|
|
||||||
0.215795f,
|
|
||||||
0.324559f,
|
|
||||||
0.399387f,
|
|
||||||
|
|
||||||
0.120236f,
|
|
||||||
0.267420f,
|
|
||||||
0.446940f,
|
|
||||||
0.608760f,
|
|
||||||
|
|
||||||
0.115587f,
|
|
||||||
0.287234f,
|
|
||||||
0.571081f,
|
|
||||||
0.708603f,
|
|
||||||
};
|
|
||||||
|
|
||||||
float test3[TESTSIZE]={
|
|
||||||
0,1,-2,3,4,-5,6,7,8,9,
|
|
||||||
8,-2,7,-1,4,6,8,3,1,-9,
|
|
||||||
10,11,12,13,14,15,26,17,18,19,
|
|
||||||
30,-25,-30,-1,-5,-32,4,3,-2,0};
|
|
||||||
|
|
||||||
static_codebook *testlist[]={&_vq_book_lsp20_0,
|
|
||||||
&_vq_book_res0a_13,NULL};
|
|
||||||
float *testvec[]={test1,test3};
|
|
||||||
|
|
||||||
int main(){
|
|
||||||
oggpack_buffer write;
|
|
||||||
oggpack_buffer read;
|
|
||||||
long ptr=0,i;
|
|
||||||
oggpack_writeinit(&write);
|
|
||||||
|
|
||||||
fprintf(stderr,"Testing codebook abstraction...:\n");
|
|
||||||
|
|
||||||
while(testlist[ptr]){
|
|
||||||
codebook c;
|
|
||||||
static_codebook s;
|
|
||||||
float *qv=alloca(sizeof(*qv)*TESTSIZE);
|
|
||||||
float *iv=alloca(sizeof(*iv)*TESTSIZE);
|
|
||||||
memcpy(qv,testvec[ptr],sizeof(*qv)*TESTSIZE);
|
|
||||||
memset(iv,0,sizeof(*iv)*TESTSIZE);
|
|
||||||
|
|
||||||
fprintf(stderr,"\tpacking/coding %ld... ",ptr);
|
|
||||||
|
|
||||||
/* pack the codebook, write the testvector */
|
|
||||||
oggpack_reset(&write);
|
|
||||||
vorbis_book_init_encode(&c,testlist[ptr]); /* get it into memory
|
|
||||||
we can write */
|
|
||||||
vorbis_staticbook_pack(testlist[ptr],&write);
|
|
||||||
fprintf(stderr,"Codebook size %ld bytes... ",oggpack_bytes(&write));
|
|
||||||
for(i=0;i<TESTSIZE;i+=c.dim){
|
|
||||||
int best=_best(&c,qv+i,1);
|
|
||||||
vorbis_book_encodev(&c,best,qv+i,&write);
|
|
||||||
}
|
|
||||||
vorbis_book_clear(&c);
|
|
||||||
|
|
||||||
fprintf(stderr,"OK.\n");
|
|
||||||
fprintf(stderr,"\tunpacking/decoding %ld... ",ptr);
|
|
||||||
|
|
||||||
/* transfer the write data to a read buffer and unpack/read */
|
|
||||||
oggpack_readinit(&read,oggpack_get_buffer(&write),oggpack_bytes(&write));
|
|
||||||
if(vorbis_staticbook_unpack(&read,&s)){
|
|
||||||
fprintf(stderr,"Error unpacking codebook.\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
if(vorbis_book_init_decode(&c,&s)){
|
|
||||||
fprintf(stderr,"Error initializing codebook.\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(i=0;i<TESTSIZE;i+=c.dim)
|
|
||||||
if(vorbis_book_decodev_set(&c,iv+i,&read,c.dim)==-1){
|
|
||||||
fprintf(stderr,"Error reading codebook test data (EOP).\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
for(i=0;i<TESTSIZE;i++)
|
|
||||||
if(fabs(qv[i]-iv[i])>.000001){
|
|
||||||
fprintf(stderr,"read (%g) != written (%g) at position (%ld)\n",
|
|
||||||
iv[i],qv[i],i);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr,"OK\n");
|
|
||||||
ptr++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The above is the trivial stuff; now try unquantizing a log scale codebook */
|
|
||||||
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
********************************************************************
|
********************************************************************
|
||||||
|
|
||||||
function: floor backend 1 implementation
|
function: floor backend 1 implementation
|
||||||
last mod: $Id: floor1.c 16227 2009-07-08 06:58:46Z xiphmont $
|
last mod: $Id: floor1.c 17079 2010-03-26 06:51:41Z xiphmont $
|
||||||
|
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
@ -31,15 +31,22 @@
|
|||||||
#define floor1_rangedB 140 /* floor 1 fixed at -140dB to 0dB range */
|
#define floor1_rangedB 140 /* floor 1 fixed at -140dB to 0dB range */
|
||||||
|
|
||||||
typedef struct lsfit_acc{
|
typedef struct lsfit_acc{
|
||||||
long x0;
|
int x0;
|
||||||
long x1;
|
int x1;
|
||||||
|
|
||||||
long xa;
|
int xa;
|
||||||
long ya;
|
int ya;
|
||||||
long x2a;
|
int x2a;
|
||||||
long y2a;
|
int y2a;
|
||||||
long xya;
|
int xya;
|
||||||
long an;
|
int an;
|
||||||
|
|
||||||
|
int xb;
|
||||||
|
int yb;
|
||||||
|
int x2b;
|
||||||
|
int y2b;
|
||||||
|
int xyb;
|
||||||
|
int bn;
|
||||||
} lsfit_acc;
|
} lsfit_acc;
|
||||||
|
|
||||||
/***********************************************/
|
/***********************************************/
|
||||||
@ -381,7 +388,7 @@ static void render_line(int n, int x0,int x1,int y0,int y1,float *d){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void render_line0(int x0,int x1,int y0,int y1,int *d){
|
static void render_line0(int n, int x0,int x1,int y0,int y1,int *d){
|
||||||
int dy=y1-y0;
|
int dy=y1-y0;
|
||||||
int adx=x1-x0;
|
int adx=x1-x0;
|
||||||
int ady=abs(dy);
|
int ady=abs(dy);
|
||||||
@ -393,8 +400,12 @@ static void render_line0(int x0,int x1,int y0,int y1,int *d){
|
|||||||
|
|
||||||
ady-=abs(base*adx);
|
ady-=abs(base*adx);
|
||||||
|
|
||||||
d[x]=y;
|
if(n>x1)n=x1;
|
||||||
while(++x<x1){
|
|
||||||
|
if(x<n)
|
||||||
|
d[x]=y;
|
||||||
|
|
||||||
|
while(++x<n){
|
||||||
err=err+ady;
|
err=err+ady;
|
||||||
if(err>=adx){
|
if(err>=adx){
|
||||||
err-=adx;
|
err-=adx;
|
||||||
@ -412,7 +423,7 @@ static int accumulate_fit(const float *flr,const float *mdct,
|
|||||||
int n,vorbis_info_floor1 *info){
|
int n,vorbis_info_floor1 *info){
|
||||||
long i;
|
long i;
|
||||||
|
|
||||||
long xa=0,ya=0,x2a=0,y2a=0,xya=0,na=0, xb=0,yb=0,x2b=0,y2b=0,xyb=0,nb=0;
|
int xa=0,ya=0,x2a=0,y2a=0,xya=0,na=0, xb=0,yb=0,x2b=0,y2b=0,xyb=0,nb=0;
|
||||||
|
|
||||||
memset(a,0,sizeof(*a));
|
memset(a,0,sizeof(*a));
|
||||||
a->x0=x0;
|
a->x0=x0;
|
||||||
@ -440,72 +451,65 @@ static int accumulate_fit(const float *flr,const float *mdct,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
xb+=xa;
|
a->xa=xa;
|
||||||
yb+=ya;
|
a->ya=ya;
|
||||||
x2b+=x2a;
|
a->x2a=x2a;
|
||||||
y2b+=y2a;
|
a->y2a=y2a;
|
||||||
xyb+=xya;
|
a->xya=xya;
|
||||||
nb+=na;
|
a->an=na;
|
||||||
|
|
||||||
/* weight toward the actually used frequencies if we meet the threshhold */
|
a->xb=xb;
|
||||||
{
|
a->yb=yb;
|
||||||
int weight=nb*info->twofitweight/(na+1);
|
a->x2b=x2b;
|
||||||
|
a->y2b=y2b;
|
||||||
a->xa=xa*weight+xb;
|
a->xyb=xyb;
|
||||||
a->ya=ya*weight+yb;
|
a->bn=nb;
|
||||||
a->x2a=x2a*weight+x2b;
|
|
||||||
a->y2a=y2a*weight+y2b;
|
|
||||||
a->xya=xya*weight+xyb;
|
|
||||||
a->an=na*weight+nb;
|
|
||||||
}
|
|
||||||
|
|
||||||
return(na);
|
return(na);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fit_line(lsfit_acc *a,int fits,int *y0,int *y1){
|
static int fit_line(lsfit_acc *a,int fits,int *y0,int *y1,
|
||||||
long x=0,y=0,x2=0,y2=0,xy=0,an=0,i;
|
vorbis_info_floor1 *info){
|
||||||
long x0=a[0].x0;
|
double xb=0,yb=0,x2b=0,y2b=0,xyb=0,bn=0;
|
||||||
long x1=a[fits-1].x1;
|
int i;
|
||||||
|
int x0=a[0].x0;
|
||||||
|
int x1=a[fits-1].x1;
|
||||||
|
|
||||||
for(i=0;i<fits;i++){
|
for(i=0;i<fits;i++){
|
||||||
x+=a[i].xa;
|
double weight = (a[i].bn+a[i].an)*info->twofitweight/(a[i].an+1)+1.;
|
||||||
y+=a[i].ya;
|
|
||||||
x2+=a[i].x2a;
|
xb+=a[i].xb + a[i].xa * weight;
|
||||||
y2+=a[i].y2a;
|
yb+=a[i].yb + a[i].ya * weight;
|
||||||
xy+=a[i].xya;
|
x2b+=a[i].x2b + a[i].x2a * weight;
|
||||||
an+=a[i].an;
|
y2b+=a[i].y2b + a[i].y2a * weight;
|
||||||
|
xyb+=a[i].xyb + a[i].xya * weight;
|
||||||
|
bn+=a[i].bn + a[i].an * weight;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(*y0>=0){
|
if(*y0>=0){
|
||||||
x+= x0;
|
xb+= x0;
|
||||||
y+= *y0;
|
yb+= *y0;
|
||||||
x2+= x0 * x0;
|
x2b+= x0 * x0;
|
||||||
y2+= *y0 * *y0;
|
y2b+= *y0 * *y0;
|
||||||
xy+= *y0 * x0;
|
xyb+= *y0 * x0;
|
||||||
an++;
|
bn++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(*y1>=0){
|
if(*y1>=0){
|
||||||
x+= x1;
|
xb+= x1;
|
||||||
y+= *y1;
|
yb+= *y1;
|
||||||
x2+= x1 * x1;
|
x2b+= x1 * x1;
|
||||||
y2+= *y1 * *y1;
|
y2b+= *y1 * *y1;
|
||||||
xy+= *y1 * x1;
|
xyb+= *y1 * x1;
|
||||||
an++;
|
bn++;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
/* need 64 bit multiplies, which C doesn't give portably as int */
|
double denom=(bn*x2b-xb*xb);
|
||||||
double fx=x;
|
|
||||||
double fx2=x2;
|
|
||||||
double denom=(an*fx2-fx*fx);
|
|
||||||
|
|
||||||
if(denom>0.){
|
if(denom>0.){
|
||||||
double fy=y;
|
double a=(yb*x2b-xyb*xb)/denom;
|
||||||
double fxy=xy;
|
double b=(bn*xyb-xb*yb)/denom;
|
||||||
|
|
||||||
double a=(fy*fx2-fxy*fx)/denom;
|
|
||||||
double b=(an*fxy-fx*fy)/denom;
|
|
||||||
*y0=rint(a+b*x0);
|
*y0=rint(a+b*x0);
|
||||||
*y1=rint(a+b*x1);
|
*y1=rint(a+b*x1);
|
||||||
|
|
||||||
@ -524,16 +528,6 @@ static int fit_line(lsfit_acc *a,int fits,int *y0,int *y1){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*static void fit_line_point(lsfit_acc *a,int fits,int *y0,int *y1){
|
|
||||||
long y=0;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for(i=0;i<fits && y==0;i++)
|
|
||||||
y+=a[i].ya;
|
|
||||||
|
|
||||||
*y0=*y1=y;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
static int inspect_error(int x0,int x1,int y0,int y1,const float *mask,
|
static int inspect_error(int x0,int x1,int y0,int y1,const float *mask,
|
||||||
const float *mdct,
|
const float *mdct,
|
||||||
vorbis_info_floor1 *info){
|
vorbis_info_floor1 *info){
|
||||||
@ -632,7 +626,7 @@ int *floor1_fit(vorbis_block *vb,vorbis_look_floor1 *look,
|
|||||||
/* start by fitting the implicit base case.... */
|
/* start by fitting the implicit base case.... */
|
||||||
int y0=-200;
|
int y0=-200;
|
||||||
int y1=-200;
|
int y1=-200;
|
||||||
fit_line(fits,posts-1,&y0,&y1);
|
fit_line(fits,posts-1,&y0,&y1,info);
|
||||||
|
|
||||||
fit_valueA[0]=y0;
|
fit_valueA[0]=y0;
|
||||||
fit_valueB[0]=y0;
|
fit_valueB[0]=y0;
|
||||||
@ -672,8 +666,8 @@ int *floor1_fit(vorbis_block *vb,vorbis_look_floor1 *look,
|
|||||||
int ly1=-200;
|
int ly1=-200;
|
||||||
int hy0=-200;
|
int hy0=-200;
|
||||||
int hy1=-200;
|
int hy1=-200;
|
||||||
int ret0=fit_line(fits+lsortpos,sortpos-lsortpos,&ly0,&ly1);
|
int ret0=fit_line(fits+lsortpos,sortpos-lsortpos,&ly0,&ly1,info);
|
||||||
int ret1=fit_line(fits+sortpos,hsortpos-sortpos,&hy0,&hy1);
|
int ret1=fit_line(fits+sortpos,hsortpos-sortpos,&hy0,&hy1,info);
|
||||||
|
|
||||||
if(ret0){
|
if(ret0){
|
||||||
ly0=ly;
|
ly0=ly;
|
||||||
@ -945,6 +939,8 @@ int floor1_encode(oggpack_buffer *opb,vorbis_block *vb,
|
|||||||
int hx=0;
|
int hx=0;
|
||||||
int lx=0;
|
int lx=0;
|
||||||
int ly=post[0]*info->mult;
|
int ly=post[0]*info->mult;
|
||||||
|
int n=ci->blocksizes[vb->W]/2;
|
||||||
|
|
||||||
for(j=1;j<look->posts;j++){
|
for(j=1;j<look->posts;j++){
|
||||||
int current=look->forward_index[j];
|
int current=look->forward_index[j];
|
||||||
int hy=post[current]&0x7fff;
|
int hy=post[current]&0x7fff;
|
||||||
@ -953,7 +949,7 @@ int floor1_encode(oggpack_buffer *opb,vorbis_block *vb,
|
|||||||
hy*=info->mult;
|
hy*=info->mult;
|
||||||
hx=info->postlist[current];
|
hx=info->postlist[current];
|
||||||
|
|
||||||
render_line0(lx,hx,ly,hy,ilogmask);
|
render_line0(n,lx,hx,ly,hy,ilogmask);
|
||||||
|
|
||||||
lx=hx;
|
lx=hx;
|
||||||
ly=hy;
|
ly=hy;
|
||||||
|
@ -5,13 +5,13 @@
|
|||||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||||
* *
|
* *
|
||||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 *
|
||||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||||
* *
|
* *
|
||||||
********************************************************************
|
********************************************************************
|
||||||
|
|
||||||
function: maintain the info structure, info <-> header packets
|
function: maintain the info structure, info <-> header packets
|
||||||
last mod: $Id: info.c 16243 2009-07-10 02:49:31Z xiphmont $
|
last mod: $Id: info.c 17080 2010-03-26 06:59:58Z xiphmont $
|
||||||
|
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
@ -31,8 +31,8 @@
|
|||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
#define GENERAL_VENDOR_STRING "Xiph.Org libVorbis 1.2.3"
|
#define GENERAL_VENDOR_STRING "Xiph.Org libVorbis 1.3.1"
|
||||||
#define ENCODE_VENDOR_STRING "Xiph.Org libVorbis I 20090709"
|
#define ENCODE_VENDOR_STRING "Xiph.Org libVorbis I 20100325 (Everywhere)"
|
||||||
|
|
||||||
/* helpers */
|
/* helpers */
|
||||||
static int ilog2(unsigned int v){
|
static int ilog2(unsigned int v){
|
||||||
@ -278,8 +278,8 @@ static int _vorbis_unpack_books(vorbis_info *vi,oggpack_buffer *opb){
|
|||||||
ci->books=oggpack_read(opb,8)+1;
|
ci->books=oggpack_read(opb,8)+1;
|
||||||
if(ci->books<=0)goto err_out;
|
if(ci->books<=0)goto err_out;
|
||||||
for(i=0;i<ci->books;i++){
|
for(i=0;i<ci->books;i++){
|
||||||
ci->book_param[i]=_ogg_calloc(1,sizeof(*ci->book_param[i]));
|
ci->book_param[i]=vorbis_staticbook_unpack(opb);
|
||||||
if(vorbis_staticbook_unpack(opb,ci->book_param[i]))goto err_out;
|
if(!ci->book_param[i])goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* time backend settings; hooks are unused */
|
/* time backend settings; hooks are unused */
|
||||||
|
@ -5,13 +5,13 @@
|
|||||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||||
* *
|
* *
|
||||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 *
|
||||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||||
* *
|
* *
|
||||||
********************************************************************
|
********************************************************************
|
||||||
|
|
||||||
function: channel mapping 0 implementation
|
function: channel mapping 0 implementation
|
||||||
last mod: $Id: mapping0.c 16227 2009-07-08 06:58:46Z xiphmont $
|
last mod: $Id: mapping0.c 17022 2010-03-25 03:45:42Z xiphmont $
|
||||||
|
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
@ -246,7 +246,7 @@ static int mapping0_forward(vorbis_block *vb){
|
|||||||
|
|
||||||
int *nonzero = alloca(sizeof(*nonzero)*vi->channels);
|
int *nonzero = alloca(sizeof(*nonzero)*vi->channels);
|
||||||
float **gmdct = _vorbis_block_alloc(vb,vi->channels*sizeof(*gmdct));
|
float **gmdct = _vorbis_block_alloc(vb,vi->channels*sizeof(*gmdct));
|
||||||
int **ilogmaskch= _vorbis_block_alloc(vb,vi->channels*sizeof(*ilogmaskch));
|
int **iwork = _vorbis_block_alloc(vb,vi->channels*sizeof(*iwork));
|
||||||
int ***floor_posts = _vorbis_block_alloc(vb,vi->channels*sizeof(*floor_posts));
|
int ***floor_posts = _vorbis_block_alloc(vb,vi->channels*sizeof(*floor_posts));
|
||||||
|
|
||||||
float global_ampmax=vbi->ampmax;
|
float global_ampmax=vbi->ampmax;
|
||||||
@ -255,8 +255,7 @@ static int mapping0_forward(vorbis_block *vb){
|
|||||||
|
|
||||||
int modenumber=vb->W;
|
int modenumber=vb->W;
|
||||||
vorbis_info_mapping0 *info=ci->map_param[modenumber];
|
vorbis_info_mapping0 *info=ci->map_param[modenumber];
|
||||||
vorbis_look_psy *psy_look=
|
vorbis_look_psy *psy_look=b->psy+blocktype+(vb->W?2:0);
|
||||||
b->psy+blocktype+(vb->W?2:0);
|
|
||||||
|
|
||||||
vb->mode=modenumber;
|
vb->mode=modenumber;
|
||||||
|
|
||||||
@ -267,6 +266,7 @@ static int mapping0_forward(vorbis_block *vb){
|
|||||||
float *pcm =vb->pcm[i];
|
float *pcm =vb->pcm[i];
|
||||||
float *logfft =pcm;
|
float *logfft =pcm;
|
||||||
|
|
||||||
|
iwork[i]=_vorbis_block_alloc(vb,n/2*sizeof(**iwork));
|
||||||
gmdct[i]=_vorbis_block_alloc(vb,n/2*sizeof(**gmdct));
|
gmdct[i]=_vorbis_block_alloc(vb,n/2*sizeof(**gmdct));
|
||||||
|
|
||||||
scale_dB=todB(&scale) + .345; /* + .345 is a hack; the original
|
scale_dB=todB(&scale) + .345; /* + .345 is a hack; the original
|
||||||
@ -598,39 +598,8 @@ static int mapping0_forward(vorbis_block *vb){
|
|||||||
/* iterate over the many masking curve fits we've created */
|
/* iterate over the many masking curve fits we've created */
|
||||||
|
|
||||||
{
|
{
|
||||||
float **res_bundle=alloca(sizeof(*res_bundle)*vi->channels);
|
int **couple_bundle=alloca(sizeof(*couple_bundle)*vi->channels);
|
||||||
float **couple_bundle=alloca(sizeof(*couple_bundle)*vi->channels);
|
|
||||||
int *zerobundle=alloca(sizeof(*zerobundle)*vi->channels);
|
int *zerobundle=alloca(sizeof(*zerobundle)*vi->channels);
|
||||||
int **sortindex=alloca(sizeof(*sortindex)*vi->channels);
|
|
||||||
float **mag_memo=NULL;
|
|
||||||
int **mag_sort=NULL;
|
|
||||||
|
|
||||||
if(info->coupling_steps){
|
|
||||||
mag_memo=_vp_quantize_couple_memo(vb,
|
|
||||||
&ci->psy_g_param,
|
|
||||||
psy_look,
|
|
||||||
info,
|
|
||||||
gmdct);
|
|
||||||
|
|
||||||
mag_sort=_vp_quantize_couple_sort(vb,
|
|
||||||
psy_look,
|
|
||||||
info,
|
|
||||||
mag_memo);
|
|
||||||
|
|
||||||
hf_reduction(&ci->psy_g_param,
|
|
||||||
psy_look,
|
|
||||||
info,
|
|
||||||
mag_memo);
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(sortindex,0,sizeof(*sortindex)*vi->channels);
|
|
||||||
if(psy_look->vi->normal_channel_p){
|
|
||||||
for(i=0;i<vi->channels;i++){
|
|
||||||
float *mdct =gmdct[i];
|
|
||||||
sortindex[i]=alloca(sizeof(**sortindex)*n/2);
|
|
||||||
_vp_noise_normalize_sort(psy_look,mdct,sortindex[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for(k=(vorbis_bitrate_managed(vb)?0:PACKETBLOBS/2);
|
for(k=(vorbis_bitrate_managed(vb)?0:PACKETBLOBS/2);
|
||||||
k<=(vorbis_bitrate_managed(vb)?PACKETBLOBS-1:PACKETBLOBS/2);
|
k<=(vorbis_bitrate_managed(vb)?PACKETBLOBS-1:PACKETBLOBS/2);
|
||||||
@ -651,10 +620,7 @@ static int mapping0_forward(vorbis_block *vb){
|
|||||||
/* encode floor, compute masking curve, sep out residue */
|
/* encode floor, compute masking curve, sep out residue */
|
||||||
for(i=0;i<vi->channels;i++){
|
for(i=0;i<vi->channels;i++){
|
||||||
int submap=info->chmuxlist[i];
|
int submap=info->chmuxlist[i];
|
||||||
float *mdct =gmdct[i];
|
int *ilogmask=iwork[i];
|
||||||
float *res =vb->pcm[i];
|
|
||||||
int *ilogmask=ilogmaskch[i]=
|
|
||||||
_vorbis_block_alloc(vb,n/2*sizeof(**gmdct));
|
|
||||||
|
|
||||||
nonzero[i]=floor1_encode(opb,vb,b->flr[info->floorsubmap[submap]],
|
nonzero[i]=floor1_encode(opb,vb,b->flr[info->floorsubmap[submap]],
|
||||||
floor_posts[i][k],
|
floor_posts[i][k],
|
||||||
@ -665,29 +631,9 @@ static int mapping0_forward(vorbis_block *vb){
|
|||||||
sprintf(buf,"maskI%c%d",i?'R':'L',k);
|
sprintf(buf,"maskI%c%d",i?'R':'L',k);
|
||||||
float work[n/2];
|
float work[n/2];
|
||||||
for(j=0;j<n/2;j++)
|
for(j=0;j<n/2;j++)
|
||||||
work[j]=FLOOR1_fromdB_LOOKUP[ilogmask[j]];
|
work[j]=FLOOR1_fromdB_LOOKUP[iwork[i][j]];
|
||||||
_analysis_output(buf,seq,work,n/2,1,1,0);
|
_analysis_output(buf,seq,work,n/2,1,1,0);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
_vp_remove_floor(psy_look,
|
|
||||||
mdct,
|
|
||||||
ilogmask,
|
|
||||||
res,
|
|
||||||
ci->psy_g_param.sliding_lowpass[vb->W][k]);
|
|
||||||
|
|
||||||
_vp_noise_normalize(psy_look,res,res+n/2,sortindex[i]);
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
{
|
|
||||||
char buf[80];
|
|
||||||
float work[n/2];
|
|
||||||
for(j=0;j<n/2;j++)
|
|
||||||
work[j]=FLOOR1_fromdB_LOOKUP[ilogmask[j]]*(res+n/2)[j];
|
|
||||||
sprintf(buf,"resI%c%d",i?'R':'L',k);
|
|
||||||
_analysis_output(buf,seq,work,n/2,1,1,0);
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -697,18 +643,26 @@ static int mapping0_forward(vorbis_block *vb){
|
|||||||
/* quantize/couple */
|
/* quantize/couple */
|
||||||
/* incomplete implementation that assumes the tree is all depth
|
/* incomplete implementation that assumes the tree is all depth
|
||||||
one, or no tree at all */
|
one, or no tree at all */
|
||||||
if(info->coupling_steps){
|
_vp_couple_quantize_normalize(k,
|
||||||
_vp_couple(k,
|
&ci->psy_g_param,
|
||||||
&ci->psy_g_param,
|
psy_look,
|
||||||
psy_look,
|
info,
|
||||||
info,
|
gmdct,
|
||||||
vb->pcm,
|
iwork,
|
||||||
mag_memo,
|
nonzero,
|
||||||
mag_sort,
|
ci->psy_g_param.sliding_lowpass[vb->W][k],
|
||||||
ilogmaskch,
|
vi->channels);
|
||||||
nonzero,
|
|
||||||
ci->psy_g_param.sliding_lowpass[vb->W][k]);
|
#if 0
|
||||||
|
for(i=0;i<vi->channels;i++){
|
||||||
|
char buf[80];
|
||||||
|
sprintf(buf,"res%c%d",i?'R':'L',k);
|
||||||
|
float work[n/2];
|
||||||
|
for(j=0;j<n/2;j++)
|
||||||
|
work[j]=iwork[i][j];
|
||||||
|
_analysis_output(buf,seq,work,n/2,1,0,0);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* classify and encode by submap */
|
/* classify and encode by submap */
|
||||||
for(i=0;i<info->submaps;i++){
|
for(i=0;i<info->submaps;i++){
|
||||||
@ -720,25 +674,21 @@ static int mapping0_forward(vorbis_block *vb){
|
|||||||
if(info->chmuxlist[j]==i){
|
if(info->chmuxlist[j]==i){
|
||||||
zerobundle[ch_in_bundle]=0;
|
zerobundle[ch_in_bundle]=0;
|
||||||
if(nonzero[j])zerobundle[ch_in_bundle]=1;
|
if(nonzero[j])zerobundle[ch_in_bundle]=1;
|
||||||
res_bundle[ch_in_bundle]=vb->pcm[j];
|
couple_bundle[ch_in_bundle++]=iwork[j];
|
||||||
couple_bundle[ch_in_bundle++]=vb->pcm[j]+n/2;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
classifications=_residue_P[ci->residue_type[resnum]]->
|
classifications=_residue_P[ci->residue_type[resnum]]->
|
||||||
class(vb,b->residue[resnum],couple_bundle,zerobundle,ch_in_bundle);
|
class(vb,b->residue[resnum],couple_bundle,zerobundle,ch_in_bundle);
|
||||||
|
|
||||||
/* couple_bundle is destructively overwritten by
|
|
||||||
the class function if some but not all of the channels are
|
|
||||||
marked as silence; build a fresh copy */
|
|
||||||
ch_in_bundle=0;
|
ch_in_bundle=0;
|
||||||
for(j=0;j<vi->channels;j++)
|
for(j=0;j<vi->channels;j++)
|
||||||
if(info->chmuxlist[j]==i)
|
if(info->chmuxlist[j]==i)
|
||||||
couple_bundle[ch_in_bundle++]=vb->pcm[j]+n/2;
|
couple_bundle[ch_in_bundle++]=iwork[j];
|
||||||
|
|
||||||
_residue_P[ci->residue_type[resnum]]->
|
_residue_P[ci->residue_type[resnum]]->
|
||||||
forward(opb,vb,b->residue[resnum],
|
forward(opb,vb,b->residue[resnum],
|
||||||
couple_bundle,NULL,zerobundle,ch_in_bundle,classifications);
|
couple_bundle,zerobundle,ch_in_bundle,classifications,i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ok, done encoding. Next protopacket. */
|
/* ok, done encoding. Next protopacket. */
|
||||||
|
@ -5,13 +5,13 @@
|
|||||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||||
* *
|
* *
|
||||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 *
|
||||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||||
* *
|
* *
|
||||||
********************************************************************
|
********************************************************************
|
||||||
|
|
||||||
function: psychoacoustics not including preecho
|
function: psychoacoustics not including preecho
|
||||||
last mod: $Id: psy.c 16227 2009-07-08 06:58:46Z xiphmont $
|
last mod: $Id: psy.c 17077 2010-03-26 06:22:19Z xiphmont $
|
||||||
|
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
@ -696,92 +696,6 @@ static void bark_noise_hybridmp(int n,const long *b,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const float FLOOR1_fromdB_INV_LOOKUP[256]={
|
|
||||||
0.F, 8.81683e+06F, 8.27882e+06F, 7.77365e+06F,
|
|
||||||
7.29930e+06F, 6.85389e+06F, 6.43567e+06F, 6.04296e+06F,
|
|
||||||
5.67422e+06F, 5.32798e+06F, 5.00286e+06F, 4.69759e+06F,
|
|
||||||
4.41094e+06F, 4.14178e+06F, 3.88905e+06F, 3.65174e+06F,
|
|
||||||
3.42891e+06F, 3.21968e+06F, 3.02321e+06F, 2.83873e+06F,
|
|
||||||
2.66551e+06F, 2.50286e+06F, 2.35014e+06F, 2.20673e+06F,
|
|
||||||
2.07208e+06F, 1.94564e+06F, 1.82692e+06F, 1.71544e+06F,
|
|
||||||
1.61076e+06F, 1.51247e+06F, 1.42018e+06F, 1.33352e+06F,
|
|
||||||
1.25215e+06F, 1.17574e+06F, 1.10400e+06F, 1.03663e+06F,
|
|
||||||
973377.F, 913981.F, 858210.F, 805842.F,
|
|
||||||
756669.F, 710497.F, 667142.F, 626433.F,
|
|
||||||
588208.F, 552316.F, 518613.F, 486967.F,
|
|
||||||
457252.F, 429351.F, 403152.F, 378551.F,
|
|
||||||
355452.F, 333762.F, 313396.F, 294273.F,
|
|
||||||
276316.F, 259455.F, 243623.F, 228757.F,
|
|
||||||
214798.F, 201691.F, 189384.F, 177828.F,
|
|
||||||
166977.F, 156788.F, 147221.F, 138237.F,
|
|
||||||
129802.F, 121881.F, 114444.F, 107461.F,
|
|
||||||
100903.F, 94746.3F, 88964.9F, 83536.2F,
|
|
||||||
78438.8F, 73652.5F, 69158.2F, 64938.1F,
|
|
||||||
60975.6F, 57254.9F, 53761.2F, 50480.6F,
|
|
||||||
47400.3F, 44507.9F, 41792.0F, 39241.9F,
|
|
||||||
36847.3F, 34598.9F, 32487.7F, 30505.3F,
|
|
||||||
28643.8F, 26896.0F, 25254.8F, 23713.7F,
|
|
||||||
22266.7F, 20908.0F, 19632.2F, 18434.2F,
|
|
||||||
17309.4F, 16253.1F, 15261.4F, 14330.1F,
|
|
||||||
13455.7F, 12634.6F, 11863.7F, 11139.7F,
|
|
||||||
10460.0F, 9821.72F, 9222.39F, 8659.64F,
|
|
||||||
8131.23F, 7635.06F, 7169.17F, 6731.70F,
|
|
||||||
6320.93F, 5935.23F, 5573.06F, 5232.99F,
|
|
||||||
4913.67F, 4613.84F, 4332.30F, 4067.94F,
|
|
||||||
3819.72F, 3586.64F, 3367.78F, 3162.28F,
|
|
||||||
2969.31F, 2788.13F, 2617.99F, 2458.24F,
|
|
||||||
2308.24F, 2167.39F, 2035.14F, 1910.95F,
|
|
||||||
1794.35F, 1684.85F, 1582.04F, 1485.51F,
|
|
||||||
1394.86F, 1309.75F, 1229.83F, 1154.78F,
|
|
||||||
1084.32F, 1018.15F, 956.024F, 897.687F,
|
|
||||||
842.910F, 791.475F, 743.179F, 697.830F,
|
|
||||||
655.249F, 615.265F, 577.722F, 542.469F,
|
|
||||||
509.367F, 478.286F, 449.101F, 421.696F,
|
|
||||||
395.964F, 371.803F, 349.115F, 327.812F,
|
|
||||||
307.809F, 289.026F, 271.390F, 254.830F,
|
|
||||||
239.280F, 224.679F, 210.969F, 198.096F,
|
|
||||||
186.008F, 174.658F, 164.000F, 153.993F,
|
|
||||||
144.596F, 135.773F, 127.488F, 119.708F,
|
|
||||||
112.404F, 105.545F, 99.1046F, 93.0572F,
|
|
||||||
87.3788F, 82.0469F, 77.0404F, 72.3394F,
|
|
||||||
67.9252F, 63.7804F, 59.8885F, 56.2341F,
|
|
||||||
52.8027F, 49.5807F, 46.5553F, 43.7144F,
|
|
||||||
41.0470F, 38.5423F, 36.1904F, 33.9821F,
|
|
||||||
31.9085F, 29.9614F, 28.1332F, 26.4165F,
|
|
||||||
24.8045F, 23.2910F, 21.8697F, 20.5352F,
|
|
||||||
19.2822F, 18.1056F, 17.0008F, 15.9634F,
|
|
||||||
14.9893F, 14.0746F, 13.2158F, 12.4094F,
|
|
||||||
11.6522F, 10.9411F, 10.2735F, 9.64662F,
|
|
||||||
9.05798F, 8.50526F, 7.98626F, 7.49894F,
|
|
||||||
7.04135F, 6.61169F, 6.20824F, 5.82941F,
|
|
||||||
5.47370F, 5.13970F, 4.82607F, 4.53158F,
|
|
||||||
4.25507F, 3.99542F, 3.75162F, 3.52269F,
|
|
||||||
3.30774F, 3.10590F, 2.91638F, 2.73842F,
|
|
||||||
2.57132F, 2.41442F, 2.26709F, 2.12875F,
|
|
||||||
1.99885F, 1.87688F, 1.76236F, 1.65482F,
|
|
||||||
1.55384F, 1.45902F, 1.36999F, 1.28640F,
|
|
||||||
1.20790F, 1.13419F, 1.06499F, 1.F
|
|
||||||
};
|
|
||||||
|
|
||||||
void _vp_remove_floor(vorbis_look_psy *p,
|
|
||||||
float *mdct,
|
|
||||||
int *codedflr,
|
|
||||||
float *residue,
|
|
||||||
int sliding_lowpass){
|
|
||||||
|
|
||||||
int i,n=p->n;
|
|
||||||
|
|
||||||
if(sliding_lowpass>n)sliding_lowpass=n;
|
|
||||||
|
|
||||||
for(i=0;i<sliding_lowpass;i++){
|
|
||||||
residue[i]=
|
|
||||||
mdct[i]*FLOOR1_fromdB_INV_LOOKUP[codedflr[i]];
|
|
||||||
}
|
|
||||||
|
|
||||||
for(;i<n;i++)
|
|
||||||
residue[i]=0.;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _vp_noisemask(vorbis_look_psy *p,
|
void _vp_noisemask(vorbis_look_psy *p,
|
||||||
float *logmdct,
|
float *logmdct,
|
||||||
float *logmask){
|
float *logmask){
|
||||||
@ -926,305 +840,356 @@ float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd){
|
|||||||
return(amp);
|
return(amp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void couple_lossless(float A, float B,
|
static float FLOOR1_fromdB_LOOKUP[256]={
|
||||||
float *qA, float *qB){
|
1.0649863e-07F, 1.1341951e-07F, 1.2079015e-07F, 1.2863978e-07F,
|
||||||
int test1=fabs(*qA)>fabs(*qB);
|
1.3699951e-07F, 1.4590251e-07F, 1.5538408e-07F, 1.6548181e-07F,
|
||||||
test1-= fabs(*qA)<fabs(*qB);
|
1.7623575e-07F, 1.8768855e-07F, 1.9988561e-07F, 2.128753e-07F,
|
||||||
|
2.2670913e-07F, 2.4144197e-07F, 2.5713223e-07F, 2.7384213e-07F,
|
||||||
if(!test1)test1=((fabs(A)>fabs(B))<<1)-1;
|
2.9163793e-07F, 3.1059021e-07F, 3.3077411e-07F, 3.5226968e-07F,
|
||||||
if(test1==1){
|
3.7516214e-07F, 3.9954229e-07F, 4.2550680e-07F, 4.5315863e-07F,
|
||||||
*qB=(*qA>0.f?*qA-*qB:*qB-*qA);
|
4.8260743e-07F, 5.1396998e-07F, 5.4737065e-07F, 5.8294187e-07F,
|
||||||
}else{
|
6.2082472e-07F, 6.6116941e-07F, 7.0413592e-07F, 7.4989464e-07F,
|
||||||
float temp=*qB;
|
7.9862701e-07F, 8.5052630e-07F, 9.0579828e-07F, 9.6466216e-07F,
|
||||||
*qB=(*qB>0.f?*qA-*qB:*qB-*qA);
|
1.0273513e-06F, 1.0941144e-06F, 1.1652161e-06F, 1.2409384e-06F,
|
||||||
*qA=temp;
|
1.3215816e-06F, 1.4074654e-06F, 1.4989305e-06F, 1.5963394e-06F,
|
||||||
}
|
1.7000785e-06F, 1.8105592e-06F, 1.9282195e-06F, 2.0535261e-06F,
|
||||||
|
2.1869758e-06F, 2.3290978e-06F, 2.4804557e-06F, 2.6416497e-06F,
|
||||||
if(*qB>fabs(*qA)*1.9999f){
|
2.8133190e-06F, 2.9961443e-06F, 3.1908506e-06F, 3.3982101e-06F,
|
||||||
*qB= -fabs(*qA)*2.f;
|
3.6190449e-06F, 3.8542308e-06F, 4.1047004e-06F, 4.3714470e-06F,
|
||||||
*qA= -*qA;
|
4.6555282e-06F, 4.9580707e-06F, 5.2802740e-06F, 5.6234160e-06F,
|
||||||
}
|
5.9888572e-06F, 6.3780469e-06F, 6.7925283e-06F, 7.2339451e-06F,
|
||||||
}
|
7.7040476e-06F, 8.2047000e-06F, 8.7378876e-06F, 9.3057248e-06F,
|
||||||
|
9.9104632e-06F, 1.0554501e-05F, 1.1240392e-05F, 1.1970856e-05F,
|
||||||
static const float hypot_lookup[32]={
|
1.2748789e-05F, 1.3577278e-05F, 1.4459606e-05F, 1.5399272e-05F,
|
||||||
-0.009935, -0.011245, -0.012726, -0.014397,
|
1.6400004e-05F, 1.7465768e-05F, 1.8600792e-05F, 1.9809576e-05F,
|
||||||
-0.016282, -0.018407, -0.020800, -0.023494,
|
2.1096914e-05F, 2.2467911e-05F, 2.3928002e-05F, 2.5482978e-05F,
|
||||||
-0.026522, -0.029923, -0.033737, -0.038010,
|
2.7139006e-05F, 2.8902651e-05F, 3.0780908e-05F, 3.2781225e-05F,
|
||||||
-0.042787, -0.048121, -0.054064, -0.060671,
|
3.4911534e-05F, 3.7180282e-05F, 3.9596466e-05F, 4.2169667e-05F,
|
||||||
-0.068000, -0.076109, -0.085054, -0.094892,
|
4.4910090e-05F, 4.7828601e-05F, 5.0936773e-05F, 5.4246931e-05F,
|
||||||
-0.105675, -0.117451, -0.130260, -0.144134,
|
5.7772202e-05F, 6.1526565e-05F, 6.5524908e-05F, 6.9783085e-05F,
|
||||||
-0.159093, -0.175146, -0.192286, -0.210490,
|
7.4317983e-05F, 7.9147585e-05F, 8.4291040e-05F, 8.9768747e-05F,
|
||||||
-0.229718, -0.249913, -0.271001, -0.292893};
|
9.5602426e-05F, 0.00010181521F, 0.00010843174F, 0.00011547824F,
|
||||||
|
0.00012298267F, 0.00013097477F, 0.00013948625F, 0.00014855085F,
|
||||||
static void precomputed_couple_point(float premag,
|
0.00015820453F, 0.00016848555F, 0.00017943469F, 0.00019109536F,
|
||||||
int floorA,int floorB,
|
0.00020351382F, 0.00021673929F, 0.00023082423F, 0.00024582449F,
|
||||||
float *mag, float *ang){
|
0.00026179955F, 0.00027881276F, 0.00029693158F, 0.00031622787F,
|
||||||
|
0.00033677814F, 0.00035866388F, 0.00038197188F, 0.00040679456F,
|
||||||
int test=(floorA>floorB)-1;
|
0.00043323036F, 0.00046138411F, 0.00049136745F, 0.00052329927F,
|
||||||
int offset=31-abs(floorA-floorB);
|
0.00055730621F, 0.00059352311F, 0.00063209358F, 0.00067317058F,
|
||||||
float floormag=hypot_lookup[((offset<0)-1)&offset]+1.f;
|
0.00071691700F, 0.00076350630F, 0.00081312324F, 0.00086596457F,
|
||||||
|
0.00092223983F, 0.00098217216F, 0.0010459992F, 0.0011139742F,
|
||||||
floormag*=FLOOR1_fromdB_INV_LOOKUP[(floorB&test)|(floorA&(~test))];
|
0.0011863665F, 0.0012634633F, 0.0013455702F, 0.0014330129F,
|
||||||
|
0.0015261382F, 0.0016253153F, 0.0017309374F, 0.0018434235F,
|
||||||
*mag=premag*floormag;
|
0.0019632195F, 0.0020908006F, 0.0022266726F, 0.0023713743F,
|
||||||
*ang=0.f;
|
0.0025254795F, 0.0026895994F, 0.0028643847F, 0.0030505286F,
|
||||||
}
|
0.0032487691F, 0.0034598925F, 0.0036847358F, 0.0039241906F,
|
||||||
|
0.0041792066F, 0.0044507950F, 0.0047400328F, 0.0050480668F,
|
||||||
/* just like below, this is currently set up to only do
|
0.0053761186F, 0.0057254891F, 0.0060975636F, 0.0064938176F,
|
||||||
single-step-depth coupling. Otherwise, we'd have to do more
|
0.0069158225F, 0.0073652516F, 0.0078438871F, 0.0083536271F,
|
||||||
copying (which will be inevitable later) */
|
0.0088964928F, 0.009474637F, 0.010090352F, 0.010746080F,
|
||||||
|
0.011444421F, 0.012188144F, 0.012980198F, 0.013823725F,
|
||||||
/* doing the real circular magnitude calculation is audibly superior
|
0.014722068F, 0.015678791F, 0.016697687F, 0.017782797F,
|
||||||
to (A+B)/sqrt(2) */
|
0.018938423F, 0.020169149F, 0.021479854F, 0.022875735F,
|
||||||
static float dipole_hypot(float a, float b){
|
0.024362330F, 0.025945531F, 0.027631618F, 0.029427276F,
|
||||||
if(a>0.){
|
0.031339626F, 0.033376252F, 0.035545228F, 0.037855157F,
|
||||||
if(b>0.)return sqrt(a*a+b*b);
|
0.040315199F, 0.042935108F, 0.045725273F, 0.048696758F,
|
||||||
if(a>-b)return sqrt(a*a-b*b);
|
0.051861348F, 0.055231591F, 0.058820850F, 0.062643361F,
|
||||||
return -sqrt(b*b-a*a);
|
0.066714279F, 0.071049749F, 0.075666962F, 0.080584227F,
|
||||||
}
|
0.085821044F, 0.091398179F, 0.097337747F, 0.10366330F,
|
||||||
if(b<0.)return -sqrt(a*a+b*b);
|
0.11039993F, 0.11757434F, 0.12521498F, 0.13335215F,
|
||||||
if(-a>b)return -sqrt(a*a-b*b);
|
0.14201813F, 0.15124727F, 0.16107617F, 0.17154380F,
|
||||||
return sqrt(b*b-a*a);
|
0.18269168F, 0.19456402F, 0.20720788F, 0.22067342F,
|
||||||
}
|
0.23501402F, 0.25028656F, 0.26655159F, 0.28387361F,
|
||||||
static float round_hypot(float a, float b){
|
0.30232132F, 0.32196786F, 0.34289114F, 0.36517414F,
|
||||||
if(a>0.){
|
0.38890521F, 0.41417847F, 0.44109412F, 0.46975890F,
|
||||||
if(b>0.)return sqrt(a*a+b*b);
|
0.50028648F, 0.53279791F, 0.56742212F, 0.60429640F,
|
||||||
if(a>-b)return sqrt(a*a+b*b);
|
0.64356699F, 0.68538959F, 0.72993007F, 0.77736504F,
|
||||||
return -sqrt(b*b+a*a);
|
0.82788260F, 0.88168307F, 0.9389798F, 1.F,
|
||||||
}
|
};
|
||||||
if(b<0.)return -sqrt(a*a+b*b);
|
|
||||||
if(-a>b)return -sqrt(a*a+b*b);
|
|
||||||
return sqrt(b*b+a*a);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* revert to round hypot for now */
|
|
||||||
float **_vp_quantize_couple_memo(vorbis_block *vb,
|
|
||||||
vorbis_info_psy_global *g,
|
|
||||||
vorbis_look_psy *p,
|
|
||||||
vorbis_info_mapping0 *vi,
|
|
||||||
float **mdct){
|
|
||||||
|
|
||||||
int i,j,n=p->n;
|
|
||||||
float **ret=_vorbis_block_alloc(vb,vi->coupling_steps*sizeof(*ret));
|
|
||||||
int limit=g->coupling_pointlimit[p->vi->blockflag][PACKETBLOBS/2];
|
|
||||||
|
|
||||||
for(i=0;i<vi->coupling_steps;i++){
|
|
||||||
float *mdctM=mdct[vi->coupling_mag[i]];
|
|
||||||
float *mdctA=mdct[vi->coupling_ang[i]];
|
|
||||||
ret[i]=_vorbis_block_alloc(vb,n*sizeof(**ret));
|
|
||||||
for(j=0;j<limit;j++)
|
|
||||||
ret[i][j]=dipole_hypot(mdctM[j],mdctA[j]);
|
|
||||||
for(;j<n;j++)
|
|
||||||
ret[i][j]=round_hypot(mdctM[j],mdctA[j]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* this is for per-channel noise normalization */
|
/* this is for per-channel noise normalization */
|
||||||
static int apsort(const void *a, const void *b){
|
static int apsort(const void *a, const void *b){
|
||||||
float f1=fabs(**(float**)a);
|
float f1=**(float**)a;
|
||||||
float f2=fabs(**(float**)b);
|
float f2=**(float**)b;
|
||||||
return (f1<f2)-(f1>f2);
|
return (f1<f2)-(f1>f2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int **_vp_quantize_couple_sort(vorbis_block *vb,
|
static void flag_lossless(int limit, float prepoint, float postpoint, float *mdct,
|
||||||
vorbis_look_psy *p,
|
float *floor, int *flag, int i, int jn){
|
||||||
vorbis_info_mapping0 *vi,
|
int j;
|
||||||
float **mags){
|
for(j=0;j<jn;j++){
|
||||||
|
float point = j>=limit-i ? postpoint : prepoint;
|
||||||
|
float r = fabs(mdct[j])/floor[j];
|
||||||
if(p->vi->normal_point_p){
|
if(r<point)
|
||||||
int i,j,k,n=p->n;
|
flag[j]=0;
|
||||||
int **ret=_vorbis_block_alloc(vb,vi->coupling_steps*sizeof(*ret));
|
else
|
||||||
int partition=p->vi->normal_partition;
|
flag[j]=1;
|
||||||
float **work=alloca(sizeof(*work)*partition);
|
|
||||||
|
|
||||||
for(i=0;i<vi->coupling_steps;i++){
|
|
||||||
ret[i]=_vorbis_block_alloc(vb,n*sizeof(**ret));
|
|
||||||
|
|
||||||
for(j=0;j<n;j+=partition){
|
|
||||||
for(k=0;k<partition;k++)work[k]=mags[i]+k+j;
|
|
||||||
qsort(work,partition,sizeof(*work),apsort);
|
|
||||||
for(k=0;k<partition;k++)ret[i][k+j]=work[k]-mags[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
return(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _vp_noise_normalize_sort(vorbis_look_psy *p,
|
|
||||||
float *magnitudes,int *sortedindex){
|
|
||||||
int i,j,n=p->n;
|
|
||||||
vorbis_info_psy *vi=p->vi;
|
|
||||||
int partition=vi->normal_partition;
|
|
||||||
float **work=alloca(sizeof(*work)*partition);
|
|
||||||
int start=vi->normal_start;
|
|
||||||
|
|
||||||
for(j=start;j<n;j+=partition){
|
|
||||||
if(j+partition>n)partition=n-j;
|
|
||||||
for(i=0;i<partition;i++)work[i]=magnitudes+i+j;
|
|
||||||
qsort(work,partition,sizeof(*work),apsort);
|
|
||||||
for(i=0;i<partition;i++){
|
|
||||||
sortedindex[i+j-start]=work[i]-magnitudes;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _vp_noise_normalize(vorbis_look_psy *p,
|
/* Overload/Side effect: On input, the *q vector holds either the
|
||||||
float *in,float *out,int *sortedindex){
|
quantized energy (for elements with the flag set) or the absolute
|
||||||
int flag=0,i,j=0,n=p->n;
|
values of the *r vector (for elements with flag unset). On output,
|
||||||
vorbis_info_psy *vi=p->vi;
|
*q holds the quantized energy for all elements */
|
||||||
int partition=vi->normal_partition;
|
static float noise_normalize(vorbis_look_psy *p, int limit, float *r, float *q, float *f, int *flags, float acc, int i, int n, int *out){
|
||||||
int start=vi->normal_start;
|
|
||||||
|
|
||||||
|
vorbis_info_psy *vi=p->vi;
|
||||||
|
float **sort = alloca(n*sizeof(*sort));
|
||||||
|
int j,count=0;
|
||||||
|
int start = (vi->normal_p ? vi->normal_start-i : n);
|
||||||
if(start>n)start=n;
|
if(start>n)start=n;
|
||||||
|
|
||||||
if(vi->normal_channel_p){
|
/* force classic behavior where only energy in the current band is considered */
|
||||||
for(;j<start;j++)
|
acc=0.f;
|
||||||
out[j]=rint(in[j]);
|
|
||||||
|
|
||||||
for(;j+partition<=n;j+=partition){
|
/* still responsible for populating *out where noise norm not in
|
||||||
float acc=0.;
|
effect. There's no need to [re]populate *q in these areas */
|
||||||
int k;
|
for(j=0;j<start;j++){
|
||||||
|
if(!flags || !flags[j]){ /* lossless coupling already quantized.
|
||||||
|
Don't touch; requantizing based on
|
||||||
|
energy would be incorrect. */
|
||||||
|
float ve = q[j]/f[j];
|
||||||
|
if(r[j]<0)
|
||||||
|
out[j] = -rint(sqrt(ve));
|
||||||
|
else
|
||||||
|
out[j] = rint(sqrt(ve));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for(i=j;i<j+partition;i++)
|
/* sort magnitudes for noise norm portion of partition */
|
||||||
acc+=in[i]*in[i];
|
for(;j<n;j++){
|
||||||
|
if(!flags || !flags[j]){ /* can't noise norm elements that have
|
||||||
for(i=0;i<partition;i++){
|
already been loslessly coupled; we can
|
||||||
k=sortedindex[i+j-start];
|
only account for their energy error */
|
||||||
|
float ve = q[j]/f[j];
|
||||||
if(in[k]*in[k]>=.25f){
|
/* Despite all the new, more capable coupling code, for now we
|
||||||
out[k]=rint(in[k]);
|
implement noise norm as it has been up to this point. Only
|
||||||
acc-=in[k]*in[k];
|
consider promotions to unit magnitude from 0. In addition
|
||||||
flag=1;
|
the only energy error counted is quantizations to zero. */
|
||||||
}else{
|
/* also-- the original point code only applied noise norm at > pointlimit */
|
||||||
if(acc<vi->normal_thresh)break;
|
if(ve<.25f && (!flags || j>=limit-i)){
|
||||||
out[k]=unitnorm(in[k]);
|
acc += ve;
|
||||||
acc-=1.;
|
sort[count++]=q+j; /* q is fabs(r) for unflagged element */
|
||||||
}
|
}else{
|
||||||
|
/* For now: no acc adjustment for nonzero quantization. populate *out and q as this value is final. */
|
||||||
|
if(r[j]<0)
|
||||||
|
out[j] = -rint(sqrt(ve));
|
||||||
|
else
|
||||||
|
out[j] = rint(sqrt(ve));
|
||||||
|
q[j] = out[j]*out[j]*f[j];
|
||||||
}
|
}
|
||||||
|
}/* else{
|
||||||
|
again, no energy adjustment for error in nonzero quant-- for now
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
for(;i<partition;i++){
|
if(count){
|
||||||
k=sortedindex[i+j-start];
|
/* noise norm to do */
|
||||||
out[k]=0.;
|
qsort(sort,count,sizeof(*sort),apsort);
|
||||||
|
for(j=0;j<count;j++){
|
||||||
|
int k=sort[j]-q;
|
||||||
|
if(acc>=vi->normal_thresh){
|
||||||
|
out[k]=unitnorm(r[k]);
|
||||||
|
acc-=1.f;
|
||||||
|
q[k]=f[k];
|
||||||
|
}else{
|
||||||
|
out[k]=0;
|
||||||
|
q[k]=0.f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(;j<n;j++)
|
return acc;
|
||||||
out[j]=rint(in[j]);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _vp_couple(int blobno,
|
/* Noise normalization, quantization and coupling are not wholly
|
||||||
vorbis_info_psy_global *g,
|
seperable processes in depth>1 coupling. */
|
||||||
vorbis_look_psy *p,
|
void _vp_couple_quantize_normalize(int blobno,
|
||||||
vorbis_info_mapping0 *vi,
|
vorbis_info_psy_global *g,
|
||||||
float **res,
|
vorbis_look_psy *p,
|
||||||
float **mag_memo,
|
vorbis_info_mapping0 *vi,
|
||||||
int **mag_sort,
|
float **mdct,
|
||||||
int **ifloor,
|
int **iwork,
|
||||||
int *nonzero,
|
int *nonzero,
|
||||||
int sliding_lowpass){
|
int sliding_lowpass,
|
||||||
|
int ch){
|
||||||
|
|
||||||
int i,j,k,n=p->n;
|
int i;
|
||||||
|
int n = p->n;
|
||||||
|
int partition=(p->vi->normal_p ? p->vi->normal_partition : 16);
|
||||||
|
int limit = g->coupling_pointlimit[p->vi->blockflag][blobno];
|
||||||
|
float prepoint=stereo_threshholds[g->coupling_prepointamp[blobno]];
|
||||||
|
float postpoint=stereo_threshholds[g->coupling_postpointamp[blobno]];
|
||||||
|
float de=0.1*p->m_val; /* a blend of the AoTuV M2 and M3 code here and below */
|
||||||
|
|
||||||
|
/* mdct is our raw mdct output, floor not removed. */
|
||||||
|
/* inout passes in the ifloor, passes back quantized result */
|
||||||
|
|
||||||
|
/* unquantized energy (negative indicates amplitude has negative sign) */
|
||||||
|
float **raw = alloca(ch*sizeof(*raw));
|
||||||
|
|
||||||
|
/* dual pupose; quantized energy (if flag set), othersize fabs(raw) */
|
||||||
|
float **quant = alloca(ch*sizeof(*quant));
|
||||||
|
|
||||||
|
/* floor energy */
|
||||||
|
float **floor = alloca(ch*sizeof(*floor));
|
||||||
|
|
||||||
|
/* flags indicating raw/quantized status of elements in raw vector */
|
||||||
|
int **flag = alloca(ch*sizeof(*flag));
|
||||||
|
|
||||||
|
/* non-zero flag working vector */
|
||||||
|
int *nz = alloca(ch*sizeof(*nz));
|
||||||
|
|
||||||
|
/* energy surplus/defecit tracking */
|
||||||
|
float *acc = alloca((ch+vi->coupling_steps)*sizeof(*acc));
|
||||||
|
|
||||||
|
/* The threshold of a stereo is changed with the size of n */
|
||||||
|
if(n > 1000)
|
||||||
|
postpoint=stereo_threshholds_limited[g->coupling_postpointamp[blobno]];
|
||||||
|
|
||||||
|
raw[0] = alloca(ch*partition*sizeof(**raw));
|
||||||
|
quant[0] = alloca(ch*partition*sizeof(**quant));
|
||||||
|
floor[0] = alloca(ch*partition*sizeof(**floor));
|
||||||
|
flag[0] = alloca(ch*partition*sizeof(**flag));
|
||||||
|
|
||||||
|
for(i=1;i<ch;i++){
|
||||||
|
raw[i] = &raw[0][partition*i];
|
||||||
|
quant[i] = &quant[0][partition*i];
|
||||||
|
floor[i] = &floor[0][partition*i];
|
||||||
|
flag[i] = &flag[0][partition*i];
|
||||||
|
}
|
||||||
|
for(i=0;i<ch+vi->coupling_steps;i++)
|
||||||
|
acc[i]=0.f;
|
||||||
|
|
||||||
|
for(i=0;i<n;i+=partition){
|
||||||
|
int k,j,jn = partition > n-i ? n-i : partition;
|
||||||
|
int step,track = 0;
|
||||||
|
|
||||||
|
memcpy(nz,nonzero,sizeof(*nz)*ch);
|
||||||
|
|
||||||
|
/* prefill */
|
||||||
|
memset(flag[0],0,ch*partition*sizeof(**flag));
|
||||||
|
for(k=0;k<ch;k++){
|
||||||
|
int *iout = &iwork[k][i];
|
||||||
|
if(nz[k]){
|
||||||
|
|
||||||
|
for(j=0;j<jn;j++)
|
||||||
|
floor[k][j] = FLOOR1_fromdB_LOOKUP[iout[j]];
|
||||||
|
|
||||||
|
flag_lossless(limit,prepoint,postpoint,&mdct[k][i],floor[k],flag[k],i,jn);
|
||||||
|
|
||||||
|
for(j=0;j<jn;j++){
|
||||||
|
quant[k][j] = raw[k][j] = mdct[k][i+j]*mdct[k][i+j];
|
||||||
|
if(mdct[k][i+j]<0.f) raw[k][j]*=-1.f;
|
||||||
|
floor[k][j]*=floor[k][j];
|
||||||
|
}
|
||||||
|
|
||||||
|
acc[track]=noise_normalize(p,limit,raw[k],quant[k],floor[k],NULL,acc[track],i,jn,iout);
|
||||||
|
|
||||||
|
}else{
|
||||||
|
for(j=0;j<jn;j++){
|
||||||
|
floor[k][j] = 1e-10f;
|
||||||
|
raw[k][j] = 0.f;
|
||||||
|
quant[k][j] = 0.f;
|
||||||
|
flag[k][j] = 0;
|
||||||
|
iout[j]=0;
|
||||||
|
}
|
||||||
|
acc[track]=0.f;
|
||||||
|
}
|
||||||
|
track++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* coupling */
|
||||||
|
for(step=0;step<vi->coupling_steps;step++){
|
||||||
|
int Mi = vi->coupling_mag[step];
|
||||||
|
int Ai = vi->coupling_ang[step];
|
||||||
|
int *iM = &iwork[Mi][i];
|
||||||
|
int *iA = &iwork[Ai][i];
|
||||||
|
float *reM = raw[Mi];
|
||||||
|
float *reA = raw[Ai];
|
||||||
|
float *qeM = quant[Mi];
|
||||||
|
float *qeA = quant[Ai];
|
||||||
|
float *floorM = floor[Mi];
|
||||||
|
float *floorA = floor[Ai];
|
||||||
|
int *fM = flag[Mi];
|
||||||
|
int *fA = flag[Ai];
|
||||||
|
|
||||||
|
if(nz[Mi] || nz[Ai]){
|
||||||
|
nz[Mi] = nz[Ai] = 1;
|
||||||
|
|
||||||
|
for(j=0;j<jn;j++){
|
||||||
|
|
||||||
|
if(j<sliding_lowpass-i){
|
||||||
|
if(fM[j] || fA[j]){
|
||||||
|
/* lossless coupling */
|
||||||
|
|
||||||
|
reM[j] = fabs(reM[j])+fabs(reA[j]);
|
||||||
|
qeM[j] = qeM[j]+qeA[j];
|
||||||
|
fM[j]=fA[j]=1;
|
||||||
|
|
||||||
|
/* couple iM/iA */
|
||||||
|
{
|
||||||
|
int A = iM[j];
|
||||||
|
int B = iA[j];
|
||||||
|
|
||||||
|
if(abs(A)>abs(B)){
|
||||||
|
iA[j]=(A>0?A-B:B-A);
|
||||||
|
}else{
|
||||||
|
iA[j]=(B>0?A-B:B-A);
|
||||||
|
iM[j]=B;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* collapse two equivalent tuples to one */
|
||||||
|
if(iA[j]>=abs(iM[j])*2){
|
||||||
|
iA[j]= -iA[j];
|
||||||
|
iM[j]= -iM[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
/* lossy (point) coupling */
|
||||||
|
if(j<limit-i){
|
||||||
|
/* dipole */
|
||||||
|
reM[j] += reA[j];
|
||||||
|
qeM[j] = fabs(reM[j]);
|
||||||
|
}else{
|
||||||
|
/* AoTuV */
|
||||||
|
/** @ M2 **
|
||||||
|
The boost problem by the combination of noise normalization and point stereo is eased.
|
||||||
|
However, this is a temporary patch.
|
||||||
|
by Aoyumi @ 2004/04/18
|
||||||
|
*/
|
||||||
|
float derate = (1.0 - de*((float)(j-limit+i) / (float)(n-limit)));
|
||||||
|
|
||||||
|
/* elliptical */
|
||||||
|
if(reM[j]+reA[j]<0){
|
||||||
|
reM[j] = - (qeM[j] = (fabs(reM[j])+fabs(reA[j]))*derate*derate);
|
||||||
|
}else{
|
||||||
|
reM[j] = (qeM[j] = (fabs(reM[j])+fabs(reA[j]))*derate*derate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reA[j]=qeA[j]=0.f;
|
||||||
|
fA[j]=1;
|
||||||
|
iA[j]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
floorM[j]=floorA[j]=floorM[j]+floorA[j];
|
||||||
|
}
|
||||||
|
/* normalize the resulting mag vector */
|
||||||
|
acc[track]=noise_normalize(p,limit,raw[Mi],quant[Mi],floor[Mi],flag[Mi],acc[track],i,jn,iM);
|
||||||
|
track++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* perform any requested channel coupling */
|
|
||||||
/* point stereo can only be used in a first stage (in this encoder)
|
|
||||||
because of the dependency on floor lookups */
|
|
||||||
for(i=0;i<vi->coupling_steps;i++){
|
for(i=0;i<vi->coupling_steps;i++){
|
||||||
|
|
||||||
/* once we're doing multistage coupling in which a channel goes
|
|
||||||
through more than one coupling step, the floor vector
|
|
||||||
magnitudes will also have to be recalculated an propogated
|
|
||||||
along with PCM. Right now, we're not (that will wait until 5.1
|
|
||||||
most likely), so the code isn't here yet. The memory management
|
|
||||||
here is all assuming single depth couplings anyway. */
|
|
||||||
|
|
||||||
/* make sure coupling a zero and a nonzero channel results in two
|
/* make sure coupling a zero and a nonzero channel results in two
|
||||||
nonzero channels. */
|
nonzero channels. */
|
||||||
if(nonzero[vi->coupling_mag[i]] ||
|
if(nonzero[vi->coupling_mag[i]] ||
|
||||||
nonzero[vi->coupling_ang[i]]){
|
nonzero[vi->coupling_ang[i]]){
|
||||||
|
|
||||||
|
|
||||||
float *rM=res[vi->coupling_mag[i]];
|
|
||||||
float *rA=res[vi->coupling_ang[i]];
|
|
||||||
float *qM=rM+n;
|
|
||||||
float *qA=rA+n;
|
|
||||||
int *floorM=ifloor[vi->coupling_mag[i]];
|
|
||||||
int *floorA=ifloor[vi->coupling_ang[i]];
|
|
||||||
float prepoint=stereo_threshholds[g->coupling_prepointamp[blobno]];
|
|
||||||
float postpoint=stereo_threshholds[g->coupling_postpointamp[blobno]];
|
|
||||||
int partition=(p->vi->normal_point_p?p->vi->normal_partition:p->n);
|
|
||||||
int limit=g->coupling_pointlimit[p->vi->blockflag][blobno];
|
|
||||||
int pointlimit=limit;
|
|
||||||
|
|
||||||
nonzero[vi->coupling_mag[i]]=1;
|
nonzero[vi->coupling_mag[i]]=1;
|
||||||
nonzero[vi->coupling_ang[i]]=1;
|
nonzero[vi->coupling_ang[i]]=1;
|
||||||
|
|
||||||
/* The threshold of a stereo is changed with the size of n */
|
|
||||||
if(n > 1000)
|
|
||||||
postpoint=stereo_threshholds_limited[g->coupling_postpointamp[blobno]];
|
|
||||||
|
|
||||||
for(j=0;j<p->n;j+=partition){
|
|
||||||
float acc=0.f;
|
|
||||||
|
|
||||||
for(k=0;k<partition;k++){
|
|
||||||
int l=k+j;
|
|
||||||
|
|
||||||
if(l<sliding_lowpass){
|
|
||||||
if((l>=limit && fabs(rM[l])<postpoint && fabs(rA[l])<postpoint) ||
|
|
||||||
(fabs(rM[l])<prepoint && fabs(rA[l])<prepoint)){
|
|
||||||
|
|
||||||
|
|
||||||
precomputed_couple_point(mag_memo[i][l],
|
|
||||||
floorM[l],floorA[l],
|
|
||||||
qM+l,qA+l);
|
|
||||||
|
|
||||||
if(rint(qM[l])==0.f)acc+=qM[l]*qM[l];
|
|
||||||
}else{
|
|
||||||
couple_lossless(rM[l],rA[l],qM+l,qA+l);
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
qM[l]=0.;
|
|
||||||
qA[l]=0.;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(p->vi->normal_point_p){
|
|
||||||
for(k=0;k<partition && acc>=p->vi->normal_thresh;k++){
|
|
||||||
int l=mag_sort[i][j+k];
|
|
||||||
if(l<sliding_lowpass && l>=pointlimit && rint(qM[l])==0.f){
|
|
||||||
qM[l]=unitnorm(qM[l]);
|
|
||||||
acc-=1.f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* AoTuV */
|
|
||||||
/** @ M2 **
|
|
||||||
The boost problem by the combination of noise normalization and point stereo is eased.
|
|
||||||
However, this is a temporary patch.
|
|
||||||
by Aoyumi @ 2004/04/18
|
|
||||||
*/
|
|
||||||
|
|
||||||
void hf_reduction(vorbis_info_psy_global *g,
|
|
||||||
vorbis_look_psy *p,
|
|
||||||
vorbis_info_mapping0 *vi,
|
|
||||||
float **mdct){
|
|
||||||
|
|
||||||
int i,j,n=p->n, de=0.3*p->m_val;
|
|
||||||
int limit=g->coupling_pointlimit[p->vi->blockflag][PACKETBLOBS/2];
|
|
||||||
|
|
||||||
for(i=0; i<vi->coupling_steps; i++){
|
|
||||||
/* for(j=start; j<limit; j++){} // ???*/
|
|
||||||
for(j=limit; j<n; j++)
|
|
||||||
mdct[i][j] *= (1.0 - de*((float)(j-limit) / (float)(n-limit)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -5,13 +5,13 @@
|
|||||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||||
* *
|
* *
|
||||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 *
|
||||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||||
* *
|
* *
|
||||||
********************************************************************
|
********************************************************************
|
||||||
|
|
||||||
function: residue backend 0, 1 and 2 implementation
|
function: residue backend 0, 1 and 2 implementation
|
||||||
last mod: $Id: res0.c 16552 2009-09-12 02:09:04Z xiphmont $
|
last mod: $Id: res0.c 16962 2010-03-11 07:30:34Z xiphmont $
|
||||||
|
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
@ -31,6 +31,9 @@
|
|||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
|
//#define TRAIN_RES 1
|
||||||
|
//#define TRAIN_RESAUX 1
|
||||||
|
|
||||||
#if defined(TRAIN_RES) || defined (TRAIN_RESAUX)
|
#if defined(TRAIN_RES) || defined (TRAIN_RESAUX)
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#endif
|
#endif
|
||||||
@ -58,6 +61,7 @@ typedef struct {
|
|||||||
float training_min[8][64];
|
float training_min[8][64];
|
||||||
float tmin;
|
float tmin;
|
||||||
float tmax;
|
float tmax;
|
||||||
|
int submap;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} vorbis_look_residue0;
|
} vorbis_look_residue0;
|
||||||
@ -88,7 +92,7 @@ void res0_free_look(vorbis_look_residue *i){
|
|||||||
codebook *statebook=look->partbooks[j][k];
|
codebook *statebook=look->partbooks[j][k];
|
||||||
|
|
||||||
/* long and short into the same bucket by current convention */
|
/* long and short into the same bucket by current convention */
|
||||||
sprintf(buffer,"res_part%d_pass%d.vqd",j,k);
|
sprintf(buffer,"res_sub%d_part%d_pass%d.vqd",look->submap,j,k);
|
||||||
of=fopen(buffer,"a");
|
of=fopen(buffer,"a");
|
||||||
|
|
||||||
for(l=0;l<statebook->entries;l++)
|
for(l=0;l<statebook->entries;l++)
|
||||||
@ -321,65 +325,71 @@ vorbis_look_residue *res0_look(vorbis_dsp_state *vd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* break an abstraction and copy some code for performance purposes */
|
/* break an abstraction and copy some code for performance purposes */
|
||||||
static int local_book_besterror(codebook *book,float *a){
|
static int local_book_besterror(codebook *book,int *a){
|
||||||
int dim=book->dim,i,k,o;
|
int dim=book->dim;
|
||||||
int best=0;
|
int i,j,o;
|
||||||
encode_aux_threshmatch *tt=book->c->thresh_tree;
|
int minval=book->minval;
|
||||||
|
int del=book->delta;
|
||||||
/* find the quant val of each scalar */
|
int qv=book->quantvals;
|
||||||
for(k=0,o=dim;k<dim;++k){
|
int ze=(qv>>1);
|
||||||
float val=a[--o];
|
int index=0;
|
||||||
i=tt->threshvals>>1;
|
/* assumes integer/centered encoder codebook maptype 1 no more than dim 8 */
|
||||||
|
int p[8]={0,0,0,0,0,0,0,0};
|
||||||
if(val<tt->quantthresh[i]){
|
|
||||||
if(val<tt->quantthresh[i-1]){
|
|
||||||
for(--i;i>0;--i)
|
|
||||||
if(val>=tt->quantthresh[i-1])
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
|
|
||||||
for(++i;i<tt->threshvals-1;++i)
|
|
||||||
if(val<tt->quantthresh[i])break;
|
|
||||||
|
|
||||||
|
if(del!=1){
|
||||||
|
for(i=0,o=dim;i<dim;i++){
|
||||||
|
int v = (a[--o]-minval+(del>>1))/del;
|
||||||
|
int m = (v<ze ? ((ze-v)<<1)-1 : ((v-ze)<<1));
|
||||||
|
index = index*qv+ (m<0?0:(m>=qv?qv-1:m));
|
||||||
|
p[o]=v*del+minval;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
for(i=0,o=dim;i<dim;i++){
|
||||||
|
int v = a[--o]-minval;
|
||||||
|
int m = (v<ze ? ((ze-v)<<1)-1 : ((v-ze)<<1));
|
||||||
|
index = index*qv+ (m<0?0:(m>=qv?qv-1:m));
|
||||||
|
p[o]=v*del+minval;
|
||||||
}
|
}
|
||||||
|
|
||||||
best=(best*tt->quantvals)+tt->quantmap[i];
|
|
||||||
}
|
}
|
||||||
/* regular lattices are easy :-) */
|
|
||||||
|
|
||||||
if(book->c->lengthlist[best]<=0){
|
if(book->c->lengthlist[index]<=0){
|
||||||
const static_codebook *c=book->c;
|
const static_codebook *c=book->c;
|
||||||
int i,j;
|
int best=-1;
|
||||||
float bestf=0.f;
|
/* assumes integer/centered encoder codebook maptype 1 no more than dim 8 */
|
||||||
float *e=book->valuelist;
|
int e[8]={0,0,0,0,0,0,0,0};
|
||||||
best=-1;
|
int maxval = book->minval + book->delta*(book->quantvals-1);
|
||||||
for(i=0;i<book->entries;i++){
|
for(i=0;i<book->entries;i++){
|
||||||
if(c->lengthlist[i]>0){
|
if(c->lengthlist[i]>0){
|
||||||
float this=0.f;
|
int this=0;
|
||||||
for(j=0;j<dim;j++){
|
for(j=0;j<dim;j++){
|
||||||
float val=(e[j]-a[j]);
|
int val=(e[j]-a[j]);
|
||||||
this+=val*val;
|
this+=val*val;
|
||||||
}
|
}
|
||||||
if(best==-1 || this<bestf){
|
if(best==-1 || this<best){
|
||||||
bestf=this;
|
memcpy(p,e,sizeof(p));
|
||||||
best=i;
|
best=this;
|
||||||
|
index=i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
e+=dim;
|
/* assumes the value patterning created by the tools in vq/ */
|
||||||
|
j=0;
|
||||||
|
while(e[j]>=maxval)
|
||||||
|
e[j++]=0;
|
||||||
|
if(e[j]>=0)
|
||||||
|
e[j]+=book->delta;
|
||||||
|
e[j]= -e[j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(best>-1){
|
if(index>-1){
|
||||||
float *ptr=book->valuelist+best*dim;
|
|
||||||
for(i=0;i<dim;i++)
|
for(i=0;i<dim;i++)
|
||||||
*a++ -= *ptr++;
|
*a++ -= p[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
return(best);
|
return(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _encodepart(oggpack_buffer *opb,float *vec, int n,
|
static int _encodepart(oggpack_buffer *opb,int *vec, int n,
|
||||||
codebook *book,long *acc){
|
codebook *book,long *acc){
|
||||||
int i,bits=0;
|
int i,bits=0;
|
||||||
int dim=book->dim;
|
int dim=book->dim;
|
||||||
@ -389,7 +399,7 @@ static int _encodepart(oggpack_buffer *opb,float *vec, int n,
|
|||||||
int entry=local_book_besterror(book,vec+i*dim);
|
int entry=local_book_besterror(book,vec+i*dim);
|
||||||
|
|
||||||
#ifdef TRAIN_RES
|
#ifdef TRAIN_RES
|
||||||
if(entry>0)
|
if(entry>=0)
|
||||||
acc[entry]++;
|
acc[entry]++;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -401,7 +411,7 @@ static int _encodepart(oggpack_buffer *opb,float *vec, int n,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static long **_01class(vorbis_block *vb,vorbis_look_residue *vl,
|
static long **_01class(vorbis_block *vb,vorbis_look_residue *vl,
|
||||||
float **in,int ch){
|
int **in,int ch){
|
||||||
long i,j,k;
|
long i,j,k;
|
||||||
vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;
|
vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;
|
||||||
vorbis_info_residue0 *info=look->info;
|
vorbis_info_residue0 *info=look->info;
|
||||||
@ -427,17 +437,17 @@ static long **_01class(vorbis_block *vb,vorbis_look_residue *vl,
|
|||||||
for(i=0;i<partvals;i++){
|
for(i=0;i<partvals;i++){
|
||||||
int offset=i*samples_per_partition+info->begin;
|
int offset=i*samples_per_partition+info->begin;
|
||||||
for(j=0;j<ch;j++){
|
for(j=0;j<ch;j++){
|
||||||
float max=0.;
|
int max=0;
|
||||||
float ent=0.;
|
int ent=0;
|
||||||
for(k=0;k<samples_per_partition;k++){
|
for(k=0;k<samples_per_partition;k++){
|
||||||
if(fabs(in[j][offset+k])>max)max=fabs(in[j][offset+k]);
|
if(abs(in[j][offset+k])>max)max=abs(in[j][offset+k]);
|
||||||
ent+=fabs(rint(in[j][offset+k]));
|
ent+=abs(in[j][offset+k]);
|
||||||
}
|
}
|
||||||
ent*=scale;
|
ent*=scale;
|
||||||
|
|
||||||
for(k=0;k<possible_partitions-1;k++)
|
for(k=0;k<possible_partitions-1;k++)
|
||||||
if(max<=info->classmetric1[k] &&
|
if(max<=info->classmetric1[k] &&
|
||||||
(info->classmetric2[k]<0 || (int)ent<info->classmetric2[k]))
|
(info->classmetric2[k]<0 || ent<info->classmetric2[k]))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
partword[j][i]=k;
|
partword[j][i]=k;
|
||||||
@ -467,7 +477,7 @@ static long **_01class(vorbis_block *vb,vorbis_look_residue *vl,
|
|||||||
/* designed for stereo or other modes where the partition size is an
|
/* designed for stereo or other modes where the partition size is an
|
||||||
integer multiple of the number of channels encoded in the current
|
integer multiple of the number of channels encoded in the current
|
||||||
submap */
|
submap */
|
||||||
static long **_2class(vorbis_block *vb,vorbis_look_residue *vl,float **in,
|
static long **_2class(vorbis_block *vb,vorbis_look_residue *vl,int **in,
|
||||||
int ch){
|
int ch){
|
||||||
long i,j,k,l;
|
long i,j,k,l;
|
||||||
vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;
|
vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;
|
||||||
@ -486,17 +496,17 @@ static long **_2class(vorbis_block *vb,vorbis_look_residue *vl,float **in,
|
|||||||
char buffer[80];
|
char buffer[80];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
partword[0]=_vorbis_block_alloc(vb,n*ch/samples_per_partition*sizeof(*partword[0]));
|
partword[0]=_vorbis_block_alloc(vb,partvals*sizeof(*partword[0]));
|
||||||
memset(partword[0],0,n*ch/samples_per_partition*sizeof(*partword[0]));
|
memset(partword[0],0,partvals*sizeof(*partword[0]));
|
||||||
|
|
||||||
for(i=0,l=info->begin/ch;i<partvals;i++){
|
for(i=0,l=info->begin/ch;i<partvals;i++){
|
||||||
float magmax=0.f;
|
int magmax=0;
|
||||||
float angmax=0.f;
|
int angmax=0;
|
||||||
for(j=0;j<samples_per_partition;j+=ch){
|
for(j=0;j<samples_per_partition;j+=ch){
|
||||||
if(fabs(in[0][l])>magmax)magmax=fabs(in[0][l]);
|
if(abs(in[0][l])>magmax)magmax=abs(in[0][l]);
|
||||||
for(k=1;k<ch;k++)
|
for(k=1;k<ch;k++)
|
||||||
if(fabs(in[k][l])>angmax)angmax=fabs(in[k][l]);
|
if(abs(in[k][l])>angmax)angmax=abs(in[k][l]);
|
||||||
l++;
|
l++;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(j=0;j<possible_partitions-1;j++)
|
for(j=0;j<possible_partitions-1;j++)
|
||||||
@ -524,14 +534,19 @@ static long **_2class(vorbis_block *vb,vorbis_look_residue *vl,float **in,
|
|||||||
|
|
||||||
static int _01forward(oggpack_buffer *opb,
|
static int _01forward(oggpack_buffer *opb,
|
||||||
vorbis_block *vb,vorbis_look_residue *vl,
|
vorbis_block *vb,vorbis_look_residue *vl,
|
||||||
float **in,int ch,
|
int **in,int ch,
|
||||||
long **partword,
|
long **partword,
|
||||||
int (*encode)(oggpack_buffer *,float *,int,
|
int (*encode)(oggpack_buffer *,int *,int,
|
||||||
codebook *,long *)){
|
codebook *,long *),
|
||||||
|
int submap){
|
||||||
long i,j,k,s;
|
long i,j,k,s;
|
||||||
vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;
|
vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;
|
||||||
vorbis_info_residue0 *info=look->info;
|
vorbis_info_residue0 *info=look->info;
|
||||||
|
|
||||||
|
#ifdef TRAIN_RES
|
||||||
|
look->submap=submap;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* move all this setup out later */
|
/* move all this setup out later */
|
||||||
int samples_per_partition=info->grouping;
|
int samples_per_partition=info->grouping;
|
||||||
int possible_partitions=info->partitions;
|
int possible_partitions=info->partitions;
|
||||||
@ -544,7 +559,7 @@ static int _01forward(oggpack_buffer *opb,
|
|||||||
|
|
||||||
#ifdef TRAIN_RES
|
#ifdef TRAIN_RES
|
||||||
for(i=0;i<ch;i++)
|
for(i=0;i<ch;i++)
|
||||||
for(j=info->begin;j<end;j++){
|
for(j=info->begin;j<info->end;j++){
|
||||||
if(in[i][j]>look->tmax)look->tmax=in[i][j];
|
if(in[i][j]>look->tmax)look->tmax=in[i][j];
|
||||||
if(in[i][j]<look->tmin)look->tmin=in[i][j];
|
if(in[i][j]<look->tmin)look->tmin=in[i][j];
|
||||||
}
|
}
|
||||||
@ -599,7 +614,7 @@ static int _01forward(oggpack_buffer *opb,
|
|||||||
accumulator=look->training_data[s][partword[j][i]];
|
accumulator=look->training_data[s][partword[j][i]];
|
||||||
{
|
{
|
||||||
int l;
|
int l;
|
||||||
float *samples=in[j]+offset;
|
int *samples=in[j]+offset;
|
||||||
for(l=0;l<samples_per_partition;l++){
|
for(l=0;l<samples_per_partition;l++){
|
||||||
if(samples[l]<look->training_min[s][partword[j][i]])
|
if(samples[l]<look->training_min[s][partword[j][i]])
|
||||||
look->training_min[s][partword[j][i]]=samples[l];
|
look->training_min[s][partword[j][i]]=samples[l];
|
||||||
@ -698,54 +713,6 @@ static int _01inverse(vorbis_block *vb,vorbis_look_residue *vl,
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* residue 0 and 1 are just slight variants of one another. 0 is
|
|
||||||
interleaved, 1 is not */
|
|
||||||
long **res0_class(vorbis_block *vb,vorbis_look_residue *vl,
|
|
||||||
float **in,int *nonzero,int ch){
|
|
||||||
/* we encode only the nonzero parts of a bundle */
|
|
||||||
int i,used=0;
|
|
||||||
for(i=0;i<ch;i++)
|
|
||||||
if(nonzero[i])
|
|
||||||
in[used++]=in[i];
|
|
||||||
if(used)
|
|
||||||
/*return(_01class(vb,vl,in,used,_interleaved_testhack));*/
|
|
||||||
return(_01class(vb,vl,in,used));
|
|
||||||
else
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int res0_forward(vorbis_block *vb,vorbis_look_residue *vl,
|
|
||||||
float **in,float **out,int *nonzero,int ch,
|
|
||||||
long **partword){
|
|
||||||
/* we encode only the nonzero parts of a bundle */
|
|
||||||
int i,j,used=0,n=vb->pcmend/2;
|
|
||||||
for(i=0;i<ch;i++)
|
|
||||||
if(nonzero[i]){
|
|
||||||
if(out)
|
|
||||||
for(j=0;j<n;j++)
|
|
||||||
out[i][j]+=in[i][j];
|
|
||||||
in[used++]=in[i];
|
|
||||||
}
|
|
||||||
if(used){
|
|
||||||
int ret=_01forward(vb,vl,in,used,partword,
|
|
||||||
_interleaved_encodepart);
|
|
||||||
if(out){
|
|
||||||
used=0;
|
|
||||||
for(i=0;i<ch;i++)
|
|
||||||
if(nonzero[i]){
|
|
||||||
for(j=0;j<n;j++)
|
|
||||||
out[i][j]-=in[used][j];
|
|
||||||
used++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return(ret);
|
|
||||||
}else{
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int res0_inverse(vorbis_block *vb,vorbis_look_residue *vl,
|
int res0_inverse(vorbis_block *vb,vorbis_look_residue *vl,
|
||||||
float **in,int *nonzero,int ch){
|
float **in,int *nonzero,int ch){
|
||||||
int i,used=0;
|
int i,used=0;
|
||||||
@ -759,36 +726,21 @@ int res0_inverse(vorbis_block *vb,vorbis_look_residue *vl,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int res1_forward(oggpack_buffer *opb,vorbis_block *vb,vorbis_look_residue *vl,
|
int res1_forward(oggpack_buffer *opb,vorbis_block *vb,vorbis_look_residue *vl,
|
||||||
float **in,float **out,int *nonzero,int ch,
|
int **in,int *nonzero,int ch, long **partword, int submap){
|
||||||
long **partword){
|
int i,used=0;
|
||||||
int i,j,used=0,n=vb->pcmend/2;
|
|
||||||
for(i=0;i<ch;i++)
|
for(i=0;i<ch;i++)
|
||||||
if(nonzero[i]){
|
if(nonzero[i])
|
||||||
if(out)
|
|
||||||
for(j=0;j<n;j++)
|
|
||||||
out[i][j]+=in[i][j];
|
|
||||||
in[used++]=in[i];
|
in[used++]=in[i];
|
||||||
}
|
|
||||||
|
|
||||||
if(used){
|
if(used){
|
||||||
int ret=_01forward(opb,vb,vl,in,used,partword,_encodepart);
|
return _01forward(opb,vb,vl,in,used,partword,_encodepart,submap);
|
||||||
if(out){
|
|
||||||
used=0;
|
|
||||||
for(i=0;i<ch;i++)
|
|
||||||
if(nonzero[i]){
|
|
||||||
for(j=0;j<n;j++)
|
|
||||||
out[i][j]-=in[used][j];
|
|
||||||
used++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return(ret);
|
|
||||||
}else{
|
}else{
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
long **res1_class(vorbis_block *vb,vorbis_look_residue *vl,
|
long **res1_class(vorbis_block *vb,vorbis_look_residue *vl,
|
||||||
float **in,int *nonzero,int ch){
|
int **in,int *nonzero,int ch){
|
||||||
int i,used=0;
|
int i,used=0;
|
||||||
for(i=0;i<ch;i++)
|
for(i=0;i<ch;i++)
|
||||||
if(nonzero[i])
|
if(nonzero[i])
|
||||||
@ -812,7 +764,7 @@ int res1_inverse(vorbis_block *vb,vorbis_look_residue *vl,
|
|||||||
}
|
}
|
||||||
|
|
||||||
long **res2_class(vorbis_block *vb,vorbis_look_residue *vl,
|
long **res2_class(vorbis_block *vb,vorbis_look_residue *vl,
|
||||||
float **in,int *nonzero,int ch){
|
int **in,int *nonzero,int ch){
|
||||||
int i,used=0;
|
int i,used=0;
|
||||||
for(i=0;i<ch;i++)
|
for(i=0;i<ch;i++)
|
||||||
if(nonzero[i])used++;
|
if(nonzero[i])used++;
|
||||||
@ -827,34 +779,22 @@ long **res2_class(vorbis_block *vb,vorbis_look_residue *vl,
|
|||||||
|
|
||||||
int res2_forward(oggpack_buffer *opb,
|
int res2_forward(oggpack_buffer *opb,
|
||||||
vorbis_block *vb,vorbis_look_residue *vl,
|
vorbis_block *vb,vorbis_look_residue *vl,
|
||||||
float **in,float **out,int *nonzero,int ch,
|
int **in,int *nonzero,int ch, long **partword,int submap){
|
||||||
long **partword){
|
|
||||||
long i,j,k,n=vb->pcmend/2,used=0;
|
long i,j,k,n=vb->pcmend/2,used=0;
|
||||||
|
|
||||||
/* don't duplicate the code; use a working vector hack for now and
|
/* don't duplicate the code; use a working vector hack for now and
|
||||||
reshape ourselves into a single channel res1 */
|
reshape ourselves into a single channel res1 */
|
||||||
/* ugly; reallocs for each coupling pass :-( */
|
/* ugly; reallocs for each coupling pass :-( */
|
||||||
float *work=_vorbis_block_alloc(vb,ch*n*sizeof(*work));
|
int *work=_vorbis_block_alloc(vb,ch*n*sizeof(*work));
|
||||||
for(i=0;i<ch;i++){
|
for(i=0;i<ch;i++){
|
||||||
float *pcm=in[i];
|
int *pcm=in[i];
|
||||||
if(nonzero[i])used++;
|
if(nonzero[i])used++;
|
||||||
for(j=0,k=i;j<n;j++,k+=ch)
|
for(j=0,k=i;j<n;j++,k+=ch)
|
||||||
work[k]=pcm[j];
|
work[k]=pcm[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
if(used){
|
if(used){
|
||||||
int ret=_01forward(opb,vb,vl,&work,1,partword,_encodepart);
|
return _01forward(opb,vb,vl,&work,1,partword,_encodepart,submap);
|
||||||
/* update the sofar vector */
|
|
||||||
if(out){
|
|
||||||
for(i=0;i<ch;i++){
|
|
||||||
float *pcm=in[i];
|
|
||||||
float *sofar=out[i];
|
|
||||||
for(j=0,k=i;j<n;j++,k+=ch)
|
|
||||||
sofar[j]+=pcm[j]-work[k];
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return(ret);
|
|
||||||
}else{
|
}else{
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
********************************************************************
|
********************************************************************
|
||||||
|
|
||||||
function: basic shared codebook operations
|
function: basic shared codebook operations
|
||||||
last mod: $Id: sharedbook.c 16227 2009-07-08 06:58:46Z xiphmont $
|
last mod: $Id: sharedbook.c 17030 2010-03-25 06:52:55Z xiphmont $
|
||||||
|
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
@ -52,7 +52,7 @@ long _float32_pack(float val){
|
|||||||
sign=0x80000000;
|
sign=0x80000000;
|
||||||
val= -val;
|
val= -val;
|
||||||
}
|
}
|
||||||
exp= floor(log(val)/log(2.f));
|
exp= floor(log(val)/log(2.f)+.001); //+epsilon
|
||||||
mant=rint(ldexp(val,(VQ_FMAN-1)-exp));
|
mant=rint(ldexp(val,(VQ_FMAN-1)-exp));
|
||||||
exp=(exp+VQ_FEXP_BIAS)<<VQ_FMAN;
|
exp=(exp+VQ_FEXP_BIAS)<<VQ_FMAN;
|
||||||
|
|
||||||
@ -258,34 +258,13 @@ float *_book_unquantize(const static_codebook *b,int n,int *sparsemap){
|
|||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vorbis_staticbook_clear(static_codebook *b){
|
void vorbis_staticbook_destroy(static_codebook *b){
|
||||||
if(b->allocedp){
|
if(b->allocedp){
|
||||||
if(b->quantlist)_ogg_free(b->quantlist);
|
if(b->quantlist)_ogg_free(b->quantlist);
|
||||||
if(b->lengthlist)_ogg_free(b->lengthlist);
|
if(b->lengthlist)_ogg_free(b->lengthlist);
|
||||||
if(b->nearest_tree){
|
|
||||||
_ogg_free(b->nearest_tree->ptr0);
|
|
||||||
_ogg_free(b->nearest_tree->ptr1);
|
|
||||||
_ogg_free(b->nearest_tree->p);
|
|
||||||
_ogg_free(b->nearest_tree->q);
|
|
||||||
memset(b->nearest_tree,0,sizeof(*b->nearest_tree));
|
|
||||||
_ogg_free(b->nearest_tree);
|
|
||||||
}
|
|
||||||
if(b->thresh_tree){
|
|
||||||
_ogg_free(b->thresh_tree->quantthresh);
|
|
||||||
_ogg_free(b->thresh_tree->quantmap);
|
|
||||||
memset(b->thresh_tree,0,sizeof(*b->thresh_tree));
|
|
||||||
_ogg_free(b->thresh_tree);
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(b,0,sizeof(*b));
|
memset(b,0,sizeof(*b));
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void vorbis_staticbook_destroy(static_codebook *b){
|
|
||||||
if(b->allocedp){
|
|
||||||
vorbis_staticbook_clear(b);
|
|
||||||
_ogg_free(b);
|
_ogg_free(b);
|
||||||
}
|
} /* otherwise, it is in static memory */
|
||||||
}
|
}
|
||||||
|
|
||||||
void vorbis_book_clear(codebook *b){
|
void vorbis_book_clear(codebook *b){
|
||||||
@ -309,7 +288,10 @@ int vorbis_book_init_encode(codebook *c,const static_codebook *s){
|
|||||||
c->used_entries=s->entries;
|
c->used_entries=s->entries;
|
||||||
c->dim=s->dim;
|
c->dim=s->dim;
|
||||||
c->codelist=_make_words(s->lengthlist,s->entries,0);
|
c->codelist=_make_words(s->lengthlist,s->entries,0);
|
||||||
c->valuelist=_book_unquantize(s,s->entries,NULL);
|
//c->valuelist=_book_unquantize(s,s->entries,NULL);
|
||||||
|
c->quantvals=_book_maptype1_quantvals(s);
|
||||||
|
c->minval=(int)rint(_float32_unpack(s->q_min));
|
||||||
|
c->delta=(int)rint(_float32_unpack(s->q_delta));
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
@ -445,157 +427,6 @@ int vorbis_book_init_decode(codebook *c,const static_codebook *s){
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static float _dist(int el,float *ref, float *b,int step){
|
|
||||||
int i;
|
|
||||||
float acc=0.f;
|
|
||||||
for(i=0;i<el;i++){
|
|
||||||
float val=(ref[i]-b[i*step]);
|
|
||||||
acc+=val*val;
|
|
||||||
}
|
|
||||||
return(acc);
|
|
||||||
}
|
|
||||||
|
|
||||||
int _best(codebook *book, float *a, int step){
|
|
||||||
encode_aux_threshmatch *tt=book->c->thresh_tree;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
encode_aux_nearestmatch *nt=book->c->nearest_tree;
|
|
||||||
encode_aux_pigeonhole *pt=book->c->pigeon_tree;
|
|
||||||
#endif
|
|
||||||
int dim=book->dim;
|
|
||||||
int k,o;
|
|
||||||
/*int savebest=-1;
|
|
||||||
float saverr;*/
|
|
||||||
|
|
||||||
/* do we have a threshhold encode hint? */
|
|
||||||
if(tt){
|
|
||||||
int index=0,i;
|
|
||||||
/* find the quant val of each scalar */
|
|
||||||
for(k=0,o=step*(dim-1);k<dim;k++,o-=step){
|
|
||||||
|
|
||||||
i=tt->threshvals>>1;
|
|
||||||
if(a[o]<tt->quantthresh[i]){
|
|
||||||
|
|
||||||
for(;i>0;i--)
|
|
||||||
if(a[o]>=tt->quantthresh[i-1])
|
|
||||||
break;
|
|
||||||
|
|
||||||
}else{
|
|
||||||
|
|
||||||
for(i++;i<tt->threshvals-1;i++)
|
|
||||||
if(a[o]<tt->quantthresh[i])break;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
index=(index*tt->quantvals)+tt->quantmap[i];
|
|
||||||
}
|
|
||||||
/* regular lattices are easy :-) */
|
|
||||||
if(book->c->lengthlist[index]>0) /* is this unused? If so, we'll
|
|
||||||
use a decision tree after all
|
|
||||||
and fall through*/
|
|
||||||
return(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* do we have a pigeonhole encode hint? */
|
|
||||||
if(pt){
|
|
||||||
const static_codebook *c=book->c;
|
|
||||||
int i,besti=-1;
|
|
||||||
float best=0.f;
|
|
||||||
int entry=0;
|
|
||||||
|
|
||||||
/* dealing with sequentialness is a pain in the ass */
|
|
||||||
if(c->q_sequencep){
|
|
||||||
int pv;
|
|
||||||
long mul=1;
|
|
||||||
float qlast=0;
|
|
||||||
for(k=0,o=0;k<dim;k++,o+=step){
|
|
||||||
pv=(int)((a[o]-qlast-pt->min)/pt->del);
|
|
||||||
if(pv<0 || pv>=pt->mapentries)break;
|
|
||||||
entry+=pt->pigeonmap[pv]*mul;
|
|
||||||
mul*=pt->quantvals;
|
|
||||||
qlast+=pv*pt->del+pt->min;
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
for(k=0,o=step*(dim-1);k<dim;k++,o-=step){
|
|
||||||
int pv=(int)((a[o]-pt->min)/pt->del);
|
|
||||||
if(pv<0 || pv>=pt->mapentries)break;
|
|
||||||
entry=entry*pt->quantvals+pt->pigeonmap[pv];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* must be within the pigeonholable range; if we quant outside (or
|
|
||||||
in an entry that we define no list for), brute force it */
|
|
||||||
if(k==dim && pt->fitlength[entry]){
|
|
||||||
/* search the abbreviated list */
|
|
||||||
long *list=pt->fitlist+pt->fitmap[entry];
|
|
||||||
for(i=0;i<pt->fitlength[entry];i++){
|
|
||||||
float this=_dist(dim,book->valuelist+list[i]*dim,a,step);
|
|
||||||
if(besti==-1 || this<best){
|
|
||||||
best=this;
|
|
||||||
besti=list[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return(besti);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(nt){
|
|
||||||
/* optimized using the decision tree */
|
|
||||||
while(1){
|
|
||||||
float c=0.f;
|
|
||||||
float *p=book->valuelist+nt->p[ptr];
|
|
||||||
float *q=book->valuelist+nt->q[ptr];
|
|
||||||
|
|
||||||
for(k=0,o=0;k<dim;k++,o+=step)
|
|
||||||
c+=(p[k]-q[k])*(a[o]-(p[k]+q[k])*.5);
|
|
||||||
|
|
||||||
if(c>0.f) /* in A */
|
|
||||||
ptr= -nt->ptr0[ptr];
|
|
||||||
else /* in B */
|
|
||||||
ptr= -nt->ptr1[ptr];
|
|
||||||
if(ptr<=0)break;
|
|
||||||
}
|
|
||||||
return(-ptr);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* brute force it! */
|
|
||||||
{
|
|
||||||
const static_codebook *c=book->c;
|
|
||||||
int i,besti=-1;
|
|
||||||
float best=0.f;
|
|
||||||
float *e=book->valuelist;
|
|
||||||
for(i=0;i<book->entries;i++){
|
|
||||||
if(c->lengthlist[i]>0){
|
|
||||||
float this=_dist(dim,e,a,step);
|
|
||||||
if(besti==-1 || this<best){
|
|
||||||
best=this;
|
|
||||||
besti=i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
e+=dim;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*if(savebest!=-1 && savebest!=besti){
|
|
||||||
fprintf(stderr,"brute force/pigeonhole disagreement:\n"
|
|
||||||
"original:");
|
|
||||||
for(i=0;i<dim*step;i+=step)fprintf(stderr,"%g,",a[i]);
|
|
||||||
fprintf(stderr,"\n"
|
|
||||||
"pigeonhole (entry %d, err %g):",savebest,saverr);
|
|
||||||
for(i=0;i<dim;i++)fprintf(stderr,"%g,",
|
|
||||||
(book->valuelist+savebest*dim)[i]);
|
|
||||||
fprintf(stderr,"\n"
|
|
||||||
"bruteforce (entry %d, err %g):",besti,best);
|
|
||||||
for(i=0;i<dim;i++)fprintf(stderr,"%g,",
|
|
||||||
(book->valuelist+besti*dim)[i]);
|
|
||||||
fprintf(stderr,"\n");
|
|
||||||
}*/
|
|
||||||
return(besti);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
long vorbis_book_codeword(codebook *book,int entry){
|
long vorbis_book_codeword(codebook *book,int entry){
|
||||||
if(book->c) /* only use with encode; decode optimizations are
|
if(book->c) /* only use with encode; decode optimizations are
|
||||||
allowed to break this */
|
allowed to break this */
|
||||||
@ -638,7 +469,6 @@ static_codebook test1={
|
|||||||
0,
|
0,
|
||||||
0,0,0,0,
|
0,0,0,0,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,NULL,NULL,
|
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
static float *test1_result=NULL;
|
static float *test1_result=NULL;
|
||||||
@ -650,7 +480,6 @@ static_codebook test2={
|
|||||||
2,
|
2,
|
||||||
-533200896,1611661312,4,0,
|
-533200896,1611661312,4,0,
|
||||||
full_quantlist1,
|
full_quantlist1,
|
||||||
NULL,NULL,NULL,
|
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
static float test2_result[]={-3,-2,-1,0, 1,2,3,4, 5,0,3,-2};
|
static float test2_result[]={-3,-2,-1,0, 1,2,3,4, 5,0,3,-2};
|
||||||
@ -662,7 +491,6 @@ static_codebook test3={
|
|||||||
2,
|
2,
|
||||||
-533200896,1611661312,4,1,
|
-533200896,1611661312,4,1,
|
||||||
full_quantlist1,
|
full_quantlist1,
|
||||||
NULL,NULL,NULL,
|
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
static float test3_result[]={-3,-5,-6,-6, 1,3,6,10, 5,5,8,6};
|
static float test3_result[]={-3,-5,-6,-6, 1,3,6,10, 5,5,8,6};
|
||||||
@ -674,7 +502,6 @@ static_codebook test4={
|
|||||||
1,
|
1,
|
||||||
-533200896,1611661312,4,0,
|
-533200896,1611661312,4,0,
|
||||||
partial_quantlist1,
|
partial_quantlist1,
|
||||||
NULL,NULL,NULL,
|
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
static float test4_result[]={-3,-3,-3, 4,-3,-3, -1,-3,-3,
|
static float test4_result[]={-3,-3,-3, 4,-3,-3, -1,-3,-3,
|
||||||
@ -694,7 +521,6 @@ static_codebook test5={
|
|||||||
1,
|
1,
|
||||||
-533200896,1611661312,4,1,
|
-533200896,1611661312,4,1,
|
||||||
partial_quantlist1,
|
partial_quantlist1,
|
||||||
NULL,NULL,NULL,
|
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
static float test5_result[]={-3,-6,-9, 4, 1,-2, -1,-4,-7,
|
static float test5_result[]={-3,-6,-9, 4, 1,-2, -1,-4,-7,
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
********************************************************************
|
********************************************************************
|
||||||
|
|
||||||
function: single-block PCM synthesis
|
function: single-block PCM synthesis
|
||||||
last mod: $Id: synthesis.c 16227 2009-07-08 06:58:46Z xiphmont $
|
last mod: $Id: synthesis.c 17027 2010-03-25 05:21:20Z xiphmont $
|
||||||
|
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
@ -47,14 +47,15 @@ int vorbis_synthesis(vorbis_block *vb,ogg_packet *op){
|
|||||||
|
|
||||||
/* read our mode and pre/post windowsize */
|
/* read our mode and pre/post windowsize */
|
||||||
mode=oggpack_read(opb,b->modebits);
|
mode=oggpack_read(opb,b->modebits);
|
||||||
if(mode==-1) {
|
if(mode==-1){
|
||||||
return(OV_EBADPACKET);
|
return(OV_EBADPACKET);
|
||||||
}
|
}
|
||||||
|
|
||||||
vb->mode=mode;
|
vb->mode=mode;
|
||||||
if(!ci->mode_param[mode]) {
|
if(!ci->mode_param[mode]){
|
||||||
return(OV_EBADPACKET);
|
return(OV_EBADPACKET);
|
||||||
}
|
}
|
||||||
|
|
||||||
vb->W=ci->mode_param[mode]->blockflag;
|
vb->W=ci->mode_param[mode]->blockflag;
|
||||||
if(vb->W){
|
if(vb->W){
|
||||||
|
|
||||||
@ -62,7 +63,9 @@ int vorbis_synthesis(vorbis_block *vb,ogg_packet *op){
|
|||||||
only for window selection */
|
only for window selection */
|
||||||
vb->lW=oggpack_read(opb,1);
|
vb->lW=oggpack_read(opb,1);
|
||||||
vb->nW=oggpack_read(opb,1);
|
vb->nW=oggpack_read(opb,1);
|
||||||
if(vb->nW==-1) return(OV_EBADPACKET);
|
if(vb->nW==-1){
|
||||||
|
return(OV_EBADPACKET);
|
||||||
|
}
|
||||||
}else{
|
}else{
|
||||||
vb->lW=0;
|
vb->lW=0;
|
||||||
vb->nW=0;
|
vb->nW=0;
|
||||||
@ -108,9 +111,14 @@ int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op){
|
|||||||
|
|
||||||
/* read our mode and pre/post windowsize */
|
/* read our mode and pre/post windowsize */
|
||||||
mode=oggpack_read(opb,b->modebits);
|
mode=oggpack_read(opb,b->modebits);
|
||||||
if(mode==-1)return(OV_EBADPACKET);
|
if(mode==-1) {
|
||||||
|
return(OV_EBADPACKET);
|
||||||
|
}
|
||||||
|
|
||||||
vb->mode=mode;
|
vb->mode=mode;
|
||||||
|
if(!ci->mode_param[mode]) {
|
||||||
|
return(OV_EBADPACKET);
|
||||||
|
}
|
||||||
vb->W=ci->mode_param[mode]->blockflag;
|
vb->W=ci->mode_param[mode]->blockflag;
|
||||||
if(vb->W){
|
if(vb->W){
|
||||||
vb->lW=oggpack_read(opb,1);
|
vb->lW=oggpack_read(opb,1);
|
||||||
|
@ -48,5 +48,3 @@ cp $1/README ./README
|
|||||||
cp $1/AUTHORS ./AUTHORS
|
cp $1/AUTHORS ./AUTHORS
|
||||||
patch -p3 < ./alloca.diff
|
patch -p3 < ./alloca.diff
|
||||||
patch -p3 <bug487519.patch
|
patch -p3 <bug487519.patch
|
||||||
patch -p3 <bug498855.patch
|
|
||||||
patch -p3 <bug550184.patch
|
|
||||||
|
Loading…
Reference in New Issue
Block a user