Chris@1: /******************************************************************** Chris@1: * * Chris@1: * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * Chris@1: * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * Chris@1: * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * Chris@1: * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * Chris@1: * * Chris@1: * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * Chris@1: * by the Xiph.Org Foundation http://www.xiph.org/ * Chris@1: * * Chris@1: ******************************************************************** Chris@1: Chris@1: function: simple utility that runs audio through the psychoacoustics Chris@1: without encoding Chris@1: last mod: $Id: psytune.c 16037 2009-05-26 21:10:58Z xiphmont $ Chris@1: Chris@1: ********************************************************************/ Chris@1: Chris@1: /* NB: this is dead code, retained purely for doc and reference value Chris@1: don't try to compile it */ Chris@1: Chris@1: #include Chris@1: #include Chris@1: #include Chris@1: #include Chris@1: Chris@1: #include "vorbis/codec.h" Chris@1: #include "codec_internal.h" Chris@1: #include "os.h" Chris@1: #include "misc.h" Chris@1: #include "psy.h" Chris@1: #include "mdct.h" Chris@1: #include "smallft.h" Chris@1: #include "window.h" Chris@1: #include "scales.h" Chris@1: #include "lpc.h" Chris@1: #include "lsp.h" Chris@1: #include "masking.h" Chris@1: #include "registry.h" Chris@1: Chris@1: static vorbis_info_psy_global _psy_set0G={ Chris@1: 0, /* decaydBpms */ Chris@1: 8, /* lines per eighth octave */ Chris@1: Chris@1: /* thresh sample period, preecho clamp trigger threshhold, range, minenergy */ Chris@1: 256, {26.f,26.f,26.f,30.f}, {-90.f,-90.f,-90.f,-90.f}, -90.f, Chris@1: -6.f, Chris@1: Chris@1: 0, Chris@1: Chris@1: 0., Chris@1: 0., Chris@1: }; Chris@1: Chris@1: static vp_part _vp_part0[]={ Chris@1: { 1,9e10f, 9e10f, 1.f,9999.f}, Chris@1: { 9999, .75f, 9e10f, .5f,9999.f}, Chris@1: /*{ 9999, 1.5f, 9e10f, .5f,9999.f},*/ Chris@1: { 18,9e10f, 9e10f, .5f, 30.f}, Chris@1: { 9999,9e10f, 9e10f, .5f, 30.f} Chris@1: }; Chris@1: Chris@1: static vp_couple _vp_couple0[]={ Chris@1: { 1, {9e10f,9e10f,0}, { 0.f, 0.f,0}, { 0.f, 0.f,0}, {0.f,0.f,0}}, Chris@1: { 18, {9e10f,9e10f,0}, { 0.f, 0.f,0}, { 0.f, 0.f,0}, {0.f,0.f,0}}, Chris@1: { 9999, {9e10f,9e10f,0}, { 0.f, 9e10f,0}, { 0.f,22.f,1}, {0.f,0.f,0}} Chris@1: }; Chris@1: Chris@1: static vorbis_info_psy _psy_set0={ Chris@1: ATH_Bark_dB_lineaggressive, Chris@1: Chris@1: -100.f, Chris@1: -140.f, Chris@1: 6.f, /* floor master att */ Chris@1: Chris@1: /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 */ Chris@1: /* x: 63 88 125 175 250 350 500 700 1k 1.4k 2k 2.8k 4k 5.6k 8k 11.5k 16k Hz */ Chris@1: /* y: 0 10 20 30 40 50 60 70 80 90 100 dB */ Chris@1: 1, /* tonemaskp */ Chris@1: 0.f, /* tone master att */ Chris@1: /* 0 10 20 30 40 50 60 70 80 90 100 */ Chris@1: { Chris@1: {-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*63*/ Chris@1: {-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*88*/ Chris@1: {-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*125*/ Chris@1: Chris@1: {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*175*/ Chris@1: {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*250*/ Chris@1: {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*350*/ Chris@1: {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*500*/ Chris@1: {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*700*/ Chris@1: {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*1000*/ Chris@1: {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*1400*/ Chris@1: {-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*2000*/ Chris@1: {-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*2800*/ Chris@1: {-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*4000*/ Chris@1: Chris@1: {-30.f,-35.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*5600*/ Chris@1: Chris@1: {-30.f,-30.f,-33.f,-35.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*8000*/ Chris@1: {-30.f,-30.f,-33.f,-35.f,-40.f,-45.f,-50.f,-60.f,-70.f,-85.f,-100.f}, /*11500*/ Chris@1: {-24.f,-24.f,-26.f,-32.f,-32.f,-42.f,-50.f,-60.f,-70.f,-85.f,-100.f}, /*16000*/ Chris@1: Chris@1: }, Chris@1: Chris@1: 1,/* peakattp */ Chris@1: {{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*63*/ Chris@1: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*88*/ Chris@1: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*125*/ Chris@1: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*175*/ Chris@1: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*250*/ Chris@1: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*350*/ Chris@1: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*500*/ Chris@1: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*700*/ Chris@1: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*1000*/ Chris@1: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*1400*/ Chris@1: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*2000*/ Chris@1: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*2800*/ Chris@1: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*4000*/ Chris@1: {-10.f,-12.f,-14.f,-16.f,-16.f,-20.f,-24.f,-30.f,-32.f,-40.f,-40.f},/*5600*/ Chris@1: {-10.f,-12.f,-14.f,-16.f,-16.f,-20.f,-24.f,-30.f,-32.f,-40.f,-40.f},/*8000*/ Chris@1: {-10.f,-10.f,-10.f,-12.f,-14.f,-18.f,-22.f,-28.f,-32.f,-40.f,-40.f},/*11500*/ Chris@1: {-10.f,-10.f,-10.f,-12.f,-14.f,-18.f,-22.f,-28.f,-32.f,-40.f,-40.f},/*16000*/ Chris@1: }, Chris@1: Chris@1: 1,/*noisemaskp */ Chris@1: -10.f, /* suppress any noise curve over maxspec+n */ Chris@1: .5f, /* low window */ Chris@1: .5f, /* high window */ Chris@1: 10, Chris@1: 10, Chris@1: 25, Chris@1: {.000f, 0.f, /*63*/ Chris@1: .000f, 0.f, /*88*/ Chris@1: .000f, 0.f, /*125*/ Chris@1: .000f, 0.f, /*175*/ Chris@1: .000f, 0.f, /*250*/ Chris@1: .000f, 0.f, /*350*/ Chris@1: .000f, 0.f, /*500*/ Chris@1: .000f, 0.f, /*700*/ Chris@1: .000f, 0.f, /*1000*/ Chris@1: .300f, 0.f, /*1400*/ Chris@1: .300f, 0.f, /*2000*/ Chris@1: .300f, 0.f, /*2800*/ Chris@1: .500f, 0.f, /*4000*/ Chris@1: .700f, 0.f, /*5600*/ Chris@1: .850f, 0.f, /*8000*/ Chris@1: .900f, 0.f, /*11500*/ Chris@1: .900f, 1.f, /*16000*/ Chris@1: }, Chris@1: Chris@1: 95.f, /* even decade + 5 is important; saves an rint() later in a Chris@1: tight loop) */ Chris@1: -44., Chris@1: Chris@1: 32, Chris@1: _vp_part0,_vp_couple0 Chris@1: }; Chris@1: Chris@1: static vorbis_info_floor1 _floor_set0={1, Chris@1: {0}, Chris@1: Chris@1: {32}, Chris@1: {0}, Chris@1: {0}, Chris@1: {{-1}}, Chris@1: Chris@1: 2, Chris@1: {0,1024, Chris@1: Chris@1: 88,31,243, Chris@1: Chris@1: 14,54,143,460, Chris@1: Chris@1: 6,3,10, 22,18,26, 41,36,47, Chris@1: 69,61,78, 112,99,126, 185,162,211, Chris@1: 329,282,387, 672,553,825 Chris@1: }, Chris@1: Chris@1: 60,30,400, Chris@1: 20,8,1,18., Chris@1: 20,600, Chris@1: 960}; Chris@1: Chris@1: Chris@1: static vorbis_info_mapping0 mapping_info={1,{0,1},{0},{0},{0},0, 1, {0},{1}}; Chris@1: static codec_setup_info codec_setup0={ {0,0}, Chris@1: 1,1,1,1,1,0,1, Chris@1: {NULL}, Chris@1: {0},{&mapping_info}, Chris@1: {0},{NULL}, Chris@1: {1},{&_floor_set0}, Chris@1: {2},{NULL}, Chris@1: {NULL}, Chris@1: {&_psy_set0}, Chris@1: &_psy_set0G}; Chris@1: Chris@1: static int noisy=0; Chris@1: void analysis(char *base,int i,float *v,int n,int bark,int dB){ Chris@1: if(noisy){ Chris@1: int j; Chris@1: FILE *of; Chris@1: char buffer[80]; Chris@1: sprintf(buffer,"%s_%d.m",base,i); Chris@1: of=fopen(buffer,"w"); Chris@1: Chris@1: for(j=0;jlook(NULL,NULL,&_floor_set0); Chris@1: Chris@1: /* we cheat on the WAV header; we just bypass 44 bytes and never Chris@1: verify that it matches 16bit/stereo/44.1kHz. */ Chris@1: Chris@1: fread(buffer,1,44,stdin); Chris@1: fwrite(buffer,1,44,stdout); Chris@1: memset(buffer,0,framesize*2); Chris@1: Chris@1: analysis("window",0,window,framesize,0,0); Chris@1: Chris@1: fprintf(stderr,"Processing for frame size %d...\n",framesize); Chris@1: Chris@1: while(!eos){ Chris@1: long bytes=fread(buffer2,1,framesize*2,stdin); Chris@1: if(bytes>1]=todB(&temp); Chris@1: if(temp>local_ampmax[i])local_ampmax[i]=temp; Chris@1: } Chris@1: if(local_ampmax[i]>ampmax)ampmax=local_ampmax[i]; Chris@1: Chris@1: mdct_forward(&m_look,pcm[i],mdct); Chris@1: for(j=0;jforward(&vb,floor_look, Chris@1: mdct, Chris@1: logmdct, Chris@1: mask, Chris@1: logmax, Chris@1: Chris@1: flr[i]); Chris@1: } Chris@1: Chris@1: _vp_remove_floor(&p_look, Chris@1: pg_look, Chris@1: logmdct, Chris@1: mdct, Chris@1: flr[i], Chris@1: pcm[i], Chris@1: local_ampmax[i]); Chris@1: Chris@1: for(j=0;j1500) Chris@1: fprintf(stderr,"%ld ",frameno+i); Chris@1: Chris@1: analysis("res",frameno+i,pcm[i],framesize/2,1,0); Chris@1: analysis("codedflr",frameno+i,flr[i],framesize/2,1,1); Chris@1: } Chris@1: Chris@1: /* residue prequantization */ Chris@1: _vp_partition_prequant(&p_look, Chris@1: &vi, Chris@1: pcm, Chris@1: nonzero); Chris@1: Chris@1: for(i=0;i<2;i++) Chris@1: analysis("quant",frameno+i,pcm[i],framesize/2,1,0); Chris@1: Chris@1: /* channel coupling / stereo quantization */ Chris@1: Chris@1: _vp_couple(&p_look, Chris@1: &mapping_info, Chris@1: pcm, Chris@1: nonzero); Chris@1: Chris@1: for(i=0;i<2;i++) Chris@1: analysis("coupled",frameno+i,pcm[i],framesize/2,1,0); Chris@1: Chris@1: /* decoupling */ Chris@1: for(i=mapping_info.coupling_steps-1;i>=0;i--){ Chris@1: float *pcmM=pcm[mapping_info.coupling_mag[i]]; Chris@1: float *pcmA=pcm[mapping_info.coupling_ang[i]]; Chris@1: Chris@1: for(j=0;j0) Chris@1: if(ang>0){ Chris@1: pcmM[j]=mag; Chris@1: pcmA[j]=mag-ang; Chris@1: }else{ Chris@1: pcmA[j]=mag; Chris@1: pcmM[j]=mag+ang; Chris@1: } Chris@1: else Chris@1: if(ang>0){ Chris@1: pcmM[j]=mag; Chris@1: pcmA[j]=mag+ang; Chris@1: }else{ Chris@1: pcmA[j]=mag; Chris@1: pcmM[j]=mag-ang; Chris@1: } Chris@1: } Chris@1: } Chris@1: Chris@1: for(i=0;i<2;i++) Chris@1: analysis("decoupled",frameno+i,pcm[i],framesize/2,1,0); Chris@1: Chris@1: for(i=0;i<2;i++){ Chris@1: float amp; Chris@1: Chris@1: for(j=0;j32767){ Chris@1: if(!flag)fprintf(stderr,"clipping in frame %ld ",frameno+i); Chris@1: flag=1; Chris@1: val=32767; Chris@1: } Chris@1: if(val<-32768){ Chris@1: if(!flag)fprintf(stderr,"clipping in frame %ld ",frameno+i); Chris@1: flag=1; Chris@1: val=-32768; Chris@1: } Chris@1: ptr[0]=val&0xff; Chris@1: ptr[1]=(val>>8)&0xff; Chris@1: ptr+=4; Chris@1: } Chris@1: } Chris@1: Chris@1: fprintf(stderr,"*"); Chris@1: fwrite(buffer,1,framesize*2,stdout); Chris@1: memmove(buffer,buffer2,framesize*2); Chris@1: Chris@1: for(i=0;i<2;i++){ Chris@1: for(j=0,k=framesize/2;j