MPC8 allows indices of mpc_CC up to -1, and mpc_SCF up to -6, thus pad the tables by that much on the left end. Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind CC: libav-stable@libav.orgtags/n0.11
| @@ -78,13 +78,13 @@ void ff_mpc_dequantize_and_synth(MPCContext * c, int maxband, void *data, int ch | |||||
| for(ch = 0; ch < 2; ch++){ | for(ch = 0; ch < 2; ch++){ | ||||
| if(bands[i].res[ch]){ | if(bands[i].res[ch]){ | ||||
| j = 0; | j = 0; | ||||
| mul = mpc_CC[bands[i].res[ch]] * mpc_SCF[bands[i].scf_idx[ch][0]]; | |||||
| mul = mpc_CC[bands[i].res[ch] + 1] * mpc_SCF[bands[i].scf_idx[ch][0]+6]; | |||||
| for(; j < 12; j++) | for(; j < 12; j++) | ||||
| c->sb_samples[ch][j][i] = mul * c->Q[ch][j + off]; | c->sb_samples[ch][j][i] = mul * c->Q[ch][j + off]; | ||||
| mul = mpc_CC[bands[i].res[ch]] * mpc_SCF[bands[i].scf_idx[ch][1]]; | |||||
| mul = mpc_CC[bands[i].res[ch] + 1] * mpc_SCF[bands[i].scf_idx[ch][1]+6]; | |||||
| for(; j < 24; j++) | for(; j < 24; j++) | ||||
| c->sb_samples[ch][j][i] = mul * c->Q[ch][j + off]; | c->sb_samples[ch][j][i] = mul * c->Q[ch][j + off]; | ||||
| mul = mpc_CC[bands[i].res[ch]] * mpc_SCF[bands[i].scf_idx[ch][2]]; | |||||
| mul = mpc_CC[bands[i].res[ch] + 1] * mpc_SCF[bands[i].scf_idx[ch][2]+6]; | |||||
| for(; j < 36; j++) | for(; j < 36; j++) | ||||
| c->sb_samples[ch][j][i] = mul * c->Q[ch][j + off]; | c->sb_samples[ch][j][i] = mul * c->Q[ch][j + off]; | ||||
| } | } | ||||
| @@ -193,7 +193,7 @@ static int get_scale_idx(GetBitContext *gb, int ref) | |||||
| int t = get_vlc2(gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | int t = get_vlc2(gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; | ||||
| if (t == 8) | if (t == 8) | ||||
| return get_bits(gb, 6); | return get_bits(gb, 6); | ||||
| return ref + t; | |||||
| return av_clip_uintp2(ref + t, 7); | |||||
| } | } | ||||
| static int mpc7_decode_frame(AVCodecContext * avctx, void *data, | static int mpc7_decode_frame(AVCodecContext * avctx, void *data, | ||||
| @@ -247,7 +247,7 @@ static int mpc7_decode_frame(AVCodecContext * avctx, void *data, | |||||
| int t = 4; | int t = 4; | ||||
| if(i) t = get_vlc2(&gb, hdr_vlc.table, MPC7_HDR_BITS, 1) - 5; | if(i) t = get_vlc2(&gb, hdr_vlc.table, MPC7_HDR_BITS, 1) - 5; | ||||
| if(t == 4) bands[i].res[ch] = get_bits(&gb, 4); | if(t == 4) bands[i].res[ch] = get_bits(&gb, 4); | ||||
| else bands[i].res[ch] = bands[i-1].res[ch] + t; | |||||
| else bands[i].res[ch] = av_clip(bands[i-1].res[ch] + t, 0, 17); | |||||
| } | } | ||||
| if(bands[i].res[0] || bands[i].res[1]){ | if(bands[i].res[0] || bands[i].res[1]){ | ||||
| @@ -22,13 +22,17 @@ | |||||
| #ifndef AVCODEC_MPCDATA_H | #ifndef AVCODEC_MPCDATA_H | ||||
| #define AVCODEC_MPCDATA_H | #define AVCODEC_MPCDATA_H | ||||
| static const float mpc_CC[18] = { | |||||
| 65536.0000, 21845.3333, 13107.2000, 9362.2857, 7281.7778, 4369.0667, 2114.0645, | |||||
| static const float mpc_CC[18+1] = { | |||||
| 111.285962475327f, // 32768/2/255*sqrt(3) | |||||
| 65536.0000 /* this value is never used */, | |||||
| 21845.3333, 13107.2000, 9362.2857, 7281.7778, 4369.0667, 2114.0645, | |||||
| 1040.2539, 516.0315, 257.0039, 128.2505, 64.0626, 32.0156, 16.0039, 8.0010, | 1040.2539, 516.0315, 257.0039, 128.2505, 64.0626, 32.0156, 16.0039, 8.0010, | ||||
| 4.0002, 2.0001, 1.0000 | 4.0002, 2.0001, 1.0000 | ||||
| }; | }; | ||||
| static const float mpc_SCF[128] = { | |||||
| static const float mpc_SCF[128+6] = { | |||||
| 920.016296386718750000, 766.355773925781250000, 638.359558105468750000, | |||||
| 531.741149902343750000, 442.930114746093750000, 368.952209472656250000, | |||||
| 307.330047607421875000, 255.999984741210937500, 213.243041992187500000, 177.627334594726562500, | 307.330047607421875000, 255.999984741210937500, 213.243041992187500000, 177.627334594726562500, | ||||
| 147.960128784179687500, 123.247924804687500000, 102.663139343261718750, 85.516410827636718750, | 147.960128784179687500, 123.247924804687500000, 102.663139343261718750, 85.516410827636718750, | ||||
| 71.233520507812500000, 59.336143493652343750, 49.425861358642578125, 41.170787811279296875, | 71.233520507812500000, 59.336143493652343750, 49.425861358642578125, 41.170787811279296875, | ||||