/// <summary> This method writes the new codestream to the file.
///
/// </summary>
/// <param name="fi">The file to write the new codestream to
///
/// </param>
/// <exception cref="IOException">If an I/O error ocurred.
///
/// </exception>
private void writeNewCodestream(BufferedRandomAccessFile fi)
{
int t, p, tp; // i removed
int numTiles = tileParts.Length;
int[][] packetHeaderLengths = new int[numTiles][];
for (int i2 = 0; i2 < numTiles; i2++)
{
packetHeaderLengths[i2] = new int[maxtp];
}
byte[] temp;
int length;
// Write main header up to SOT marker
fi.write(mainHeader, 0, mainHeader.Length);
// If PPM used write all packet headers in PPM markers
if (ppmUsed)
{
System.IO.MemoryStream ppmMarkerSegment = new System.IO.MemoryStream();
int numPackets;
int totNumPackets;
int ppmIndex = 0;
int ppmLength;
int pStart, pStop;
int[] prem = new int[numTiles];
// Set number of remaining packets
for (t = 0; t < numTiles; t++)
{
prem[t] = packetHeaders[t].Length;
}
// Calculate Nppm values
for (tp = 0; tp < maxtp; tp++)
{
for (t = 0; t < numTiles; t++)
{
if (tileParts[t].Length > tp)
{
totNumPackets = packetHeaders[t].Length;
// Calculate number of packets in this tilepart
numPackets = (tp == tileParts[t].Length - 1)?prem[t]:pptp;
pStart = totNumPackets - prem[t];
pStop = pStart + numPackets;
// Calculate number of packet header bytes for this
// tile part
for (p = pStart; p < pStop; p++)
packetHeaderLengths[t][tp] += packetHeaders[t][p].Length;
prem[t] -= numPackets;
}
}
}
// Write first PPM marker
ppmMarkerSegment.WriteByte((System.Byte) SupportClass.URShift(CSJ2K.j2k.codestream.Markers.PPM, 8));
ppmMarkerSegment.WriteByte((System.Byte) (CSJ2K.j2k.codestream.Markers.PPM & 0x00FF));
ppmMarkerSegment.WriteByte((System.Byte) 0); // Temporary Lppm value
ppmMarkerSegment.WriteByte((System.Byte) 0); // Temporary Lppm value
ppmMarkerSegment.WriteByte((System.Byte) 0); // zppm
ppmLength = 3;
ppmIndex++;
// Set number of remaining packets
for (t = 0; t < numTiles; t++)
prem[t] = packetHeaders[t].Length;
// Write all PPM markers and information
for (tp = 0; tp < maxtp; tp++)
{
for (t = 0; t < numTiles; t++)
{
if (tileParts[t].Length > tp)
{
totNumPackets = packetHeaders[t].Length;
// Calculate number of packets in this tilepart
numPackets = (tp == tileParts[t].Length - 1)?prem[t]:pptp;
pStart = totNumPackets - prem[t];
pStop = pStart + numPackets;
// If Nppm value wont fit in current PPM marker segment
// write current PPM marker segment and start new
if (ppmLength + 4 > CSJ2K.j2k.codestream.Markers.MAX_LPPM)
{
// Write current PPM marker
temp = ppmMarkerSegment.ToArray();
length = temp.Length - 2;
temp[2] = (byte) (SupportClass.URShift(length, 8));
temp[3] = (byte) length;
fi.write(temp, 0, length + 2);
// Start new PPM marker segment
//UPGRADE_ISSUE: Method 'java.io.ByteArrayOutputStream.reset' was not converted. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1000_javaioByteArrayOutputStreamreset'"
//ppmMarkerSegment.reset();
ppmMarkerSegment.SetLength(0);
ppmMarkerSegment.WriteByte((System.Byte) SupportClass.URShift(CSJ2K.j2k.codestream.Markers.PPM, 8));
ppmMarkerSegment.WriteByte((System.Byte) (CSJ2K.j2k.codestream.Markers.PPM & 0x00FF));
ppmMarkerSegment.WriteByte((System.Byte) 0); // Temporary Lppm value
ppmMarkerSegment.WriteByte((System.Byte) 0); // Temporary Lppm value
ppmMarkerSegment.WriteByte((System.Byte) ppmIndex++); // zppm
ppmLength = 3;
}
// Write Nppm value
length = packetHeaderLengths[t][tp];
ppmMarkerSegment.WriteByte((System.Byte) SupportClass.URShift(length, 24));
ppmMarkerSegment.WriteByte((System.Byte) SupportClass.URShift(length, 16));
ppmMarkerSegment.WriteByte((System.Byte) SupportClass.URShift(length, 8));
ppmMarkerSegment.WriteByte((System.Byte) length);
ppmLength += 4;
// Write packet headers
for (p = pStart; p < pStop; p++)
{
length = packetHeaders[t][p].Length;
// If next packet header value wont fit in
// current PPM marker segment write current PPM
// marker segment and start new
if (ppmLength + length > CSJ2K.j2k.codestream.Markers.MAX_LPPM)
{
// Write current PPM marker
temp = ppmMarkerSegment.ToArray();
length = temp.Length - 2;
temp[2] = (byte) (SupportClass.URShift(length, 8));
temp[3] = (byte) length;
fi.write(temp, 0, length + 2);
// Start new PPM marker segment
//UPGRADE_ISSUE: Method 'java.io.ByteArrayOutputStream.reset' was not converted. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1000_javaioByteArrayOutputStreamreset'"
//ppmMarkerSegment.reset();
ppmMarkerSegment.SetLength(0);
ppmMarkerSegment.WriteByte((System.Byte) SupportClass.URShift(CSJ2K.j2k.codestream.Markers.PPM, 8));
ppmMarkerSegment.WriteByte((System.Byte) (CSJ2K.j2k.codestream.Markers.PPM & 0x00FF));
ppmMarkerSegment.WriteByte((System.Byte) 0); // Temp Lppm value
ppmMarkerSegment.WriteByte((System.Byte) 0); // Temp Lppm value
ppmMarkerSegment.WriteByte((System.Byte) ppmIndex++); // zppm
ppmLength = 3;
}
// write packet header
ppmMarkerSegment.Write(packetHeaders[t][p], 0, packetHeaders[t][p].Length);
ppmLength += packetHeaders[t][p].Length;
}
prem[t] -= numPackets;
}
}
}
// Write last PPM marker segment
temp = ppmMarkerSegment.ToArray();
length = temp.Length - 2;
temp[2] = (byte) (SupportClass.URShift(length, 8));
temp[3] = (byte) length;
fi.write(temp, 0, length + 2);
}
// Write tile parts interleaved
for (tp = 0; tp < maxtp; tp++)
{
for (t = 0; t < nt; t++)
{
if (tileParts[t].Length > tp)
{
temp = tileParts[t][tp];
length = temp.Length;
fi.write(temp, 0, length);
}
}
}
fi.writeShort(CSJ2K.j2k.codestream.Markers.EOC);
}