void ampegdecoder::seekinit3(int discard) { int i,j,k; int extra=(seekmode==seekmodeexact)?1:0; if ((discard>=seekinitframes)&&extra) for (i=0; i<2; i++) for (j=0; j<32; j++) for (k=0; k<18; k++) prevblck[i][j][k]=0; huffoffset=0; for (i=discard; i<seekinitframes; i++) if (i<(seekinitframes-extra)) for (j=0; j<(hdrlsf?2:1); j++) { if (!decodehdr(0)) return; readmain(0); } else { if (!decodehdr(0)) return; decode3(); } }
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::decode3() { int fr,gr,ch,sb,ss; for (fr=0; fr<(hdrlsf?2:1); fr++) { grsistruct si0[2][2]; if (fr) decodehdr(0); if (!hdrbitrate) { for (gr=fr; gr<2; gr++) for (ch=0; ch<2; ch++) for (sb=0; sb<32; sb++) for (ss=0; ss<18; ss++) { fraction[ch][gr*18+ss][sb]=((sb&ss&1)?-1:1)*prevblck[ch][sb][ss]; prevblck[ch][sb][ss]=0; } return; } readmain(si0); int stereo=(hdrmode==3)?1:2; int ngr=hdrlsf?1:2; for (gr=0;gr<ngr;gr++) { for (ch=0; ch<stereo; ch++) { readscalefac(si0[ch][gr], scalefac0[ch]); readhuffman(si0[ch][gr], xr0[ch]); doscale(si0[ch][gr], xr0[ch], scalefac0[ch]); } if (hdrmode==1) jointstereo(si0[1][gr], xr0, scalefac0[1]); for (ch=0; ch<stereo; ch++) hybrid(si0[ch][gr], fraction[ch]+(fr+gr)*18, prevblck[ch], xr0[ch]); } } }