mirror of
https://github.com/claunia/cuetools.net.git
synced 2025-12-16 18:14:25 +00:00
CUERipper revamp
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.IO;
|
||||
using System.Collections.Generic;
|
||||
using CUETools.Codecs;
|
||||
using CUETools.Ripper;
|
||||
@@ -36,19 +37,17 @@ namespace TestRipper
|
||||
}
|
||||
}
|
||||
|
||||
const int pass = 16;
|
||||
const int Sectors2Read = 10000;
|
||||
const int bit_weight = 3;
|
||||
const int c2_weight = 1;
|
||||
const int max_pass = 64;
|
||||
const int Sectors2Read = 2400;
|
||||
|
||||
bool markErrors = true;
|
||||
int _currentStart = 0, _realErrors = 0;
|
||||
byte[] _currentData = new byte[Sectors2Read * 4 * 588];
|
||||
|
||||
static long[,] UserData = new long[Sectors2Read, 4 * 588];
|
||||
static long[,] C2Data = new long[Sectors2Read, 4 * 588 / 8];
|
||||
static ulong[,,] UserData = new ulong[Sectors2Read, 2, 4 * 588];
|
||||
static byte[,] C2Count = new byte[Sectors2Read, 4 * 588];
|
||||
static byte[] _realData = new byte[Sectors2Read * 4 * 588];
|
||||
static long[] byte2long = new long[256];
|
||||
static ulong[] byte2long = new ulong[256];
|
||||
|
||||
#region Additional test attributes
|
||||
//
|
||||
@@ -58,30 +57,58 @@ namespace TestRipper
|
||||
[ClassInitialize()]
|
||||
public static void MyClassInitialize(TestContext testContext)
|
||||
{
|
||||
for (long i = 0; i < 256; i++)
|
||||
for (ulong i = 0; i < 256; i++)
|
||||
{
|
||||
long bl = 0;
|
||||
ulong bl = 0;
|
||||
for (int b = 0; b < 8; b++)
|
||||
bl += ((i >> b) & 1) << (b << 3);
|
||||
byte2long[i] = bl;
|
||||
}
|
||||
|
||||
Random rnd = new Random(2314);
|
||||
rnd.NextBytes(_realData);
|
||||
//Random rnd = new Random(2314);
|
||||
//rnd.NextBytes(_realData);
|
||||
|
||||
for (int p = 0; p <= pass; p++)
|
||||
for (int iSector = 0; iSector < Sectors2Read; iSector++)
|
||||
for (int iPar = 0; iPar < 4 * 588; iPar++)
|
||||
byte [] c2data = new byte[Sectors2Read * 296];
|
||||
for (int p = 0; p < max_pass; p++)
|
||||
{
|
||||
// string nm_d = string.Format("Y:\\Temp\\dbg\\{0:x}-{1:00}.bin", _currentStart, dbg_pass);
|
||||
using (FileStream fs = new FileStream(string.Format("Y:\\Temp\\dbg\\960\\960-{0:00}.bin", p), FileMode.Open))
|
||||
using (FileStream fs2 = new FileStream(string.Format("Y:\\Temp\\dbg\\960\\960-{0:00}.c2", p), FileMode.Open))
|
||||
{
|
||||
fs.Read(_realData, 0, Sectors2Read * 4 * 588);
|
||||
fs2.Read(c2data, 0, Sectors2Read * 296);
|
||||
for (int iSector = 0; iSector < Sectors2Read; iSector++)
|
||||
{
|
||||
bool error = rnd.NextDouble() < 0.2;
|
||||
byte val = error ? (byte)rnd.Next(255) : _realData[iSector * 4 * 588 + iPar];
|
||||
UserData[iSector, iPar] += byte2long[val] * bit_weight;
|
||||
if (error && rnd.NextDouble() < 0.5)
|
||||
for (int pos = 0; pos < 294; pos++)
|
||||
{
|
||||
C2Data[iSector, iPar >> 3] += (iPar & 7) * 8;
|
||||
UserData[iSector, iPar] += 0x0101010101010101 * (bit_weight / 2) + byte2long[val] * (c2_weight - bit_weight);
|
||||
int c2d = c2data[iSector * 296 + pos];
|
||||
for (int sample = (pos << 3); sample < (pos << 3) + 8; sample++)
|
||||
{
|
||||
//int c2 = (c2d >> (7 - (sample & 7))) & 1;
|
||||
//int c2 = (c2d >> ((sample & 7))) & 1;
|
||||
//int c2 = ((c2d >> ((sample & 7))) | (c2d >> (7 - (sample & 7)))) & 1;
|
||||
int c2 = ((-c2d) >> 31) & 1;
|
||||
C2Count[iSector, sample] += (byte)c2;
|
||||
UserData[iSector, c2, sample] += byte2long[_realData[iSector * 4 * 588 + sample]];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//for (int iSector = 0; iSector < Sectors2Read; iSector++)
|
||||
// for (int iPar = 0; iPar < 4 * 588; iPar++)
|
||||
// {
|
||||
// bool error = rnd.NextDouble() < 0.2;
|
||||
// byte val = error ? (byte)rnd.Next(255) : _realData[iSector * 4 * 588 + iPar];
|
||||
// UserData[iSector, iPar] += byte2long[val] * bit_weight;
|
||||
// if (error && rnd.NextDouble() < 0.5)
|
||||
// {
|
||||
// C2Data[iSector, iPar >> 3] += (iPar & 7) * 8;
|
||||
// UserData[iSector, iPar] += 0x0101010101010101 * (bit_weight / 2) + byte2long[val] * (c2_weight - bit_weight);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
using (FileStream fs = new FileStream(string.Format("Y:\\Temp\\dbg\\960\\960.bin", 0), FileMode.Open))
|
||||
fs.Read(_realData, 0, Sectors2Read * 4 * 588);
|
||||
}
|
||||
//
|
||||
//Use ClassCleanup to run code after all tests in a class have run
|
||||
@@ -114,36 +141,39 @@ namespace TestRipper
|
||||
{
|
||||
int _currentErrorsCount = 0;
|
||||
int sector = 0;
|
||||
|
||||
_realErrors = 0;
|
||||
const byte c2div = 128;
|
||||
const int er_limit = c2div * 3;
|
||||
int fErrCnt = 0;
|
||||
for (int iSector = 0; iSector < Sectors2Read; iSector++)
|
||||
{
|
||||
int pos = sector - _currentStart + iSector;
|
||||
int avg = (pass + 1) * bit_weight / 2;
|
||||
int c2_limit = pass / 3; //
|
||||
int er_limit = avg - pass; // allow 33% minority
|
||||
for (int iPar = 0; iPar < 4 * 588; iPar++)
|
||||
{
|
||||
long val = UserData[pos, iPar];
|
||||
byte c2 = (byte)(C2Data[pos, iPar >> 3] >> ((iPar & 7) * 8));
|
||||
ulong val = UserData[pos, 0, iPar];
|
||||
ulong val1 = 0;// UserData[pos, 1, iPar];
|
||||
byte c2 = C2Count[pos, iPar];
|
||||
int ave = (max_pass - c2) * c2div + c2;
|
||||
int bestValue = 0;
|
||||
bool fError = false;
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
int sum = avg - ((int)(val & 0xff));
|
||||
int sig = sum >> 31; // bit value
|
||||
if ((sum ^ sig) < er_limit) _currentErrorsCount++;
|
||||
int sum = ave - 2 * (int)((val & 0xff) * c2div + (val1 & 0xff));
|
||||
int sig = sum >> 31;
|
||||
fError |= (sum ^ sig) < er_limit;
|
||||
bestValue += sig & (1 << i);
|
||||
val >>= 8;
|
||||
}
|
||||
if (fError)
|
||||
fErrCnt++;
|
||||
//if (c2 > c2_limit)
|
||||
//_currentErrorsCount++;
|
||||
_currentData[pos * 4 * 588 + iPar] = (byte)bestValue;
|
||||
if (_realData[iSector * 4 * 588 + iPar] != bestValue)
|
||||
_realErrors++;
|
||||
}
|
||||
}
|
||||
for (int p = 0; p <= pass; p++)
|
||||
for (int iSector = 0; iSector < Sectors2Read; iSector++)
|
||||
for (int iPar = 0; iPar < 4 * 588; iPar++)
|
||||
if (_realData[iSector * 4 * 588 + iPar] != _currentData[iSector * 4 * 588 + iPar])
|
||||
_realErrors++;
|
||||
//Assert.AreEqual<int>(0, fErrCnt);
|
||||
Assert.AreEqual<int>(0, _realErrors, "0 != _realErrors; _currentErrorsCount == " + _currentErrorsCount.ToString());
|
||||
//CollectionAssert.AreEqual(_realData, _currentData, "_realData != _currentData");
|
||||
Assert.AreEqual<int>(0, _currentErrorsCount, "_currentErrorsCount != 0");
|
||||
|
||||
Reference in New Issue
Block a user