Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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");
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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");
            //}
        }
Esempio n. 6
0
		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;
		}