void ampegdecoder::decode1() { int i,j,q,fr; for (fr=0; fr<3; fr++) { if (fr) decodehdr(0); if (!hdrbitrate) { for (q=0; q<12; q++) for (j=0; j<2; j++) for (i=0; i<32; i++) fraction[j][12*fr+q][i]=0; continue; } int bitend=mainbufpos-32-(hdrcrc?16:0)+(hdrpadding?32:0)+12*1000*ratetab[hdrlsf?1:0][0][hdrbitrate]/(freqtab[hdrfreq]>>hdrlsf)*32; int jsbound=(hdrmode==1)?(hdrmodeext+1)*4:(hdrmode==3)?0:32; int stereo=(hdrmode==3)?1:2; for (i=0;i<32;i++) for (j=0;j<((i<jsbound)?2:1);j++) { bitalloc1[j][i] = mpgetbits(4); if (i>=jsbound) bitalloc1[1][i] = bitalloc1[0][i]; } for (i=0;i<32;i++) for (j=0;j<stereo;j++) if (bitalloc1[j][i]) scale1[j][i]=multiple[mpgetbits(6)]*rangefac[bitalloc1[j][i]]; for (q=0;q<12;q++) for (i=0;i<32;i++) for (j=0;j<((i<jsbound)?2:1);j++) if (bitalloc1[j][i]) { int s=mpgetbits(bitalloc1[j][i]+1)-(1<<bitalloc1[j][i])+1; fraction[j][12*fr+q][i]=scale1[j][i]*s; if (i>=jsbound) fraction[1][12*fr+q][i]=scale1[1][i]*s; } else { fraction[j][12*fr+q][i]=0; if (i>=jsbound) fraction[1][12*fr+q][i]=0; } mpgetbits(bitend-mainbufpos); } }
void ampegdecoder::readmain(grsistruct (*si)[2]) { int stereo=(hdrmode==3)?1:2; int maindatabegin = mpgetbits(hdrlsf?8:9); mpgetbits(hdrlsf?(stereo==1)?1:2:(stereo==1)?5:3); if (!si) mpgetbits(hdrlsf?(stereo==1)?64:128:(stereo==1)?127:247); else { int ngr=hdrlsf?1:2; int gr,ch; for (gr=0; gr<ngr; gr++) for (ch=0; ch<stereo; ch++) { si[ch][gr].ch=ch; si[ch][gr].gr=gr; } for (gr=0; gr<ngr; gr++) for (ch=0; ch<stereo; ch++) readsfsi(si[ch][gr]); int bitpos=0; for (gr=0; gr<ngr; gr++) for (ch=0; ch<stereo; ch++) readgrsi(si[ch][gr], bitpos); } int mainslots=(hdrlsf?72:144)*1000*ratetab[hdrlsf?1:0][2][hdrbitrate]/(freqtab[hdrfreq]>>hdrlsf)+(hdrpadding?1:0)-4-(hdrcrc?2:0)-(hdrlsf?(stereo==1)?9:17:(stereo==1)?17:32); if (huffoffset<maindatabegin) huffoffset=maindatabegin; memmove(huffbuf, huffbuf+huffoffset-maindatabegin, maindatabegin); getbytes(huffbuf+maindatabegin, mainslots); huffoffset=maindatabegin+mainslots; bitbuf=huffbuf; bitbufpos=&huffbit; }
void ampegdecoder::readhuffman(grsistruct &si, float *xr) { int *ro=rotab[(si.blocktype!=2)?0:si.mixedblock?2:1]; int i; for (i=0; i<si.regionend[2]; i+=2) { int t=(i<si.regionend[0])?0:(i<si.regionend[1])?1:2; int linbits=htablinbits[si.tabsel[t]]; int val=huffmandecoder(htabs[si.tabsel[t]]); int x; double v; x=val>>4; if (x==15) x=15+mpgetbits(linbits); v=pow43tab[x]; if (x) if (mpgetbit()) v=-v; xr[ro[i+0]]=v; x=val&15; if (x==15) x=15+mpgetbits(linbits); v=pow43tab[x]; if (x) if (mpgetbit()) v=-v; xr[ro[i+1]]=v; } while ((*bitbufpos<si.grend)&&(i<576)) { int val=huffmandecoder(htabs[si.tabsel[3]]); int x; x=(val>>3)&1; if (x) if (mpgetbit()) x=-x; xr[ro[i+0]]=x; x=(val>>2)&1; if (x) if (mpgetbit()) x=-x; xr[ro[i+1]]=x; x=(val>>1)&1; if (x) if (mpgetbit()) x=-x; xr[ro[i+2]]=x; x=val&1; if (x) if (mpgetbit()) x=-x; xr[ro[i+3]]=x; i+=4; } if (*bitbufpos>si.grend) i-=4; while (i<576) xr[ro[i++]]=0; }
void ampegdecoder::readscalefac(grsistruct &si, int *scalefacl) { *bitbufpos=si.grstart; int newslen[4]; int blocknumber; if (!hdrlsf) { newslen[0]=slentab[0][si.sfcompress]; newslen[1]=slentab[0][si.sfcompress]; newslen[2]=slentab[1][si.sfcompress]; newslen[3]=slentab[1][si.sfcompress]; blocknumber=6; } else if ((hdrmode!=1)||!(hdrmodeext&1)||!si.ch) { if (si.sfcompress>=500) { newslen[0] = ((si.sfcompress-500)/ 3)%4; newslen[1] = ((si.sfcompress-500)/ 1)%3; newslen[2] = ((si.sfcompress-500)/ 1)%1; newslen[3] = ((si.sfcompress-500)/ 1)%1; blocknumber = 2; } else if (si.sfcompress>=400) { newslen[0] = ((si.sfcompress-400)/20)%5; newslen[1] = ((si.sfcompress-400)/ 4)%5; newslen[2] = ((si.sfcompress-400)/ 1)%4; newslen[3] = ((si.sfcompress-400)/ 1)%1; blocknumber = 1; } else { newslen[0] = ((si.sfcompress- 0)/80)%5; newslen[1] = ((si.sfcompress- 0)/16)%5; newslen[2] = ((si.sfcompress- 0)/ 4)%4; newslen[3] = ((si.sfcompress- 0)/ 1)%4; blocknumber = 0; } } else { if (si.sfcompress>=244) { newslen[0] = ((si.sfcompress-244)/ 3)%4; newslen[1] = ((si.sfcompress-244)/ 1)%3; newslen[2] = ((si.sfcompress-244)/ 1)%1; newslen[3] = ((si.sfcompress-244)/ 1)%1; blocknumber = 5; } else if (si.sfcompress>=180) { newslen[0] = ((si.sfcompress-180)/16)%4; newslen[1] = ((si.sfcompress-180)/ 4)%4; newslen[2] = ((si.sfcompress-180)/ 1)%4; newslen[3] = ((si.sfcompress-180)/ 1)%1; blocknumber = 4; } else { newslen[0] = ((si.sfcompress- 0)/36)%5; newslen[1] = ((si.sfcompress- 0)/ 6)%6; newslen[2] = ((si.sfcompress- 0)/ 1)%6; newslen[3] = ((si.sfcompress- 0)/ 1)%1; blocknumber = 3; } } int i,k; int *sfb=sfbtab[blocknumber][(si.blocktype!=2)?0:si.mixedblock?2:1]; int *sfp=scalefacl; for (i=0;i<4;i++) if (!si.sfsi[i]) for (k=sfb[i]; k<sfb[i+1]; k++) *sfp++=mpgetbits(newslen[i]); else sfp+=sfb[i+1]-sfb[i]; *sfp++=0; *sfp++=0; *sfp++=0; }
void ampegdecoder::readgrsi(grsistruct &si, int &bitpos) { int i; si.grstart=bitpos; bitpos+=mpgetbits(12); si.grend=bitpos; si.regionend[2]=mpgetbits(9)*2; si.globalgain=mpgetbits(8); if (hdrlsf&&(hdrmode==1)&&(hdrmodeext&1)&&si.ch) { si.sfcompress=mpgetbits(8); si.ktabsel=mpgetbit(); } else { si.sfcompress=mpgetbits(hdrlsf?9:4); si.ktabsel=2; } if (mpgetbit()) { si.blocktype = mpgetbits(2); si.mixedblock = mpgetbit(); for (i=0; i<2; i++) si.tabsel[i]=mpgetbits(5); si.tabsel[2]=0; for (i=0; i<3; i++) si.subblockgain[i]=4*mpgetbits(3); if (si.blocktype==2) si.regionend[0]=sfbands[hdrlsf][hdrfreq][3]; else si.regionend[0]=sfbandl[hdrlsf][hdrfreq][HUFFMAXLONG]; si.regionend[1]=576; } else { for (i=0; i<3; i++) si.tabsel[i]=mpgetbits(5); int region0count = mpgetbits(4)+1; int region1count = mpgetbits(3)+1+region0count; si.regionend[0]=sfbandl[hdrlsf][hdrfreq][region0count]; si.regionend[1]=sfbandl[hdrlsf][hdrfreq][region1count]; si.blocktype = 0; si.mixedblock = 0; } if (si.regionend[0]>si.regionend[2]) si.regionend[0]=si.regionend[2]; if (si.regionend[1]>si.regionend[2]) si.regionend[1]=si.regionend[2]; si.regionend[3]=576; si.preflag=hdrlsf?(si.sfcompress>=500)?1:0:mpgetbit(); si.sfshift=mpgetbit(); si.tabsel[3]=mpgetbit()?33:32; if (si.blocktype) for (i=0; i<4; i++) si.sfsi[i]=0; }