public SampleRow(byte[] row, int columnCount, byte bitsPerComponent, byte componentsPerSample)
{
if (row == null)
throw new ArgumentNullException("row");
if (row.Length == 0)
throw new ArgumentException("row is empty");
if (columnCount <= 0)
throw new ArgumentOutOfRangeException("sampleCount");
if (bitsPerComponent <= 0 || bitsPerComponent > 16)
throw new ArgumentOutOfRangeException("bitsPerComponent");
if (componentsPerSample <= 0 || componentsPerSample > 5) //1,2,3,4
throw new ArgumentOutOfRangeException("componentsPerSample");
this.componentsPerSample = componentsPerSample;
this.m_bytes = row;
this.columnCount = columnCount;
using (BitStream bitStream = new BitStream(row))
{
//create long buffer for a single line
lineBuffer = new short[columnCount * componentsPerSample];
int byteIndex = 0;
for (int i = 0; i < columnCount; ++i)
{
//each component
//eg. 1,2,3,4
switch (componentsPerSample)
{
case 1:
lineBuffer[byteIndex] = (short)bitStream.Read(bitsPerComponent);
byteIndex++;
break;
case 2:
lineBuffer[byteIndex] = (short)bitStream.Read(bitsPerComponent);
lineBuffer[byteIndex + 1] = (short)bitStream.Read(bitsPerComponent);
byteIndex += 2;
break;
case 3:
lineBuffer[byteIndex] = (short)bitStream.Read(bitsPerComponent);
lineBuffer[byteIndex + 1] = (short)bitStream.Read(bitsPerComponent);
lineBuffer[byteIndex + 2] = (short)bitStream.Read(bitsPerComponent);
byteIndex += 3;
break;
case 4:
lineBuffer[byteIndex] = (short)bitStream.Read(bitsPerComponent);
lineBuffer[byteIndex + 1] = (short)bitStream.Read(bitsPerComponent);
lineBuffer[byteIndex + 2] = (short)bitStream.Read(bitsPerComponent);
lineBuffer[byteIndex + 4] = (short)bitStream.Read(bitsPerComponent);
byteIndex += 4;
break;
default:
throw new NotSupportedException();
}
//for (short i = 0; i < componentCount; ++i)
//{
// //bitPerSample may >8 bits
// m_components[i] = (short)bitStream.Read(bitsPerComponent);
//}
}
//m_samples = new Sample[sampleCount];
//for (int i = 0; i < sampleCount; ++i)
// m_samples[i] = new Sample(bitStream, bitsPerComponent, componentsPerSample);
}
}