BDLPCM code cleanup

This commit is contained in:
Grigory Chudov
2018-02-11 14:08:36 -05:00
parent 005cc257d7
commit 3bbabf807b

View File

@@ -111,16 +111,15 @@ namespace CUETools.Codecs.BDLPCM
{ {
buff.Prepare(this, maxLength); buff.Prepare(this, maxLength);
int sampleCount; int sampleCount;
fixed (byte* dest = &buff.Bytes[0]) fixed (int* dest = &buff.Samples[0,0])
sampleCount = demux_ts_packets(dest, buff.Length); sampleCount = demux_ts_packets(dest, buff.Length);
buff.Length = sampleCount; buff.Length = sampleCount;
_samplePos += sampleCount; _samplePos += sampleCount;
return sampleCount; return sampleCount;
} }
unsafe int demux_ts_packets(byte* dest, int maxSamples) unsafe int demux_ts_packets(int* dest, int maxSamples)
{ {
int byteOffset = 0;
int samplesOffset = 0; int samplesOffset = 0;
while (true) while (true)
{ {
@@ -132,12 +131,12 @@ namespace CUETools.Codecs.BDLPCM
int chunkSamples = Math.Min(samplesInBuffer, maxSamples - samplesOffset); int chunkSamples = Math.Min(samplesInBuffer, maxSamples - samplesOffset);
int chunkLen = chunkSamples * chosenStream.pcm.BlockAlign; int chunkLen = chunkSamples * chosenStream.pcm.BlockAlign;
fixed (byte* psrc_start = &chosenStream.savedBuffer[0]) fixed (byte* psrc_start = &chosenStream.savedBuffer[0])
remux( BDBytesToFLACSamples(
dest + byteOffset, dest,
psrc_start + chosenStream.savedBufferOffset, psrc_start + chosenStream.savedBufferOffset,
chunkSamples, chosenStream.pcm); chunkSamples, chosenStream.pcm);
byteOffset += chunkLen;
samplesOffset += chunkSamples; samplesOffset += chunkSamples;
dest += chunkSamples * chosenStream.pcm.ChannelCount;
chosenStream.savedBufferOffset += chunkLen; chosenStream.savedBufferOffset += chunkLen;
chosenStream.savedBufferSize -= chunkLen; chosenStream.savedBufferSize -= chunkLen;
} }
@@ -180,9 +179,9 @@ namespace CUETools.Codecs.BDLPCM
if (chosenStream.savedBufferSize == blockLen) if (chosenStream.savedBufferSize == blockLen)
{ {
fixed (byte* psrc = &s.savedBuffer[s.savedBufferOffset]) fixed (byte* psrc = &s.savedBuffer[s.savedBufferOffset])
remux(dest + byteOffset, psrc, 1, s.pcm); BDBytesToFLACSamples(dest, psrc, 1, s.pcm);
byteOffset += blockLen;
samplesOffset += 1; samplesOffset += 1;
dest += chosenStream.pcm.ChannelCount;
chosenStream.savedBufferOffset = 0; chosenStream.savedBufferOffset = 0;
chosenStream.savedBufferSize = 0; chosenStream.savedBufferSize = 0;
} }
@@ -203,24 +202,67 @@ namespace CUETools.Codecs.BDLPCM
return samplesOffset; return samplesOffset;
} }
unsafe static void remux(byte* pdest, byte* psrc, int samples, AudioPCMConfig pcm) unsafe static void BDBytesToFLACSamples_24bit_6ch(int* pdest, byte* psrc, int samples, int wastedBits)
{ {
if (pcm.BitsPerSample == 24) for (int i = 0; i < samples; i++)
{ {
for (int i = 0; i < samples * pcm.ChannelCount; i++) // front left
*(pdest++) = ((((((int)*(psrc++) << 8) + (int)*(psrc++)) << 8) + (int)*(psrc++)) << 8) >> (8 + wastedBits);
// front right
*(pdest++) = ((((((int)*(psrc++) << 8) + (int)*(psrc++)) << 8) + (int)*(psrc++)) << 8) >> (8 + wastedBits);
// front center
*(pdest++) = ((((((int)*(psrc++) << 8) + (int)*(psrc++)) << 8) + (int)*(psrc++)) << 8) >> (8 + wastedBits);
// surround left
pdest[1] = ((((((int)*(psrc++) << 8) + (int)*(psrc++)) << 8) + (int)*(psrc++)) << 8) >> (8 + wastedBits);
// surround right
pdest[2] = ((((((int)*(psrc++) << 8) + (int)*(psrc++)) << 8) + (int)*(psrc++)) << 8) >> (8 + wastedBits);
// LFE
pdest[0] = ((((((int)*(psrc++) << 8) + (int)*(psrc++)) << 8) + (int)*(psrc++)) << 8) >> (8 + wastedBits);
pdest += 3;
}
}
unsafe static void BDBytesToFLACSamples_24bit_noremap(int* pdest, byte* psrc, int samples, int channels, int wastedBits)
{ {
byte p0 = *(psrc++); for (int i = 0; i < samples * channels; i++)
byte p1 = *(psrc++); {
byte p2 = *(psrc++); *(pdest++) = ((((((int)*(psrc++) << 8) + (int)*(psrc++)) << 8) + (int)*(psrc++)) << 8) >> (8 + wastedBits);
*(pdest++) = p2;
*(pdest++) = p1;
*(pdest++) = p0;
} }
// if (0 != (pcm.ChannelCount & 1)) channels are padded with one extra unused channel! is it the same for wav? // if (0 != (pcm.ChannelCount & 1)) channels are padded with one extra unused channel! is it the same for wav?
} }
else
unsafe static void BDBytesToFLACSamples_24bit(int* pdest, byte* psrc, int samples, int channels, int wastedBits)
{
switch (channels)
{
case 2:
BDBytesToFLACSamples_24bit_noremap(pdest, psrc, samples, channels, wastedBits);
break;
case 4:
BDBytesToFLACSamples_24bit_noremap(pdest, psrc, samples, channels, wastedBits);
break;
case 6:
BDBytesToFLACSamples_24bit_6ch(pdest, psrc, samples, wastedBits);
break;
default:
throw new NotSupportedException(); throw new NotSupportedException();
} }
}
unsafe static void BDBytesToFLACSamples(int* pdest, byte* psrc, int samples, AudioPCMConfig pcm)
{
switch (pcm.BitsPerSample)
{
case 24:
BDBytesToFLACSamples_24bit(pdest, psrc, samples, pcm.ChannelCount, 0);
break;
case 20:
BDBytesToFLACSamples_24bit(pdest, psrc, samples, pcm.ChannelCount, 4);
break;
default:
throw new NotSupportedException();
}
}
unsafe void process_psi_pat(TsStream s, FrameReader fr) unsafe void process_psi_pat(TsStream s, FrameReader fr)
{ {
@@ -401,91 +443,56 @@ namespace CUETools.Codecs.BDLPCM
int pi_channels_padding; int pi_channels_padding;
int pi_bits; int pi_bits;
int pi_rate; int pi_rate;
//uint[] pi_channels_in;
//static const uint32_t pi_8channels_in[] =
//{ AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, AOUT_CHAN_CENTER,
// AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT,
// AOUT_CHAN_MIDDLERIGHT, AOUT_CHAN_LFE, 0 };
//static const uint32_t pi_7channels_in[] =
//{ AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, AOUT_CHAN_CENTER,
// AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT,
// AOUT_CHAN_MIDDLERIGHT, 0 };
//static const uint32_t pi_6channels_in[] =
//{ AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, AOUT_CHAN_CENTER,
// AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT, AOUT_CHAN_LFE, 0 };
//static const uint32_t pi_5channels_in[] =
//{ AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, AOUT_CHAN_CENTER,
// AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT, 0 };
//static const uint32_t pi_4channels_in[] =
//{ AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT,
// AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT, 0 };
//static const uint32_t pi_3channels_in[] =
//{ AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT,
// AOUT_CHAN_CENTER, 0 };
switch( ( h & 0xf000) >> 12 ) switch( ( h & 0xf000) >> 12 )
{ {
case 1: case 1:
pi_channels = 1; pi_channels = 1;
//pi_original_channels = AOUT_CHAN_CENTER;
break; break;
case 3: case 3:
pi_channels = 2; pi_channels = 2;
//pi_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
break; break;
case 4: case 4:
pi_channels = 3; pi_channels = 3;
//pi_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER; //{ AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT,
//pi_channels_in = pi_3channels_in; // AOUT_CHAN_CENTER, 0 };
break; break;
case 5: case 5:
pi_channels = 3; pi_channels = 3;
//pi_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARCENTER; //{ AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT,
// AOUT_CHAN_REARCENTER, 0 };
break; break;
case 6: case 6:
pi_channels = 4; pi_channels = 4;
//pi_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER | //{ AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT,
// AOUT_CHAN_REARCENTER; // AOUT_CHAN_CENTER, AOUT_CHAN_REARCENTER, 0 };
break; break;
case 7: case 7:
pi_channels = 4; pi_channels = 4;
//pi_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | //{ AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT,
// AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT; // AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT, 0 };
//pi_channels_in = pi_4channels_in;
break; break;
case 8: case 8:
pi_channels = 5; pi_channels = 5;
//pi_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER | //{ AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, AOUT_CHAN_CENTER,
// AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT; // AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT, 0 };
//pi_channels_in = pi_5channels_in;
break; break;
case 9: case 9:
pi_channels = 6; pi_channels = 6;
//pi_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER | //{ AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, AOUT_CHAN_CENTER,
// AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT | // AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT, AOUT_CHAN_LFE, 0 };
// AOUT_CHAN_LFE;
//pi_channels_in = pi_6channels_in;
break; break;
case 10: case 10:
pi_channels = 7; pi_channels = 7;
//*pi_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER | //{ AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, AOUT_CHAN_CENTER,
// AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT | // AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT,
// AOUT_CHAN_MIDDLELEFT | AOUT_CHAN_MIDDLERIGHT; // AOUT_CHAN_MIDDLERIGHT, 0 };
//pi_channels_in = pi_7channels_in;
break; break;
case 11: case 11:
pi_channels = 8; pi_channels = 8;
//pi_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER | //{ AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, AOUT_CHAN_CENTER,
// AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT | // AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT,
// AOUT_CHAN_MIDDLELEFT | AOUT_CHAN_MIDDLERIGHT | // AOUT_CHAN_MIDDLERIGHT, AOUT_CHAN_LFE, 0 };
// AOUT_CHAN_LFE;
//pi_channels_in = pi_8channels_in;
break; break;
default: default:
@@ -498,8 +505,10 @@ namespace CUETools.Codecs.BDLPCM
case 1: case 1:
pi_bits = 16; pi_bits = 16;
break; break;
case 2: /* 20 bits but samples are stored on 24 bits */ case 2:
case 3: /* 24 bits */ pi_bits = 20;
break;
case 3:
pi_bits = 24; pi_bits = 24;
break; break;
default: default:
@@ -523,14 +532,6 @@ namespace CUETools.Codecs.BDLPCM
if (s.pcm == null) if (s.pcm == null)
s.pcm = new AudioPCMConfig(pi_bits, pi_channels, pi_rate); s.pcm = new AudioPCMConfig(pi_bits, pi_channels, pi_rate);
//if( pi_channels_in )
//{
// p_sys->i_chans_to_reorder =
// aout_CheckChannelReorder( pi_channels_in, NULL,
// *pi_original_channels,
// p_sys->pi_chan_table );
//}
} }
unsafe void demux_ts_packet(FrameReader fr, out TsStream dataStream) unsafe void demux_ts_packet(FrameReader fr, out TsStream dataStream)