summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMonty <xiphmont@xiph.org>2001-01-15 00:35:38 +0000
committerMonty <xiphmont@xiph.org>2001-01-15 00:35:38 +0000
commite8961cc2f7db6225d4414d08c949858c0707b7ee (patch)
tree3102586ef20d94afaa4696c4850fa048853ed54c
parentd4d82b714d1773724d4503e2356db269a199be8e (diff)
downloadlibvorbis-git-e8961cc2f7db6225d4414d08c949858c0707b7ee.tar.gz
Incremental update; implemented a global amplitude tracker.
Monty svn path=/branches/monty_branch_20001226/vorbis/; revision=1165
-rw-r--r--include/vorbis/codec.h5
-rw-r--r--lib/block.c29
-rw-r--r--lib/codec_internal.h11
-rw-r--r--lib/floor0.c6
-rw-r--r--lib/mapping0.c30
-rw-r--r--lib/modes/mode_A.h26
-rw-r--r--lib/psy.c25
-rw-r--r--lib/psy.h8
-rw-r--r--lib/res0.c8
9 files changed, 98 insertions, 50 deletions
diff --git a/include/vorbis/codec.h b/include/vorbis/codec.h
index c3f12658..406ceb84 100644
--- a/include/vorbis/codec.h
+++ b/include/vorbis/codec.h
@@ -12,7 +12,7 @@
********************************************************************
function: libvorbis codec headers
- last mod: $Id: codec.h,v 1.33.2.1 2000/12/27 23:46:34 xiphmont Exp $
+ last mod: $Id: codec.h,v 1.33.2.2 2001/01/15 00:35:35 xiphmont Exp $
********************************************************************/
@@ -89,7 +89,6 @@ typedef struct vorbis_dsp_state{
typedef struct vorbis_block{
/* necessary stream state for linking to the framing abstraction */
float **pcm; /* this is a pointer into local storage */
- float **pcmdelay; /* this is a pointer into local storage */
oggpack_buffer opb;
long lW;
@@ -117,6 +116,8 @@ typedef struct vorbis_block{
long floor_bits;
long res_bits;
+ void *internal;
+
} vorbis_block;
/* vorbis_block is a single block of data to be processed as part of
diff --git a/lib/block.c b/lib/block.c
index 8be86495..80c2be62 100644
--- a/lib/block.c
+++ b/lib/block.c
@@ -12,7 +12,7 @@
********************************************************************
function: PCM data vector blocking, windowing and dis/reassembly
- last mod: $Id: block.c,v 1.42.2.2 2001/01/09 19:13:14 xiphmont Exp $
+ last mod: $Id: block.c,v 1.42.2.3 2001/01/15 00:35:36 xiphmont Exp $
Handle windowing, overlap-add, etc of the PCM vectors. This is made
more amusing by Vorbis' current two allowed block sizes.
@@ -24,6 +24,7 @@
#include <string.h>
#include <ogg/ogg.h>
#include "vorbis/codec.h"
+#include "codec_internal.h"
#include "window.h"
#include "envelope.h"
@@ -33,6 +34,7 @@
#include "codebook.h"
#include "misc.h"
#include "os.h"
+#include "psy.h"
static int ilog2(unsigned int v){
int ret=0;
@@ -92,9 +94,12 @@ int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb){
vb->vd=v;
vb->localalloc=0;
vb->localstore=NULL;
- if(v->analysisp)
+ if(v->analysisp){
oggpack_writeinit(&vb->opb);
-
+ vb->internal=_ogg_calloc(1,sizeof(vorbis_block_internal));
+ ((vorbis_block_internal *)vb->internal)->ampmax=-9999;
+ }
+
return(0);
}
@@ -150,6 +155,7 @@ int vorbis_block_clear(vorbis_block *vb){
oggpack_writeclear(&vb->opb);
_vorbis_block_ripcord(vb);
if(vb->localstore)_ogg_free(vb->localstore);
+ if(vb->internal)_ogg_free(vb->internal);
memset(vb,0,sizeof(vorbis_block));
return(0);
@@ -169,6 +175,7 @@ static int _vds_shared_init(vorbis_dsp_state *v,vorbis_info *vi,int encp){
v->vi=vi;
b->modebits=ilog2(ci->modes);
+ b->ampmax=-9999;
b->transform[0]=_ogg_calloc(VI_TRANSFORMB,sizeof(vorbis_look_transform *));
b->transform[1]=_ogg_calloc(VI_TRANSFORMB,sizeof(vorbis_look_transform *));
@@ -529,16 +536,24 @@ int vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb){
vb->sequence=v->sequence;
vb->granulepos=v->granulepos;
vb->pcmend=ci->blocksizes[v->W];
+
/* copy the vectors; this uses the local storage in vb */
{
+ vorbis_block_internal *vbi=(vorbis_block_internal *)vb->internal;
+
+ /* this tracks 'strongest peak' for later psychoacoustics */
+ if(vbi->ampmax>b->ampmax)b->ampmax=vbi->ampmax;
+ b->ampmax=_vp_ampmax_decay(b->ampmax,v);
+ vbi->ampmax=b->ampmax;
+
vb->pcm=_vorbis_block_alloc(vb,sizeof(float *)*vi->channels);
- vb->pcmdelay=_vorbis_block_alloc(vb,sizeof(float *)*vi->channels);
+ vbi->pcmdelay=_vorbis_block_alloc(vb,sizeof(float *)*vi->channels);
for(i=0;i<vi->channels;i++){
- vb->pcmdelay[i]=
+ vbi->pcmdelay[i]=
_vorbis_block_alloc(vb,(vb->pcmend+beginW)*sizeof(float));
- memcpy(vb->pcmdelay[i],v->pcm[i],(vb->pcmend+beginW)*sizeof(float));
- vb->pcm[i]=vb->pcmdelay[i]+beginW;
+ memcpy(vbi->pcmdelay[i],v->pcm[i],(vb->pcmend+beginW)*sizeof(float));
+ vb->pcm[i]=vbi->pcmdelay[i]+beginW;
/* before we added the delay
vb->pcm[i]=_vorbis_block_alloc(vb,vb->pcmend*sizeof(float));
diff --git a/lib/codec_internal.h b/lib/codec_internal.h
index d80b08ee..ef799a42 100644
--- a/lib/codec_internal.h
+++ b/lib/codec_internal.h
@@ -12,7 +12,7 @@
********************************************************************
function: libvorbis codec headers
- last mod: $Id: codec_internal.h,v 1.3.2.1 2000/12/27 23:46:35 xiphmont Exp $
+ last mod: $Id: codec_internal.h,v 1.3.2.2 2001/01/15 00:35:36 xiphmont Exp $
********************************************************************/
@@ -24,6 +24,11 @@
#include "psy.h"
#include "bitbuffer.h"
+typedef struct vorbis_block_internal{
+ float **pcmdelay; /* this is a pointer into local storage */
+ float ampmax;
+} vorbis_block_internal;
+
typedef void vorbis_look_time;
typedef void vorbis_look_mapping;
typedef void vorbis_look_floor;
@@ -49,6 +54,8 @@ typedef struct backend_lookup_state {
unsigned char *header1;
unsigned char *header2;
+ float ampmax;
+
} backend_lookup_state;
/* mode ************************************************************/
@@ -108,6 +115,8 @@ typedef struct codec_setup_info {
float postecho_thresh;
float preecho_minenergy;
+ float ampmax_att_per_sec;
+
/* delay caching... how many samples to keep around prior to our
current block to aid in analysis? */
int delaycache;
diff --git a/lib/floor0.c b/lib/floor0.c
index 13d3fc87..648aa478 100644
--- a/lib/floor0.c
+++ b/lib/floor0.c
@@ -12,7 +12,7 @@
********************************************************************
function: floor backend 0 implementation
- last mod: $Id: floor0.c,v 1.34.2.2 2001/01/09 19:13:14 xiphmont Exp $
+ last mod: $Id: floor0.c,v 1.34.2.3 2001/01/15 00:35:36 xiphmont Exp $
********************************************************************/
@@ -335,7 +335,7 @@ static int floor0_forward(vorbis_block *vb,vorbis_look_floor *i,
booknum=0;
b=be->fullbooks+info->books[booknum];
- bitbuf_write(vbb,booknum,_ilog(info->numbooks));
+ oggpack_write(&vb->opb,booknum,_ilog(info->numbooks));
#ifdef TRAIN_LSP
@@ -360,7 +360,7 @@ static int floor0_forward(vorbis_block *vb,vorbis_look_floor *i,
for(j=0;j<look->m;j+=b->dim){
int entry=_f0_fit(b,flr,lspwork,j);
- bits+=vorbis_book_encode(b,entry,)&vb->opb;
+ bits+=vorbis_book_encode(b,entry,&vb->opb);
#ifdef TRAIN_LSP
fprintf(ef,"%d,\n",entry);
diff --git a/lib/mapping0.c b/lib/mapping0.c
index b51ccb2c..ed6f91c5 100644
--- a/lib/mapping0.c
+++ b/lib/mapping0.c
@@ -12,7 +12,7 @@
********************************************************************
function: channel mapping 0 implementation
- last mod: $Id: mapping0.c,v 1.22.2.2 2001/01/09 19:13:15 xiphmont Exp $
+ last mod: $Id: mapping0.c,v 1.22.2.3 2001/01/15 00:35:36 xiphmont Exp $
********************************************************************/
@@ -203,13 +203,14 @@ static vorbis_info_mapping *mapping0_unpack(vorbis_info *vi,oggpack_buffer *opb)
/* no time mapping implementation for now */
static long seq=0;
static int mapping0_forward(vorbis_block *vb,vorbis_look_mapping *l){
- vorbis_dsp_state *vd=vb->vd;
- vorbis_info *vi=vd->vi;
- backend_lookup_state *b=vb->vd->backend_state;
- vorbis_look_mapping0 *look=(vorbis_look_mapping0 *)l;
- vorbis_info_mapping0 *info=look->map;
- vorbis_info_mode *mode=look->mode;
- int n=vb->pcmend;
+ vorbis_dsp_state *vd=vb->vd;
+ vorbis_info *vi=vd->vi;
+ backend_lookup_state *b=vb->vd->backend_state;
+ vorbis_look_mapping0 *look=(vorbis_look_mapping0 *)l;
+ vorbis_info_mapping0 *info=look->map;
+ vorbis_info_mode *mode=look->mode;
+ vorbis_block_internal *vbi=(vorbis_block_internal *)vb->internal;
+ int n=vb->pcmend;
int i,j;
float *window=b->window[vb->W][vb->lW][vb->nW][mode->windowtype];
@@ -219,15 +220,13 @@ static int mapping0_forward(vorbis_block *vb,vorbis_look_mapping *l){
float **floor=_vorbis_block_alloc(vb,vi->channels*sizeof(float *));
float *additional=_vorbis_block_alloc(vb,n*sizeof(float));
+ float newmax=vbi->ampmax;
- for(i=0;i<vi->channels;i++)
- bitbuf_init(vbb_flr+i,vb);
- bitbuf_init(&vbb_res,vb);
-
for(i=0;i<vi->channels;i++){
float *pcm=vb->pcm[i];
float scale=4.f/n;
int submap=info->chmuxlist[i];
+ float ret;
_analysis_output("pcm",seq,pcm,n,0,0);
@@ -262,8 +261,9 @@ static int mapping0_forward(vorbis_block *vb,vorbis_look_mapping *l){
//_analysis_output("lmdct",seq,additional+n/2,n/2,0,0);
/* perform psychoacoustics; do masking */
- _vp_compute_mask(look->psy_look+submap,additional,additional+n/2,
- floor[i],NULL);
+ ret=_vp_compute_mask(look->psy_look+submap,additional,additional+n/2,
+ floor[i],NULL,vbi->ampmax);
+ if(ret>newmax)newmax=ret;
_analysis_output("prefloor",seq,floor[i],n/2,0,0);
@@ -295,6 +295,8 @@ static int mapping0_forward(vorbis_block *vb,vorbis_look_mapping *l){
}
+ vbi->ampmax=newmax;
+
/* perform residue encoding with residue mapping; this is
multiplexed. All the channels belonging to one submap are
encoded (values interleaved), then the next submap, etc */
diff --git a/lib/modes/mode_A.h b/lib/modes/mode_A.h
index 26883374..156041ba 100644
--- a/lib/modes/mode_A.h
+++ b/lib/modes/mode_A.h
@@ -12,7 +12,7 @@
********************************************************************
function: predefined encoding modes
- last mod: $Id: mode_A.h,v 1.7.2.2 2001/01/09 19:13:23 xiphmont Exp $
+ last mod: $Id: mode_A.h,v 1.7.2.3 2001/01/15 00:35:38 xiphmont Exp $
********************************************************************/
@@ -124,8 +124,8 @@ static vorbis_info_psy _psy_set_A0={
.500f, /*2800*/
.600f, /*4000*/
.700f, /*5600*/
- .800f, /*8000*/
- .800f, /*11500*/
+ .850f, /*8000*/
+ .900f, /*11500*/
.900f, /*16000*/
},
@@ -176,8 +176,8 @@ static vorbis_info_psy _psy_set_A={
{-30.,-35.,-35.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*4000*/
{-30.,-35.,-35.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*5600*/
{-30.,-30.,-30.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*8000*/
- {-30.,-30.,-30.,-35.,-40.,-40.,-60.,-70.,-80.,-90.,-100.}, /*11500*/
- {-30.,-30.,-30.,-35.,-35.,-45.,-50.,-50.,-70.,-80.,-90.}, /*16000*/
+ {-30.,-30.,-30.,-35.,-40.,-45.,-60.,-70.,-80.,-90.,-100.}, /*11500*/
+ {-30.,-30.,-30.,-35.,-35.,-45.,-50.,-60.,-70.,-80.,-90.}, /*16000*/
},
1,/* peakattp */
@@ -201,7 +201,7 @@ static vorbis_info_psy _psy_set_A={
},
1,/*noisemaskp */
- -30.f, /* suppress any noise curve over maxspec+n */
+ -0.f, /* suppress any noise curve over maxspec+n */
.5f, /* low window */
.5f, /* high window */
25,
@@ -218,11 +218,11 @@ static vorbis_info_psy _psy_set_A={
.400f, /*1400*/
.400f, /*2000*/
.400f, /*2800*/
- .600f, /*4000*/
- .750f, /*5600*/
- .850f, /*8000*/
+ .700f, /*4000*/
+ .850f, /*5600*/
+ .900f, /*8000*/
.900f, /*11500*/
- .950f, /*16000*/
+ .900f, /*16000*/
},
95.f, /* even decade + 5 is important; saves an rint() later in a
@@ -309,7 +309,11 @@ codec_setup_info info_A={
/* psy */
{&_psy_set_A0,&_psy_set_A},
/* thresh sample period, preecho clamp trigger threshhold, range, minenergy */
- 256, 30.f, -30.f, -96.f
+ 256, 30.f, -30.f, -96.f,
+
+ -10.,
+
+ 0,
};
#define PREDEF_INFO_MAX 0
diff --git a/lib/psy.c b/lib/psy.c
index b0e9ad1f..237e6116 100644
--- a/lib/psy.c
+++ b/lib/psy.c
@@ -12,7 +12,7 @@
********************************************************************
function: psychoacoustics not including preecho
- last mod: $Id: psy.c,v 1.34.2.2 2001/01/09 19:13:15 xiphmont Exp $
+ last mod: $Id: psy.c,v 1.34.2.3 2001/01/15 00:35:36 xiphmont Exp $
********************************************************************/
@@ -20,6 +20,7 @@
#include <math.h>
#include <string.h>
#include "vorbis/codec.h"
+#include "codec_internal.h"
#include "masking.h"
#include "psy.h"
@@ -421,7 +422,6 @@ static void bound_loop(vorbis_look_psy *p,
float *seeds,
float *flr,
float att){
- vorbis_info_psy *vi=p->vi;
long n=p->n,i;
long off=(p->eighth_octave_lines>>1)+p->firstoc;
@@ -493,7 +493,7 @@ static void seed_chase(float *seeds, int linesper, long n){
/* bleaugh, this is more complicated than it needs to be */
static void max_seeds(vorbis_look_psy *p,float *minseed,float *maxseed,
float *flr){
- long n=p->total_octave_lines,i;
+ long n=p->total_octave_lines;
int linesper=p->eighth_octave_lines;
long linpos=0;
long pos;
@@ -587,11 +587,12 @@ static void bark_noise_median(long n,float *b,float *f,float *noise,
}
-void _vp_compute_mask(vorbis_look_psy *p,
+float _vp_compute_mask(vorbis_look_psy *p,
float *fft,
float *mdct,
float *flr,
- float *decay){
+ float *decay,
+ float prev_maxamp){
int i,n=p->n;
float specmax=NEGINF;
static int seq=0;
@@ -605,6 +606,9 @@ void _vp_compute_mask(vorbis_look_psy *p,
fft[i]=todB(fft[i]);
if(fft[i]>specmax)specmax=fft[i];
}
+ if(specmax<prev_maxamp)specmax=prev_maxamp;
+
+
for(i=0;i<n;i++){
mdct[i]=todB(mdct[i]);
}
@@ -661,6 +665,8 @@ void _vp_compute_mask(vorbis_look_psy *p,
seq++;
+
+ return(specmax);
}
@@ -682,7 +688,16 @@ void _vp_apply_floor(vorbis_look_psy *p,float *f, float *flr){
memcpy(f,work,p->n*sizeof(float));
}
+float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd){
+ vorbis_info *vi=vd->vi;
+ codec_setup_info *ci=vi->codec_setup;
+ int n=ci->blocksizes[vd->W]/2;
+ float secs=(float)n/vi->rate;
+ amp+=secs*ci->ampmax_att_per_sec;
+ if(amp<-9999)amp=-9999;
+ return(amp);
+}
diff --git a/lib/psy.h b/lib/psy.h
index b2cc4870..3e40d4c6 100644
--- a/lib/psy.h
+++ b/lib/psy.h
@@ -12,7 +12,7 @@
********************************************************************
function: random psychoacoustics (not including preecho)
- last mod: $Id: psy.h,v 1.16.2.2 2001/01/09 19:13:15 xiphmont Exp $
+ last mod: $Id: psy.h,v 1.16.2.3 2001/01/15 00:35:36 xiphmont Exp $
********************************************************************/
@@ -89,12 +89,14 @@ extern void *_vi_psy_dup(void *source);
extern void _vi_psy_free(vorbis_info_psy *i);
extern vorbis_info_psy *_vi_psy_copy(vorbis_info_psy *i);
-extern void _vp_compute_mask(vorbis_look_psy *p,
+extern float _vp_compute_mask(vorbis_look_psy *p,
float *fft,
float *mdct,
float *floor,
- float *decay);
+ float *decay,
+ float prev_maxamp);
extern void _vp_apply_floor(vorbis_look_psy *p,float *f,float *flr);
+extern float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd);
#endif
diff --git a/lib/res0.c b/lib/res0.c
index 992eae11..fe6e8a86 100644
--- a/lib/res0.c
+++ b/lib/res0.c
@@ -12,7 +12,7 @@
********************************************************************
function: residue backend 0 implementation
- last mod: $Id: res0.c,v 1.23.2.1 2001/01/09 19:13:15 xiphmont Exp $
+ last mod: $Id: res0.c,v 1.23.2.2 2001/01/15 00:35:36 xiphmont Exp $
********************************************************************/
@@ -210,7 +210,7 @@ static int _testhack(float *vec,int n,vorbis_look_residue0 *look,
return(i);
}
-static int _encodepart(vorbis_bitbuffer *vbb,float *vec, int n,
+static int _encodepart(oggpack_buffer *opb,float *vec, int n,
int stages, codebook **books,int mode,int part){
int i,j=0,bits=0;
if(stages){
@@ -228,7 +228,7 @@ static int _encodepart(vorbis_bitbuffer *vbb,float *vec, int n,
fclose(f);
}
#endif
- bits+=vorbis_book_encode(books[j],entry,vbb);
+ bits+=vorbis_book_encode(books[j],entry,opb);
}
}
return(bits);
@@ -305,7 +305,7 @@ int res0_forward(vorbis_block *vb,vorbis_look_residue *vl,
long val=partword[j][l];
for(k=1;k<partitions_per_word;k++)
val= val*possible_partitions+partword[j][l+k];
- phrasebits+=vorbis_book_encode(look->phrasebook,val,vbb);
+ phrasebits+=vorbis_book_encode(look->phrasebook,val,&vb->opb);
}
/* now we encode interleaved residual values for the partitions */
for(k=0;k<partitions_per_word;k++,l++,i+=samples_per_partition)