mirror of
https://github.com/claunia/cuetools.net.git
synced 2025-12-16 18:14:25 +00:00
CUETools.Flake: add an overflow safeguard when encoding hires files
This commit is contained in:
@@ -1363,7 +1363,14 @@ namespace CUETools.Codecs.FLACCL
|
|||||||
fixed (int* coefs = task.frame.subframes[ch].best.coefs)
|
fixed (int* coefs = task.frame.subframes[ch].best.coefs)
|
||||||
{
|
{
|
||||||
if (Settings.PCM.BitsPerSample > 16)
|
if (Settings.PCM.BitsPerSample > 16)
|
||||||
lpc.encode_residual_long(task.frame.subframes[ch].best.residual, task.frame.subframes[ch].samples, task.frame.blocksize, task.frame.subframes[ch].best.order, coefs, task.frame.subframes[ch].best.shift);
|
{
|
||||||
|
if (!lpc.encode_residual_long(task.frame.subframes[ch].best.residual, task.frame.subframes[ch].samples, task.frame.blocksize, task.frame.subframes[ch].best.order, coefs, task.frame.subframes[ch].best.shift))
|
||||||
|
{
|
||||||
|
task.frame.subframes[ch].best.type = SubframeType.Verbatim;
|
||||||
|
task.frame.subframes[ch].best.size = (uint)(task.frame.subframes[ch].obits * task.frame.blocksize);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
lpc.encode_residual(task.frame.subframes[ch].best.residual, task.frame.subframes[ch].samples, task.frame.blocksize, task.frame.subframes[ch].best.order, coefs, task.frame.subframes[ch].best.shift);
|
lpc.encode_residual(task.frame.subframes[ch].best.residual, task.frame.subframes[ch].samples, task.frame.blocksize, task.frame.subframes[ch].best.order, coefs, task.frame.subframes[ch].best.shift);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1156,7 +1156,10 @@ new int[] { // 30
|
|||||||
fixed (int* coefs = frame.current.coefs)
|
fixed (int* coefs = frame.current.coefs)
|
||||||
{
|
{
|
||||||
if ((csum << frame.subframes[ch].obits) >= 1UL << 32)
|
if ((csum << frame.subframes[ch].obits) >= 1UL << 32)
|
||||||
lpc.encode_residual_long(frame.current.residual, frame.subframes[ch].samples, frame.blocksize, frame.current.order, coefs, frame.current.shift);
|
{
|
||||||
|
if (!lpc.encode_residual_long(frame.current.residual, frame.subframes[ch].samples, frame.blocksize, frame.current.order, coefs, frame.current.shift))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
lpc.encode_residual(frame.current.residual, frame.subframes[ch].samples, frame.blocksize, frame.current.order, coefs, frame.current.shift);
|
lpc.encode_residual(frame.current.residual, frame.subframes[ch].samples, frame.blocksize, frame.current.order, coefs, frame.current.shift);
|
||||||
}
|
}
|
||||||
@@ -1274,7 +1277,10 @@ new int[] { // 30
|
|||||||
csum += (ulong)Math.Abs(coefs[i - 1]);
|
csum += (ulong)Math.Abs(coefs[i - 1]);
|
||||||
|
|
||||||
if ((csum << frame.subframes[ch].obits) >= 1UL << 32)
|
if ((csum << frame.subframes[ch].obits) >= 1UL << 32)
|
||||||
lpc.encode_residual_long(frame.current.residual, frame.subframes[ch].samples, frame.blocksize, frame.current.order, coefs, frame.current.shift);
|
{
|
||||||
|
if (!lpc.encode_residual_long(frame.current.residual, frame.subframes[ch].samples, frame.blocksize, frame.current.order, coefs, frame.current.shift))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
lpc.encode_residual(frame.current.residual, frame.subframes[ch].samples, frame.blocksize, frame.current.order, coefs, frame.current.shift);
|
lpc.encode_residual(frame.current.residual, frame.subframes[ch].samples, frame.blocksize, frame.current.order, coefs, frame.current.shift);
|
||||||
|
|
||||||
@@ -2270,6 +2276,8 @@ new int[] { // 30
|
|||||||
|
|
||||||
if (verify != null)
|
if (verify != null)
|
||||||
{
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
int decoded = verify.DecodeFrame(frame_buffer, 0, fs);
|
int decoded = verify.DecodeFrame(frame_buffer, 0, fs);
|
||||||
if (decoded != fs || verify.Remaining != bs)
|
if (decoded != fs || verify.Remaining != bs)
|
||||||
throw new Exception(Properties.Resources.ExceptionValidationFailed);
|
throw new Exception(Properties.Resources.ExceptionValidationFailed);
|
||||||
@@ -2280,6 +2288,22 @@ new int[] { // 30
|
|||||||
throw new Exception(Properties.Resources.ExceptionValidationFailed);
|
throw new Exception(Properties.Resources.ExceptionValidationFailed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
//if (channels == 2)
|
||||||
|
//{
|
||||||
|
// var sw = new WAVWriter("verify.wav", new WAVWriterSettings(this.Settings.PCM));
|
||||||
|
// sw.FinalSampleCount = this.frame.blocksize;
|
||||||
|
// var ab = new AudioBuffer(this.Settings.PCM, this.frame.blocksize);
|
||||||
|
// ab.Prepare(this.frame.blocksize);
|
||||||
|
// fixed (int* abs = ab.Samples, s = verifyBuffer)
|
||||||
|
// AudioSamples.Interlace(abs, s, s + Flake.MAX_BLOCKSIZE, this.frame.blocksize);
|
||||||
|
// sw.Write(ab);
|
||||||
|
// sw.Close();
|
||||||
|
//}
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (bs < m_blockSize)
|
if (bs < m_blockSize)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -693,7 +693,7 @@ namespace CUETools.Codecs
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static unsafe void
|
public static unsafe bool
|
||||||
encode_residual_long(int* res, int* smp, int n, int order,
|
encode_residual_long(int* res, int* smp, int n, int order,
|
||||||
int* coefs, int shift)
|
int* coefs, int shift)
|
||||||
{
|
{
|
||||||
@@ -704,13 +704,16 @@ namespace CUETools.Codecs
|
|||||||
int* r = res + order;
|
int* r = res + order;
|
||||||
int c0 = coefs[0];
|
int c0 = coefs[0];
|
||||||
int c1 = coefs[1];
|
int c1 = coefs[1];
|
||||||
|
long overflows = 0L;
|
||||||
switch (order)
|
switch (order)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
for (int i = n - order; i > 0; i--)
|
for (int i = n - order; i > 0; i--)
|
||||||
{
|
{
|
||||||
long pred = c0 * (long)*(s++);
|
long pred = c0 * (long)*(s++);
|
||||||
*(r++) = *s - (int)(pred >> shift);
|
pred = *s - (pred >> shift);
|
||||||
|
overflows += (pred ^ (pred >> 63)) >> 30;
|
||||||
|
*(r++) = (int)pred;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
@@ -718,7 +721,9 @@ namespace CUETools.Codecs
|
|||||||
{
|
{
|
||||||
long pred = c1 * (long)*(s++);
|
long pred = c1 * (long)*(s++);
|
||||||
pred += c0 * (long)*(s++);
|
pred += c0 * (long)*(s++);
|
||||||
*(r++) = *(s--) - (int)(pred >> shift);
|
pred = *(s--) - (pred >> shift);
|
||||||
|
overflows += (pred ^ (pred >> 63)) >> 30;
|
||||||
|
*(r++) = (int)pred;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
@@ -727,7 +732,9 @@ namespace CUETools.Codecs
|
|||||||
long pred = coefs[2] * (long)*(s++);
|
long pred = coefs[2] * (long)*(s++);
|
||||||
pred += c1 * (long)*(s++);
|
pred += c1 * (long)*(s++);
|
||||||
pred += c0 * (long)*(s++);
|
pred += c0 * (long)*(s++);
|
||||||
*(r++) = *s - (int)(pred >> shift);
|
pred = *s - (pred >> shift);
|
||||||
|
overflows += (pred ^ (pred >> 63)) >> 30;
|
||||||
|
*(r++) = (int)pred;
|
||||||
s -= 2;
|
s -= 2;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -738,7 +745,9 @@ namespace CUETools.Codecs
|
|||||||
pred += coefs[2] * (long)*(s++);
|
pred += coefs[2] * (long)*(s++);
|
||||||
pred += c1 * (long)*(s++);
|
pred += c1 * (long)*(s++);
|
||||||
pred += c0 * (long)*(s++);
|
pred += c0 * (long)*(s++);
|
||||||
*(r++) = *s - (int)(pred >> shift);
|
pred = *s - (pred >> shift);
|
||||||
|
overflows += (pred ^ (pred >> 63)) >> 30;
|
||||||
|
*(r++) = (int)pred;
|
||||||
s -= 3;
|
s -= 3;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -750,7 +759,9 @@ namespace CUETools.Codecs
|
|||||||
pred += coefs[2] * (long)*(s++);
|
pred += coefs[2] * (long)*(s++);
|
||||||
pred += c1 * (long)*(s++);
|
pred += c1 * (long)*(s++);
|
||||||
pred += c0 * (long)*(s++);
|
pred += c0 * (long)*(s++);
|
||||||
*(r++) = *s - (int)(pred >> shift);
|
pred = *s - (pred >> shift);
|
||||||
|
overflows += (pred ^ (pred >> 63)) >> 30;
|
||||||
|
*(r++) = (int)pred;
|
||||||
s -= 4;
|
s -= 4;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -763,7 +774,9 @@ namespace CUETools.Codecs
|
|||||||
pred += coefs[2] * (long)*(s++);
|
pred += coefs[2] * (long)*(s++);
|
||||||
pred += c1 * (long)*(s++);
|
pred += c1 * (long)*(s++);
|
||||||
pred += c0 * (long)*(s++);
|
pred += c0 * (long)*(s++);
|
||||||
*(r++) = *s - (int)(pred >> shift);
|
pred = *s - (pred >> shift);
|
||||||
|
overflows += (pred ^ (pred >> 63)) >> 30;
|
||||||
|
*(r++) = (int)pred;
|
||||||
s -= 5;
|
s -= 5;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -777,7 +790,9 @@ namespace CUETools.Codecs
|
|||||||
pred += coefs[2] * (long)*(s++);
|
pred += coefs[2] * (long)*(s++);
|
||||||
pred += c1 * (long)*(s++);
|
pred += c1 * (long)*(s++);
|
||||||
pred += c0 * (long)*(s++);
|
pred += c0 * (long)*(s++);
|
||||||
*(r++) = *s - (int)(pred >> shift);
|
pred = *s - (pred >> shift);
|
||||||
|
overflows += (pred ^ (pred >> 63)) >> 30;
|
||||||
|
*(r++) = (int)pred;
|
||||||
s -= 6;
|
s -= 6;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -792,7 +807,9 @@ namespace CUETools.Codecs
|
|||||||
pred += coefs[2] * (long)*(s++);
|
pred += coefs[2] * (long)*(s++);
|
||||||
pred += c1 * (long)*(s++);
|
pred += c1 * (long)*(s++);
|
||||||
pred += c0 * (long)*(s++);
|
pred += c0 * (long)*(s++);
|
||||||
*(r++) = *s - (int)(pred >> shift);
|
pred = *s - (pred >> shift);
|
||||||
|
overflows += (pred ^ (pred >> 63)) >> 30;
|
||||||
|
*(r++) = (int)pred;
|
||||||
s -= 7;
|
s -= 7;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -813,10 +830,13 @@ namespace CUETools.Codecs
|
|||||||
pred += coefs[2] * (long)*(s++);
|
pred += coefs[2] * (long)*(s++);
|
||||||
pred += c1 * (long)*(s++);
|
pred += c1 * (long)*(s++);
|
||||||
pred += c0 * (long)*(s++);
|
pred += c0 * (long)*(s++);
|
||||||
*(r++) = *s - (int)(pred >> shift);
|
pred = *s - (pred >> shift);
|
||||||
|
overflows += (pred ^ (pred >> 63)) >> 30;
|
||||||
|
*(r++) = (int)pred;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return overflows == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static unsafe void
|
public static unsafe void
|
||||||
|
|||||||
Reference in New Issue
Block a user