public static void MyClassInitialize(TestContext testContext) { toc = new CDImageLayout(1, 1, 1, string.Format("0 {0}", (finalSampleCount / 588).ToString())); ar = new AccurateRipVerify(toc, null); ar2 = new AccurateRipVerify(toc, null); ar3 = new AccurateRipVerify(toc, null); new Random(2423).NextBytes(wav); new Random(2423).NextBytes(wav2); Random rnd = new Random(987); for (int i = 0; i < stride / 4; i++) { wav2[(int)(rnd.NextDouble() * (wav2.Length - 1))] = (byte)(rnd.NextDouble() * 255); } AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0); CDRepairEncode encode = new CDRepairEncode(ar, stride, npar, false, true); buff.Prepare(wav, finalSampleCount); ar.Init(toc); ar.Write(buff); ar.Close(); parity = encode.Parity; crc = encode.CRC; decode = new CDRepairEncode(ar2, stride, npar, true, false); buff.Prepare(wav2, finalSampleCount); ar2.Init(toc); ar2.Write(buff); ar2.Close(); int actualOffset; bool hasErrors; decode.FindOffset(npar, parity, 0, crc, out actualOffset, out hasErrors); fix = decode.VerifyParity(parity, actualOffset); decode2 = new CDRepairEncode(ar3, stride, npar, true, false); ar3.Init(toc); buff.Prepare(new byte[offset * 4], offset); ar3.Write(buff); buff.Prepare(wav2, finalSampleCount - offset); ar3.Write(buff); ar3.Close(); decode2.FindOffset(npar, parity, 0, crc, out actualOffset, out hasErrors); fix2 = decode2.VerifyParity(parity, actualOffset); }
public void CDRepairDecodeModifiedWithPregapTest() { var generator2 = new TestImageGenerator("32 9833", seed, offset, errors); var decode = generator2.CreateCDRepairEncode(stride); int actualOffset; bool hasErrors; Assert.IsTrue(decode.FindOffset(encode.AR.GetSyndrome(), encode.CRC, out actualOffset, out hasErrors)); Assert.IsTrue(hasErrors, "doesn't have errors"); Assert.AreEqual(offset, actualOffset, "wrong offset"); CDRepairFix fix = decode.VerifyParity(encode.AR.GetSyndrome(), encode.CRC, actualOffset); Assert.IsTrue(fix.HasErrors, "doesn't have errors"); Assert.IsTrue(fix.CanRecover, "cannot recover"); generator2.Write(fix); Assert.AreEqual <uint>(encode.CRC, fix.CRC); }
public void CDRepairVerifyParityLongTest() { var generator1 = new TestImageGenerator("0 655000", seed); var encode1 = generator1.CreateCDRepairEncode(stride); var generator2 = new TestImageGenerator("0 655000", seed, 0, stride / 2 * 3, 7); var decode = generator2.CreateCDRepairEncode(stride); int actualOffset; bool hasErrors; var syndrome = encode1.AR.GetSyndrome(); Assert.IsTrue(decode.FindOffset(syndrome, encode1.CRC, out actualOffset, out hasErrors)); Assert.IsTrue(hasErrors, "doesn't have errors"); Assert.AreEqual(0, actualOffset, "wrong offset"); CDRepairFix fix = decode.VerifyParity(syndrome, encode1.CRC, actualOffset); Assert.IsTrue(fix.HasErrors, "doesn't have errors"); Assert.IsTrue(fix.CanRecover, "cannot recover"); }
public void CDRepairDecodePositiveOffsetErrorsTest() { var generator2 = new TestImageGenerator("0 9801", seed, 32 * 588 + offset, errors); var decode = generator2.CreateCDRepairEncode(stride); int actualOffset; bool hasErrors; var syn = encode.AR.GetSyndrome(); Assert.IsTrue(decode.FindOffset(syn, encode.CRC, out actualOffset, out hasErrors)); Assert.IsTrue(hasErrors, "doesn't have errors"); Assert.AreEqual(offset, actualOffset, "wrong offset"); CDRepairFix fix = decode.VerifyParity(syn, encode.CRC, actualOffset); Assert.IsTrue(fix.HasErrors, "doesn't have errors"); Assert.IsTrue(fix.CanRecover, "cannot recover"); generator2.Write(fix); Assert.AreEqual <uint>(encode.CRC, fix.CRC); }
public void CDRepairVerifyParitySpeedTest() { var generator1 = new TestImageGenerator("0 98011", seed, 32 * 588); var encode1 = generator1.CreateCDRepairEncode(stride); var generator2 = new TestImageGenerator("0 98011", seed, 32 * 588, stride / 2 * 3, 7); //var generator2 = new TestImageGenerator("0 98011", seed, 32 * 588, stride, 7); var decode = generator2.CreateCDRepairEncode(stride); int actualOffset; bool hasErrors; var syndrome = encode1.AR.GetSyndrome(); Assert.IsTrue(decode.FindOffset(syndrome, encode1.CRC, out actualOffset, out hasErrors)); Assert.IsTrue(hasErrors, "doesn't have errors"); Assert.AreEqual(0, actualOffset, "wrong offset"); for (int t = 0; t < 100; t++) { decode.VerifyParity(syndrome, encode1.CRC, actualOffset); } CDRepairFix fix = decode.VerifyParity(syndrome, encode1.CRC, actualOffset); Assert.IsTrue(fix.HasErrors, "doesn't have errors"); Assert.IsTrue(fix.CanRecover, "cannot recover"); //generator2.Write(fix); //Assert.AreEqual<uint>(encode1.CRC, fix.CRC); //var encodeTable = Galois16.instance.makeEncodeTable(16); //using (StreamWriter sr = new StreamWriter(@"D:\Work\cuetoolsnet\CUETools\x64\Release\ddd")) //{ // for (int i = 0; i < encodeTable.GetLength(0) * encodeTable.GetLength(1) * encodeTable.GetLength(2); i++) // { // if ((i % 16) == 0) // sr.WriteLine(); // sr.Write(string.Format("0x{0:X4}, ", pte[i])); // } // sr.Close(); // throw new Exception("aa"); //} }
public unsafe CDRepairFix VerifyParity(int npar2, byte[] parity2, int pos, int len, int actualOffset) { if (len != stride * npar * 2) throw new Exception("wrong size"); CDRepairFix fix = new CDRepairFix(this); fix.actualOffset = actualOffset; fix.correctableErrors = 0; fix.hasErrors = false; fix.canRecover = true; fix.sigma = new int[stride, npar / 2 + 2]; fix.omega = new int[stride, npar / 2 + 1]; fix.errpos = new int[stride, npar / 2]; //fix.erroff = new int[stride, npar / 2]; fix.errors = new int[stride]; fixed (byte* par = &parity2[pos]) fixed (ushort* exp = galois.ExpTbl, log = galois.LogTbl) { int* syn = stackalloc int[npar]; int offset = fix.actualOffset; for (int part = 0; part < stride; part++) { int part2 = (part + offset * 2 + stride) % stride; ushort* wr = (ushort*)par + part2 * npar; int err = 0; for (int i = 0; i < npar; i++) { syn[i] = syndrome[part, i]; // offset < 0 if (part < -offset * 2) { syn[i] ^= galois.mulExp(leadin[stride + part], (i * (stridecount - 1)) % galois.Max); syn[i] = leadout[laststride - part - 1] ^ galois.mulExp(syn[i], i); } // offset > 0 if (part >= stride - offset * 2) { syn[i] = galois.divExp(syn[i] ^ leadout[laststride + stride - part - 1], i); syn[i] ^= galois.mulExp(leadin[part], (i * (stridecount - 1)) % galois.Max); } //syn[i] = galois.mulExp(syn[i], i * npar); for (int j = 0; j < npar; j++) syn[i] = wr[j] ^ galois.mulExp(syn[i], i); // wk = data + wk * α^i err |= syn[i]; } //for (int j = 0; j < npar; j++) // if (wr[j] != 0) // { // ushort* myexp = exp + log[wr[j]]; // syn[0] ^= wr[j]; // for (int i = 1; i < npar; i++) // syn[i] ^= myexp[(npar - j - 1) * i]; // } //for (int i = 0; i < npar; i++) // err |= syn[i]; if (err != 0) { fixed (int* s = &fix.sigma[part, 0], o = &fix.omega[part, 0], e = &fix.errpos[part, 0]) { fix.errors[part] = rs.calcSigmaMBM(s, syn); fix.hasErrors = true; fix.correctableErrors += fix.errors[part]; if (fix.errors[part] <= 0 || !rs.chienSearch(e, stridecount + npar, fix.errors[part], s)) fix.canRecover = false; else galois.mulPoly(o, s, syn, npar / 2 + 1, npar, npar); } } else fix.errors[part] = 0; } } return fix; }