Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "tfau_multi.c"
- static int mblk1_step5idx_table[32]={
- 1, 1, 2, 3, 4, 6, 8, 12,
- 16, 24, 32, 48, 64, 96, 128, 192,
- 256, 384, 512, 768, 1024, 1536, 2048, 3072,
- 4096, 6144, 8192, 12288, 16384, 24576, 32768, 49152
- };
- static int mblk1_step6idx_table[64]={
- 0, 1, 2, 3,
- 4, 5, 6, 7,
- 8, 10, 12, 14,
- 16, 20, 24, 28,
- 32, 40, 48, 56,
- 64, 80, 96, 112,
- 128, 160, 192, 224,
- 256, 320, 384, 448,
- 512, 640, 768, 896,
- 1024, 1280, 1536, 1792,
- 2048, 2560, 3072, 3584,
- 4096, 5120, 6144, 7168,
- 8192, 10240, 12288, 14436,
- 16384, 20480, 24576, 28672,
- 32768, 40960, 49152, 57344,
- 65536, 81920, 98304, 114688
- };
- //signed char mblk1_stepadj_tab[16] = {
- // -1, -1, -1, 0, 0, 1, 2, 4,
- // -1, -1, -1, 0, 0, 1, 2, 4 };
- signed char mblk1_stepadj_tab[16] = {
- -1, -1, 0, 0, 1, 2, 4, 8,
- -1, -1, 0, 0, 1, 2, 4, 8 };
- signed char mblk1_stepscl_tab[16] = {
- 1, 3, 5, 7, 9, 11, 13, 15,
- -1, -3, -5, -7, -9, -11, -13, -15
- };
- int MBlk1_DecodeBlkInitSample(u16 head)
- {
- int sv, e;
- #if 0
- // sv=(head>>4)&0x00F8;
- sv=(head>>4)&0x00FC;
- e=(head>>12)&7;
- if(e)
- { sv|=0x0100; e--; }
- sv=sv<<(e+1);
- if(head&0x8000)
- sv=-sv;
- return(sv);
- #endif
- #if 1
- e=(head>>11)&15;
- sv=(head>>6)&0x001F;
- if(e)
- { sv|=0x0020; e--; }
- sv=sv<<e;
- if(head&0x8000)
- sv=-sv;
- // sv=~sv;
- return(sv);
- #endif
- }
- int MBlk1_DecodeMonoInner(u16 *blk, s32 *samp, int bsz)
- {
- u16 *cs, *cse;
- s32 *ct;
- int p, v;
- int stix, stv, sb;
- int i, j, k;
- k=blk[0];
- p=MBlk1_DecodeBlkInitSample(k);
- stix=k&63;
- p<<=3;
- ct=samp;
- cs=blk+1;
- cse=cs+(bsz>>2);
- while(cs<cse)
- {
- sb=*cs++;
- for(i=0; i<4; i++)
- {
- stv=mblk1_step6idx_table[stix];
- j=(sb>>(i*4))&15;
- // k=(mblk1_stepscl_tab[j]*stv)>>3;
- k=(mblk1_stepscl_tab[j]*stv);
- p=p+k;
- stix+=mblk1_stepadj_tab[j];
- // *ct++=p;
- *ct++=p>>3;
- }
- }
- return(0);
- }
- int MBlk1_DecodeMono(u16 *blk, s16 *samp, int bsz)
- {
- s32 ctemp[256];
- int i, k;
- MBlk1_DecodeMonoInner(blk, ctemp, bsz);
- for(i=0; i<bsz; i++)
- {
- k=ctemp[i];
- if(k<(-32767))k=-32767;
- if(k>( 32767))k= 32767;
- samp[i]=k;
- }
- return(0);
- }
- int MBlk1_DecodeStereo(u16 *blk, s16 *samp, int bsz, int bfl)
- {
- s32 ctemp[256], stemp[68];
- u16 *cs, *cse;
- s16 *ct;
- int p, v, pl, pr, pc, ps, ps0, ps1, ps2, ps3;
- int stix, stv, sb;
- int i, j, k;
- k=(bsz/4)+1;
- MBlk1_DecodeMonoInner(blk+0, ctemp, bsz);
- MBlk1_DecodeMonoInner(blk+k, stemp+2, bsz/4);
- j=blk[k];
- ps1=MBlk1_DecodeBlkInitSample(j);
- ps0=stemp[2];
- // p=(3*ps1-ps0)>>1;
- p=ps1;
- k=bsz/4;
- stemp[0]=p; stemp[1]=p;
- ps1=stemp[k+1];
- stemp[k+2]=ps1; stemp[k+3]=ps1;
- ct=samp;
- for(i=0; i<bsz; i++)
- {
- pc=ctemp[i];
- // ps=stemp[i>>2];
- // ps=stemp[(i>>2)+2];
- j=i+8-2;
- // j=i+8-3;
- // j=i+8-1;
- ps0=stemp[(j>>2)+0];
- ps1=stemp[(j>>2)+1];
- k=(j&3)*2+1;
- // ps=((ps0*(8-k))+(ps1*k))/8;
- ps=((ps0*(8-k))+(ps1*k))>>3;
- #if 0
- ps2=stemp[(j>>2)-1];
- ps3=stemp[(j>>2)+0];
- k=(j&3)*2+9;
- ps0=((ps2*(8-k))+(ps3*k))>>3;
- ps2=stemp[(j>>2)+1];
- ps3=stemp[(j>>2)+2];
- k=(j&3)*2-7;
- ps1=((ps2*(8-k))+(ps3*k))>>3;
- k=(j&3)*2+1;
- ps=((ps0*(8-k))+(ps1*k))>>3;
- #endif
- pl=pc-(ps>>1);
- pr=pl+ps;
- // pl=pc-ps;
- // pr=pl+2*ps;
- // pl=pc;
- // pr=pc;
- if(pl<(-32767))pl=-32767;
- if(pl>( 32767))pl= 32767;
- if(pr<(-32767))pr=-32767;
- if(pr>( 32767))pr= 32767;
- if(!i && (bfl&1))
- {
- /* Try to blend block edge. */
- ps0=pl-ct[0];
- ps1=pr-ct[1];
- // ct[0]=pl+(ps0/4);
- // ct[1]=pr+(ps1/4);
- // ct[-2]+=(ps0/4);
- // ct[-1]+=(ps1/4);
- // ct[-4]+=(ps0/8);
- // ct[-3]+=(ps1/8);
- ct[0]=pl;
- ct[1]=pr;
- ct[-2]+=(ps0/3);
- ct[-1]+=(ps1/3);
- ct[-4]+=(ps0/8);
- ct[-3]+=(ps1/8);
- // ct[-6]+=(ps0/16);
- // ct[-5]+=(ps1/16);
- ct+=2;
- continue;
- }
- *ct++=pl;
- *ct++=pr;
- }
- if(bfl&2)
- {
- *ct++=pl;
- *ct++=pr;
- }
- return(0);
- }
- int MBlk1_EncodeInitSamp(int sval, int stix, int spr)
- {
- int sv, sg, se;
- int k;
- sv=sval; sg=0; se=0;
- if(sv<0)
- { sv=-sv; sg=1; }
- // { sv=~sv; sg=1; }
- // sv>>=3;
- // if(sv>=32)
- // se++;
- // while(sv>=64)
- // { sv=sv>>1; se++; }
- #if 0
- sv>>=1;
- // sv>>=2;
- // if(sv>=64)
- if(sv>=256)
- {
- se++;
- // while(sv>=128)
- while(sv>=512)
- { sv=sv>>1; se++; }
- // { sv=(sv+1)>>1; se++; }
- sv=sv+1;
- if(sv>=512)
- { sv=sv>>1; se++; }
- }else
- {
- sv=sv+2;
- if(sv>=256)
- se++;
- }
- if(se>=8)
- {
- sv=511;
- se=7;
- }
- sv=sv>>2;
- // sv=sv>>3;
- // sv=(sv+2)>>2;
- // k=((sv&31)<<7)|(se<<12)|(sg<<15)|(stix&31)|((spr&3)<<5);
- k=((sv&63)<<6)|(se<<12)|(sg<<15)|(stix&63);
- #endif
- #if 1
- sv<<=2;
- if(sv>=128)
- {
- se++;
- while(sv>=256)
- { sv=sv>>1; se++; }
- sv+=1;
- if(sv>=256)
- { sv=sv>>1; se++; }
- }
- // if(se>=8)
- if(0)
- {
- if(se>=12)
- {
- sv=63;
- se=11;
- }
- se-=4;
- sv>>=1;
- k=((sv&63)<<6)|(se<<12)|(sg<<15)|(stix&63);
- }else
- {
- sv>>=2;
- k=((sv&31)<<6)|(se<<11)|(sg<<15)|(stix&63);
- }
- #endif
- return(k);
- }
- int MBlk1_EncodeMonoInner(u16 *blk, s32 *samp, int bsz, u32 *state)
- {
- s32 *cs, *cse;
- u16 *ct;
- int stix, stv, spr, mxe;
- int e0, e1, e2, e3;
- int pa, pb, pc, pd, p0, p1, p2, p3, p, d, sv, sb;
- int i, j, k;
- // p=(s16)(*state);
- p=((s32)((*state)<<12))>>12;
- // stix=((*state)>>16)&31;
- // stix=((*state)>>16)&63;
- stix=((*state)>>20)&63;
- // spr=((*state)>>21)&3;
- // spr=((*state)>>22)&3;
- spr=0;
- // stix=stix+4;
- // if(stix>63)stix=63;
- ct=blk;
- k=MBlk1_EncodeInitSamp(p, stix, spr);
- sv=MBlk1_DecodeBlkInitSample(k);
- stv=mblk1_step6idx_table[stix];
- while((abs(p-sv)>=stv) && (stix<63))
- {
- stix++;
- k=MBlk1_EncodeInitSamp(p, stix, spr);
- sv=MBlk1_DecodeBlkInitSample(k);
- stv=mblk1_step6idx_table[stix];
- }
- *ct++=k;
- mxe=192;
- if(abs(p)>16384)
- mxe=384;
- if(abs(p)>32768)
- mxe=768;
- // if(abs(p-sv)>=192)
- // if(abs(p-sv)>=384)
- if(abs(p-sv)>=mxe)
- printf("%d %d %d\n", p, sv, p-sv);
- e0=0; e1=0; e2=0; e3=0;
- pa=sv; pb=sv; pc=sv; pd=sv;
- p=pa;
- pa<<=3;
- cs=samp; cse=cs+bsz;
- while(cs<cse)
- {
- sb=0;
- for(i=0; i<4; i++)
- {
- p=pa;
- stv=mblk1_step6idx_table[stix];
- sv=*cs++;
- sv<<=3;
- #if 0
- if(((cs+4)>=cse) || (cs==samp))
- // if(1)
- {
- k=MBlk1_EncodeInitSamp(sv, stix, spr);
- sv=MBlk1_DecodeBlkInitSample(k);
- }
- #endif
- // d=sv-p;
- d=(sv-p)>>3;
- if(!stv)
- {
- j=(d<0)?15:7;
- }else
- if(d<0)
- {
- d=-d;
- j=(d<<2)/stv;
- // j=(d<<2)/(stv*8);
- // j=(d<<3)/stv;
- // j=(j-1)>>1;
- if(j>7)j=7;
- j|=8;
- }else
- {
- j=(d<<2)/stv;
- // j=(d<<2)/(stv*8);
- // j=(d<<3)/stv;
- // j=(j-1)>>1;
- if(j>7)j=7;
- }
- /* Avoid StepIndex going to 0. */
- if((stix<2) && ((j&7)<4))
- // if((stix<5) && ((j&7)<4))
- j=(d<0)?12:4;
- /* Avoid StepIndex going out of range. */
- // if((stix>62) && ((j&7)>=4))
- // j=(d<0)?11:3;
- while((stix>=56) && ((stix+mblk1_stepadj_tab[j])>63))
- j--;
- if(j<0)j=0;
- #if 1
- pa=j;
- pb=(j-1)&15;
- pc=(j+1)&15;
- // k=(mblk1_stepscl_tab[j]*stv)>>3;
- k=(mblk1_stepscl_tab[j]*stv);
- p0=p+k;
- // k=(mblk1_stepscl_tab[pb]*stv)>>3;
- k=(mblk1_stepscl_tab[pb]*stv);
- p1=p+k;
- // k=(mblk1_stepscl_tab[pc]*stv)>>3;
- k=(mblk1_stepscl_tab[pc]*stv);
- p2=p+k;
- if(abs(sv-p1)<abs(sv-p0))
- j=pb;
- if(abs(sv-p2)<abs(sv-p0))
- j=pc;
- #endif
- sb|=j<<(i*4);
- // k=(mblk1_stepscl_tab[j]*stv)>>3;
- k=(mblk1_stepscl_tab[j]*stv);
- p=p+k;
- pa=p;
- stix+=mblk1_stepadj_tab[j];
- if(stix&(~63))
- {
- printf("MblkAd Enc, StIx Out of Range\n");
- if(stix< 0)stix= 0;
- if(stix>63)stix=63;
- }
- }
- *ct++=sb;
- }
- p>>=3;
- spr=0;
- // printf("%d", spr);
- // if(p<(-32767))p=-32767;
- // if(p>( 32767))p= 32767;
- // if(p<(-49151))p=-49151;
- // if(p>( 49151))p= 49151;
- if(p<(-98304))p=-98304;
- if(p>( 98304))p= 98304;
- *state=(p&0xFFFFF)|(stix<<20);
- return(0);
- }
- int MBlk1_EncodeMono(u16 *blk, s16 *samp, int bsz, u32 *state)
- {
- s32 ctemp[256];
- int i;
- for(i=0; i<bsz; i++)
- ctemp[i]=samp[i];
- MBlk1_EncodeMonoInner(blk, ctemp, bsz, state);
- return(0);
- }
- int MBlk1_EncodeStereo(u16 *blk, s16 *samp, int bsz,
- u32 *cstate, u32 *sstate)
- {
- s32 ctemp[288], stemp[72];
- int pc0, pc1, pc2, pc3, ps0, ps1, ps2, ps3, pc;
- int pl0, pl1, pl2, pl3, pr0, pr1, pr2, pr3, ps;
- int pl4, pl5, pl6, pl7, pr4, pr5, pr6, pr7;
- int pc4, pc5, pc6, pc7;
- int i, j, k;
- // for(i=0; i<(bsz/4); i++)
- for(i=0; i<=(bsz/4); i++)
- {
- pl0=samp[i*8+0]; pr0=samp[i*8+1];
- pl1=samp[i*8+2]; pr1=samp[i*8+3];
- pl2=samp[i*8+4]; pr2=samp[i*8+5];
- pl3=samp[i*8+6]; pr3=samp[i*8+7];
- pc0=(pl0+pr0)/2; pc1=(pl1+pr1)/2;
- pc2=(pl2+pr2)/2; pc3=(pl3+pr3)/2;
- ps0=pr0-pl0; ps1=pr1-pl1;
- ps2=pr2-pl2; ps3=pr3-pl3;
- // ps0=(pr0-pl0)/2; ps1=(pr1-pl1)/2;
- // ps2=(pr2-pl2)/2; ps3=(pr3-pl3)/2;
- // ps0=(pr0-pl0)/4; ps1=(pr1-pl1)/4;
- // ps2=(pr2-pl2)/4; ps3=(pr3-pl3)/4;
- pc=(pc0+pc1+pc2+pc3)/4;
- // ps=(ps0+ps1+ps2+ps3)/4;
- ps=(ps0+3*ps1+3*ps2+ps3)/8;
- // ps=ps/2;
- // ps=0;
- // if(ps<(-32767))ps=-32767;
- // if(ps>( 32767))ps= 32767;
- #if 0
- pl4=pc0-(ps>>1); pl5=pc1-(ps>>1);
- pl6=pc2-(ps>>1); pl7=pc3-(ps>>1);
- pr4=pl4+ps; pr5=pl5+ps;
- pr6=pl6+ps; pr7=pl7+ps;
- // pl4=pc0-ps; pl5=pc1-ps;
- // pl6=pc2-ps; pl7=pc3-ps;
- // pr4=pl4+ps*2; pr5=pl5+ps*2;
- // pr6=pl6+ps*2; pr7=pl7+ps*2;
- // pc4=pc0+(((pl0-pl4)+(pr0-pr4))/2);
- // pc5=pc1+(((pl1-pl5)+(pr1-pr5))/2);
- // pc6=pc2+(((pl2-pl6)+(pr2-pr6))/2);
- // pc7=pc3+(((pl3-pl7)+(pr3-pr7))/2);
- pc4=2*pc0-((pl4+pr4)/2);
- pc5=2*pc1-((pl5+pr5)/2);
- pc6=2*pc2-((pl6+pr6)/2);
- pc7=2*pc3-((pl7+pr7)/2);
- pc4=pc0;
- pc5=pc1;
- pc6=pc2;
- pc7=pc3;
- #endif
- ctemp[i*4+0]=pc0;
- ctemp[i*4+1]=pc1;
- ctemp[i*4+2]=pc2;
- ctemp[i*4+3]=pc3;
- stemp[i+2]=ps;
- }
- #if 0
- j=(s16)(*sstate);
- k=MBlk1_EncodeInitSamp(j, 0, 0);
- j=MBlk1_DecodeBlkInitSample(k);
- stemp[0]=j;
- stemp[1]=j;
- // stemp[0]=(s16)(*sstate);
- // stemp[1]=(s16)(*sstate);
- // stemp[(bsz/4)+2]=ps;
- // stemp[(bsz/4)+3]=ps;
- for(i=0; i<bsz; i++)
- {
- pl0=samp[i*2+0]; pr0=samp[i*2+1];
- pc=(pl0+pr0)/2;
- pc0=ctemp[i];
- // ps=stemp[i>>2];
- j=i+8-2;
- ps0=stemp[(j>>2)+0];
- ps1=stemp[(j>>2)+1];
- k=(j&3)*2+1;
- ps=((ps0*(8-k))+(ps1*k))/8;
- // pl1=pc0-(ps>>1);
- // pr1=pl1+ps;
- pl1=pc0-ps;
- pr1=pl1+2*ps;
- pc1=2*pc-((pl1+pr1)/2);
- ctemp[i]=pc1;
- }
- #endif
- MBlk1_EncodeMonoInner(blk+0, ctemp, bsz, cstate);
- MBlk1_EncodeMonoInner(blk+((bsz/4)+1), stemp+2, bsz/4, sstate);
- return(0);
- }
- int main(int argc, char *argv[])
- {
- byte *tbuf;
- s16 *ibuf, *obuf;
- char *ifn, *ofn;
- u64 tblk;
- u32 testate, testate2;
- int ilen, irate;
- s64 err;
- s64 e0, e1, e2, e3;
- int d0, d1, d2, d3, bsz;
- int pa, pb, pc, pd, p0, p1, p2, p3;
- int i, j, k;
- ifn=NULL;
- ofn=NULL;
- for(i=1; i<argc; i++)
- {
- if(argv[i][0]=='-')
- {
- continue;
- }
- if(!ifn)
- {
- ifn=argv[i];
- continue;
- }
- if(!ofn)
- {
- ofn=argv[i];
- continue;
- }
- }
- // irate=32000;
- irate=16000;
- // ibuf=BGBMID_LoadWAV_16Mono16(ifn, &ilen);
- // ibuf=BGBMID_LoadWAV_16Stereo16(ifn, &ilen);
- // ibuf=BGBMID_LoadWAV_32Stereo16(ifn, &ilen);
- ibuf=BGBMID_LoadWAV_RateStereo16(ifn, irate, &ilen);
- obuf=malloc((ilen+32)*2*4*sizeof(s16));
- err=0;
- tbuf=malloc(ilen);
- pa=ibuf[0]; pb=ibuf[0];
- pc=ibuf[0]; pd=ibuf[0];
- e0=0; e1=0;
- e2=0; e3=0;
- for(i=0; i<ilen; i++)
- {
- p0=pa;
- p1=2*pa-pb;
- // p2=3*pa-2*pb;
- p2=(3*pa-pb)/2;
- // p3=9*pa-6*pb-6*pc+4*pd;
- p3=(9*pa-3*pb-3*pc+pd)/4;
- k=ibuf[i];
- pd=pc; pc=pb; pb=pa; pa=k;
- d0=k-p0; d1=k-p1;
- d2=k-p2; d3=k-p3;
- // e0+=d0*d0;
- // e1+=d1*d1;
- // e2+=d2*d2;
- // e3+=d3*d3;
- e0+=d0^(d0>>31);
- e1+=d1^(d1>>31);
- e2+=d2^(d2>>31);
- e3+=d3^(d3>>31);
- }
- d0=(e0/ilen);
- d1=(e1/ilen);
- d2=(e2/ilen);
- d3=(e3/ilen);
- // d0=sqrt(e0/ilen);
- // d1=sqrt(e1/ilen);
- // d2=sqrt(e2/ilen);
- // d3=sqrt(e3/ilen);
- printf("%d %d %d %d\n", d0, d1, d2, d3);
- // printf("%lld %lld %lld %lld\n", e0, e1, e2, e3);
- bsz=256;
- // bsz=64;
- ilen=(ilen/bsz)*bsz;
- // ilen=(ilen/1024)*1024;
- BGBMID_StoreWAV("mblk0_tr.wav", (byte *)ibuf, 2, irate, 16, ilen);
- testate=0;
- testate2=0;
- // for(i=0; i<(ilen/1024); i++)
- for(i=0; i<(ilen/bsz); i++)
- {
- // MBlk1_EncodeMono((u16 *)(tbuf+(i*17*2)), ibuf+(i*64), 64, &testate);
- // MBlk1_EncodeMono((u16 *)(tbuf+(i*257*2)), ibuf+(i*1024), 1024, &testate);
- MBlk1_EncodeStereo(
- (u16 *)(tbuf+(i*(bsz/4+bsz/16+2)*2)),
- ibuf+(i*bsz*2), bsz, &testate, &testate2);
- }
- // for(i=0; i<(ilen/1024); i++)
- for(i=0; i<(ilen/bsz); i++)
- {
- // MBlk1_DecodeMono((u16 *)(tbuf+(i*17*2)), obuf+(i*64), 64);
- // MBlk1_DecodeMono((u16 *)(tbuf+(i*257*2)), obuf+(i*1024), 1024);
- MBlk1_DecodeStereo(
- (u16 *)(tbuf+(i*(bsz/4+bsz/16+2)*2)),
- obuf+(i*bsz*2), bsz, 2|(i>0));
- }
- // BGBMID_StoreWAV("mblk0_ts0.wav", (byte *)obuf, 1, 16000, 16, ilen);
- BGBMID_StoreWAV("mblk0_ts1.wav", (byte *)obuf, 2, irate, 16, ilen);
- e0=0; e1=0; e2=0;
- for(i=0; i<ilen; i++)
- {
- p0=obuf[i*2+0]; p1=ibuf[i*2+0];
- p2=obuf[i*2+1]; p3=ibuf[i*2+1];
- j=p0-p1;
- k=p2-p3;
- e0+=j*j;
- e1+=k*k;
- k=((p0+p2)/2)-((p1+p3)/2);
- e2+=k*k;
- }
- printf("E=%f %f %f\n", sqrt(e0/ilen), sqrt(e1/ilen), sqrt(e2/ilen));
- return(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment