Optimizing AccurateRip

This commit is contained in:
chudov
2010-02-10 04:53:03 +00:00
parent 7b6803d0f9
commit d1dac45a10

View File

@@ -103,70 +103,36 @@ namespace CUETools.AccurateRip
public uint CRC(int iTrack, int oi) public uint CRC(int iTrack, int oi)
{ {
if (oi == 0) int offs0 = iTrack == 0 ? 5 * 588 + oi - 1 : oi;
int offs1 = iTrack == _toc.AudioTracks - 1 ? 20 * 588 - 5 * 588 + oi : (oi >= 0 ? 0 : 20 * 588 + oi);
uint crcA = _CRCAR[iTrack + 1, offs1] - (offs0 > 0 ? _CRCAR[iTrack + 1, offs0] : 0);
uint sumA = _CRCSM[iTrack + 1, offs1] - (offs0 > 0 ? _CRCSM[iTrack + 1, offs0] : 0);
uint crc = crcA - sumA * (uint)oi;
if (oi < 0 && iTrack > 0)
{ {
return uint crcB = _CRCAR[iTrack, 0] - _CRCAR[iTrack, 20 * 588 + oi];
((iTrack == _toc.AudioTracks - 1) uint sumB = _CRCSM[iTrack, 0] - _CRCSM[iTrack, 20 * 588 + oi];
? _CRCAR[iTrack + 1, 20 * 588 - 5 * 588] uint posB = _toc[iTrack + _toc.FirstAudio - 1].Length * 588 + (uint)oi;
: _CRCAR[iTrack + 1, 0]) - crc += crcB - sumB * posB;
((iTrack == 0)
? _CRCAR[iTrack + 1, 5 * 588 - 1]
: 0);
} }
if (oi < 0) if (oi > 0 && iTrack < _toc.AudioTracks - 1)
{ {
uint crc = 0; uint crcB = _CRCAR[iTrack + 2, oi];
if (iTrack > 0) uint sumB = _CRCSM[iTrack + 2, oi];
{ uint posB = _toc[iTrack + _toc.FirstAudio].Length * 588 + (uint)-oi;
uint crcA = _CRCAR[iTrack, 0] - _CRCAR[iTrack, 20 * 588 + oi]; crc += crcB + sumB * posB;
uint sumA = _CRCSM[iTrack, 0] - _CRCSM[iTrack, 20 * 588 + oi];
uint posA = _toc[iTrack + _toc.FirstAudio - 1].Length * 588 + (uint)oi;
crc = crcA - sumA * posA;
}
uint crcB
= ((iTrack == _toc.AudioTracks - 1)
? _CRCAR[iTrack + 1, 20 * 588 - 5 * 588 + oi]
: _CRCAR[iTrack + 1, 20 * 588 + oi])
- ((iTrack == 0)
? _CRCAR[iTrack + 1, 5 * 588 - 1 + oi]
: 0);
uint sumB
= ((iTrack == _toc.AudioTracks - 1)
? _CRCSM[iTrack + 1, 20 * 588 - 5 * 588 + oi]
: _CRCSM[iTrack + 1, 20 * 588 + oi])
- ((iTrack == 0)
? _CRCSM[iTrack + 1, 5 * 588 - 1 + oi]
: 0);
uint posB = (uint)-oi;
return crc + crcB + sumB * posB;
}
else
{
uint crcA
= ((iTrack == _toc.AudioTracks - 1)
? _CRCAR[iTrack + 1, 20 * 588 - 5 * 588 + oi]
: _CRCAR[iTrack + 1, 0])
- ((iTrack == 0)
? _CRCAR[iTrack + 1, 5 * 588 + oi - 1]
: _CRCAR[iTrack + 1, oi]);
uint sumA
= ((iTrack == _toc.AudioTracks - 1)
? _CRCSM[iTrack + 1, 20 * 588 - 5 * 588 + oi]
: _CRCSM[iTrack + 1, 0])
- ((iTrack == 0)
? _CRCSM[iTrack + 1, 5 * 588 + oi - 1]
: _CRCSM[iTrack + 1, oi]);
uint posA = (uint)oi;
uint crc = crcA - sumA * posA;
if (iTrack < _toc.AudioTracks - 1)
{
uint crcB = _CRCAR[iTrack + 2, oi];
uint sumB = _CRCSM[iTrack + 2, oi];
uint posB = _toc[iTrack + _toc.FirstAudio].Length * 588 + (uint)-oi;
crc += crcB + sumB * posB;
}
return crc;
} }
return crc;
}
public uint CRC450(int iTrack, int oi)
{
uint crca = _CRCAR[iTrack + 1, 20 * 588 + 5 * 588 + oi];
uint crcb = _CRCAR[iTrack + 1, 20 * 588 + 6 * 588 + oi];
uint suma = _CRCSM[iTrack + 1, 20 * 588 + 5 * 588 + oi];
uint sumb = _CRCSM[iTrack + 1, 20 * 588 + 6 * 588 + oi];
uint offs = 450 * 588 + (uint)oi;
return crcb - crca - offs * (sumb - suma);
} }
public uint CRC32(int iTrack) public uint CRC32(int iTrack)
@@ -321,16 +287,6 @@ namespace CUETools.AccurateRip
_CRCLOG[iTrack] = value; _CRCLOG[iTrack] = value;
} }
public uint CRC450(int iTrack, int oi)
{
uint crca = _CRCAR[iTrack + 1, 20 * 588 + 5 * 588 + oi];
uint crcb = _CRCAR[iTrack + 1, 20 * 588 + 6 * 588 + oi];
uint suma = _CRCSM[iTrack + 1, 20 * 588 + 5 * 588 + oi];
uint sumb = _CRCSM[iTrack + 1, 20 * 588 + 6 * 588 + oi];
uint offs = 450 * 588 + (uint)oi;
return crcb - crca - offs * (sumb - suma);
}
/// <summary> /// <summary>
/// This function calculates three different CRCs and also /// This function calculates three different CRCs and also
/// collects some additional information for the purposes of /// collects some additional information for the purposes of
@@ -340,7 +296,7 @@ namespace CUETools.AccurateRip
/// crc32 is CRC32 /// crc32 is CRC32
/// crcwn is CRC32 without null samples (EAC) /// crcwn is CRC32 without null samples (EAC)
/// crcsm is sum of samples /// crcsm is sum of samples
/// crcnulls is a count of null samples /// crcnl is a count of null samples
/// </summary> /// </summary>
/// <param name="pSampleBuff"></param> /// <param name="pSampleBuff"></param>
/// <param name="count"></param> /// <param name="count"></param>
@@ -352,7 +308,7 @@ namespace CUETools.AccurateRip
uint crcsm = _CRCSM[_currentTrack, 0]; uint crcsm = _CRCSM[_currentTrack, 0];
uint crc32 = _CRC32[_currentTrack, 0]; uint crc32 = _CRC32[_currentTrack, 0];
uint crcwn = _CRCWN[_currentTrack, 0]; uint crcwn = _CRCWN[_currentTrack, 0];
int crcnulls = _CRCNL[_currentTrack, 0]; int crcnl = _CRCNL[_currentTrack, 0];
fixed (uint* t = _crc32.table) fixed (uint* t = _crc32.table)
{ {
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
@@ -363,7 +319,7 @@ namespace CUETools.AccurateRip
_CRCSM[_currentTrack, offs + i] = crcsm; _CRCSM[_currentTrack, offs + i] = crcsm;
_CRC32[_currentTrack, offs + i] = crc32; _CRC32[_currentTrack, offs + i] = crc32;
_CRCWN[_currentTrack, offs + i] = crcwn; _CRCWN[_currentTrack, offs + i] = crcwn;
_CRCNL[_currentTrack, offs + i] = crcnulls; _CRCNL[_currentTrack, offs + i] = crcnl;
} }
uint lo = (uint)*(pSampleBuff++); uint lo = (uint)*(pSampleBuff++);
@@ -374,7 +330,7 @@ namespace CUETools.AccurateRip
crcwn = (crcwn >> 8) ^ t[(byte)(crcwn ^ lo)]; crcwn = (crcwn >> 8) ^ t[(byte)(crcwn ^ lo)];
crcwn = (crcwn >> 8) ^ t[(byte)(crcwn ^ (lo >> 8))]; crcwn = (crcwn >> 8) ^ t[(byte)(crcwn ^ (lo >> 8))];
} }
else crcnulls++; else crcnl++;
uint hi = (uint)*(pSampleBuff++); uint hi = (uint)*(pSampleBuff++);
crc32 = (crc32 >> 8) ^ t[(byte)(crc32 ^ hi)]; crc32 = (crc32 >> 8) ^ t[(byte)(crc32 ^ hi)];
@@ -384,7 +340,7 @@ namespace CUETools.AccurateRip
crcwn = (crcwn >> 8) ^ t[(byte)(crcwn ^ hi)]; crcwn = (crcwn >> 8) ^ t[(byte)(crcwn ^ hi)];
crcwn = (crcwn >> 8) ^ t[(byte)(crcwn ^ (hi >> 8))]; crcwn = (crcwn >> 8) ^ t[(byte)(crcwn ^ (hi >> 8))];
} }
else crcnulls++; else crcnl++;
uint sampleValue = (lo & 0xffff) + (hi << 16); uint sampleValue = (lo & 0xffff) + (hi << 16);
crcsm += sampleValue; crcsm += sampleValue;
@@ -396,7 +352,7 @@ namespace CUETools.AccurateRip
_CRCSM[_currentTrack, 0] = crcsm; _CRCSM[_currentTrack, 0] = crcsm;
_CRC32[_currentTrack, 0] = crc32; _CRC32[_currentTrack, 0] = crc32;
_CRCWN[_currentTrack, 0] = crcwn; _CRCWN[_currentTrack, 0] = crcwn;
_CRCNL[_currentTrack, 0] = crcnulls; _CRCNL[_currentTrack, 0] = crcnl;
} }
public void Write(AudioBuffer sampleBuffer) public void Write(AudioBuffer sampleBuffer)