diff options
author | Monty <xiphmont@xiph.org> | 2001-01-15 00:35:38 +0000 |
---|---|---|
committer | Monty <xiphmont@xiph.org> | 2001-01-15 00:35:38 +0000 |
commit | e8961cc2f7db6225d4414d08c949858c0707b7ee (patch) | |
tree | 3102586ef20d94afaa4696c4850fa048853ed54c | |
parent | d4d82b714d1773724d4503e2356db269a199be8e (diff) | |
download | libvorbis-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.h | 5 | ||||
-rw-r--r-- | lib/block.c | 29 | ||||
-rw-r--r-- | lib/codec_internal.h | 11 | ||||
-rw-r--r-- | lib/floor0.c | 6 | ||||
-rw-r--r-- | lib/mapping0.c | 30 | ||||
-rw-r--r-- | lib/modes/mode_A.h | 26 | ||||
-rw-r--r-- | lib/psy.c | 25 | ||||
-rw-r--r-- | lib/psy.h | 8 | ||||
-rw-r--r-- | lib/res0.c | 8 |
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 @@ -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); +} @@ -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 @@ -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) |