private void readAndBuffer(BufferedRandomAccessFile fi)
{
int p, prem, length, t, markIndex;
// Buffer main header
fi.seek(0);
length = ((System.Int32) positions[0]) - 2;
mainHeader = new byte[length];
fi.readFully(mainHeader, 0, length);
markIndex = 0;
for (t = 0; t < nt; t++)
{
prem = ppt[t];
packetHeaders[t] = new byte[prem][];
packetData[t] = new byte[prem][];
sopMarkSeg[t] = new byte[prem][];
// Read tile header
length = positions[markIndex + 1] - positions[markIndex];
tileHeaders[t] = new byte[length];
fi.readFully(tileHeaders[t], 0, length);
markIndex++;
for (p = 0; p < prem; p++)
{
// Read packet header
length = positions[markIndex + 1] - positions[markIndex];
if (tempSop)
{
// SOP marker is skipped
length -= CSJ2K.j2k.codestream.Markers.SOP_LENGTH;
fi.skipBytes(CSJ2K.j2k.codestream.Markers.SOP_LENGTH);
}
else
{
// SOP marker is read and buffered
length -= CSJ2K.j2k.codestream.Markers.SOP_LENGTH;
sopMarkSeg[t][p] = new byte[CSJ2K.j2k.codestream.Markers.SOP_LENGTH];
fi.readFully(sopMarkSeg[t][p], 0, CSJ2K.j2k.codestream.Markers.SOP_LENGTH);
}
if (!tempEph)
{
// EPH marker is kept in header
length += CSJ2K.j2k.codestream.Markers.EPH_LENGTH;
}
packetHeaders[t][p] = new byte[length];
fi.readFully(packetHeaders[t][p], 0, length);
markIndex++;
// Read packet data
length = positions[markIndex + 1] - positions[markIndex];
length -= CSJ2K.j2k.codestream.Markers.EPH_LENGTH;
if (tempEph)
{
// EPH marker is used and is skipped
fi.skipBytes(CSJ2K.j2k.codestream.Markers.EPH_LENGTH);
}
packetData[t][p] = new byte[length];
fi.readFully(packetData[t][p], 0, length);
markIndex++;
}
}
}