From b84211ac71ebed8ed0d8e3db26557f41f4a21e81 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Thu, 1 Mar 2012 15:55:31 +0100 Subject: [PATCH] mpc: Fix mpc_SCF use and content. This fixes a out of global array read. This change is based on the reference mpc imlementation. Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind Signed-off-by: Michael Niedermayer --- libavcodec/mpc.c | 6 +++--- libavcodec/mpcdata.h | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/libavcodec/mpc.c b/libavcodec/mpc.c index c2975ec732..7caf31229b 100644 --- a/libavcodec/mpc.c +++ b/libavcodec/mpc.c @@ -78,13 +78,13 @@ void ff_mpc_dequantize_and_synth(MPCContext * c, int maxband, void *data, int ch for(ch = 0; ch < 2; ch++){ if(bands[i].res[ch]){ j = 0; - mul = mpc_CC[bands[i].res[ch]] * mpc_SCF[bands[i].scf_idx[ch][0]]; + mul = mpc_CC[bands[i].res[ch]] * mpc_SCF[bands[i].scf_idx[ch][0] & 0xFF]; for(; j < 12; j++) 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]] * mpc_SCF[bands[i].scf_idx[ch][1] & 0xFF]; for(; j < 24; j++) 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]] * mpc_SCF[bands[i].scf_idx[ch][2] & 0xFF]; for(; j < 36; j++) c->sb_samples[ch][j][i] = mul * c->Q[ch][j + off]; } diff --git a/libavcodec/mpcdata.h b/libavcodec/mpcdata.h index 03df3da3b5..6538153f2a 100644 --- a/libavcodec/mpcdata.h +++ b/libavcodec/mpcdata.h @@ -28,7 +28,7 @@ static const float mpc_CC[18] = { 4.0002, 2.0001, 1.0000 }; -static const float mpc_SCF[128] = { +static const float mpc_SCF[256] = { 307.330047607421875000, 255.999984741210937500, 213.243041992187500000, 177.627334594726562500, 147.960128784179687500, 123.247924804687500000, 102.663139343261718750, 85.516410827636718750, 71.233520507812500000, 59.336143493652343750, 49.425861358642578125, 41.170787811279296875, @@ -60,7 +60,39 @@ static const float mpc_SCF[128] = { 0.000000396931966407, 0.000000330636652279, 0.000000275413924555, 0.000000229414467867, 0.000000191097811353, 0.000000159180785886, 0.000000132594522029, 0.000000110448674207, 0.000000092001613439, 0.000000076635565449, 0.000000063835940978, 0.000000053174105119, - 0.000000044293003043, 0.000000036895215771, 0.000000030733001921, 0.000000025599996789 + 0.000000044293003043, 0.000000036895215771, 0.000000030733001921, 0.000000025599996789, + 0.000000021324305018, 3689522167600.270019531250000000, 3073300627835.926757812500000000, 2560000000000.002929687500000000, + 2132430501800.519042968750000000, 1776273376956.721923828125000000, 1479601378343.250244140625000000, 1232479339720.794189453125000000, + 1026631459710.774291992187500000, 855164155779.391845703125000000, 712335206965.024780273437500000, 593361454233.829101562500000000, + 494258618594.112609863281250000, 411707872682.763122558593750000, 342944697476.612365722656250000, 285666302081.983886718750000000, + 237954506209.446411132812500000, 198211502766.368713378906250000, 165106349338.563323974609375000, 137530396629.095306396484375000, + 114560161209.611633300781250000, 95426399240.062576293945312500, 79488345475.196502685546875000, 66212254855.064872741699218750, + 55153528064.816276550292968750, 45941822471.611343383789062500, 38268649822.956413269042968750, 31877045369.216873168945312500, + 26552962442.420688629150390625, 22118104306.789615631103515625, 18423953228.829509735107421875, 15346796808.164905548095703125, + 12783585007.291271209716796875, 10648479137.463939666748046875, 8869977230.669750213623046875, 7388519530.061036109924316406, + 6154493909.785535812377929688, 5126574428.270387649536132812, 4270337375.232155323028564453, 3557108465.595236301422119141, + 2963002574.315670013427734375, 2468123854.056322574615478516, 2055899448.676229715347290039, 1712524489.450022459030151367, + 1426499787.649837732315063477, 1188246741.404872417449951172, 989786560.561257958412170410, 824473067.192597866058349609, + 686770123.591610312461853027, 572066234.090648531913757324, 476520111.962911486625671387, 396932039.637152194976806641, + 330636714.243810534477233887, 275413990.026798009872436523, 229414528.498330980539321899, 191097866.455478429794311523, + 159180827.835415601730346680, 132594551.788319095969200134, 110448697.892960876226425171, 92001629.793398514389991760, + 76635578.744844585657119751, 63835955.327594503760337830, 53174116.504741288721561432, 44293010.914454914629459381, + 36895221.676002673804759979, 30733006.278359245508909225, 25600000.000000011175870895, 21324305.018005173653364182, + 17762733.769567202776670456, 14796013.783432489261031151, 12324793.397207930684089661, 10266314.597107734531164169, + 8551641.557793911546468735, 7123352.069650243036448956, 5933614.542338287457823753, 4942586.185941123403608799, + 4117078.726827629376202822, 3429446.974766122177243233, 2856663.020819837693125010, 2379545.062094463035464287, + 1982115.027663686312735081, 1651063.493385632522404194, 1375303.966290952404960990, 1145601.612096115713939071, + 954263.992400625254958868, 794883.454751964658498764, 662122.548550648498348892, 551535.280648162588477135, + 459418.224716113239992410, 382686.498229563992936164, 318770.453692168579436839, 265529.624424206791445613, + 221181.043067896069260314, 184239.532288295013131574, 153467.968081648985389620, 127835.850072912653558888, + 106484.791374639346031472, 88699.772306697457679547, 73885.195300610314006917, 61544.939097855312866159, + 51265.744282703839417081, 42703.373752321524079889, 35571.084655952341563534, 29630.025743156678800005, + 24681.238540563208516687, 20558.994486762283486314, 17125.244894500214286381, 14264.997876498367986642, + 11882.467414048716818797, 9897.865605612574654515, 8244.730671925974093028, 6867.701235916098994494, + 5720.662340906482313585, 4765.201119629112326948, 3969.320396371519564127, 3306.367142438103201130, + 2754.139900267978191550, 2294.145284983308101801, 1910.978664554782881169, 1591.808278354154936096, + 1325.945517883190177599, 1104.486978929608085309, 920.016297933984674273, 766.355787448445425980, + 638.359553275944676898, 531.741165047412550848, 442.930109144548907807, 368.952216760026544762, }; #endif /* AVCODEC_MPCDATA_H */