/// <summary> This method reads and buffers the tile headers, packet headers and /// packet data. /// /// </summary> /// <param name="fi">The file to read the headers and data from /// /// </param> /// <exception cref="IOException">If an I/O error ocurred. /// /// </exception> 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++; } } }
/// <summary> This method parses the codestream for SOT, SOP and EPH markers and /// removes header header bits signalling SOP and EPH markers if packed /// packet headers are used /// /// </summary> /// <param name="fi">The file to parse the markers from /// /// </param> /// <exception cref="IOException">If an I/O error ocurred. /// /// </exception> private void parseAndFind(BufferedRandomAccessFile fi) { int length, pos, i, t, sop = 0, eph = 0; short marker; int halfMarker; int tileEnd; System.Collections.Generic.List<System.Int32> markPos = new List<int>(10); // Find position of first SOT marker marker = (short) fi.readUnsignedShort(); // read SOC marker marker = (short) fi.readUnsignedShort(); while (marker != CSJ2K.j2k.codestream.Markers.SOT) { pos = fi.Pos; length = fi.readUnsignedShort(); // If SOP and EPH markers were only used for parsing in this // class remove SOP and EPH markers from Scod field if (marker == CSJ2K.j2k.codestream.Markers.COD) { int scod = fi.readUnsignedByte(); if (tempSop) scod &= 0xfd; // Remove bits indicating SOP if (tempEph) scod &= 0xfb; // Remove bits indicating SOP fi.seek(pos + 2); fi.write(scod); } fi.seek(pos + length); marker = (short) fi.readUnsignedShort(); } pos = fi.Pos; fi.seek(pos - 2); // Find all packet headers, packed data and tile headers for (t = 0; t < nt; t++) { // Read SOT marker fi.readUnsignedShort(); // Skip SOT pos = fi.Pos; markPos.Add((System.Int32) fi.Pos); fi.readInt(); // Skip Lsot and Isot length = fi.readInt(); // Read Psot fi.readUnsignedShort(); // Skip TPsot & TNsot tileEnd = pos + length - 2; // Last byte of tile // Find position of SOD marker marker = (short) fi.readUnsignedShort(); while (marker != CSJ2K.j2k.codestream.Markers.SOD) { pos = fi.Pos; length = fi.readUnsignedShort(); // If SOP and EPH markers were only used for parsing in this // class remove SOP and EPH markers from Scod field if (marker == CSJ2K.j2k.codestream.Markers.COD) { int scod = fi.readUnsignedByte(); if (tempSop) scod &= 0xfd; // Remove bits indicating SOP if (tempEph) scod &= 0xfb; // Remove bits indicating SOP fi.seek(pos + 2); fi.write(scod); } fi.seek(pos + length); marker = (short) fi.readUnsignedShort(); } // Find all SOP and EPH markers in tile sop = 0; eph = 0; i = fi.Pos; while (i < tileEnd) { halfMarker = (short) fi.readUnsignedByte(); if (halfMarker == (short) 0xff) { marker = (short) ((halfMarker << 8) + fi.readUnsignedByte()); i++; if (marker == CSJ2K.j2k.codestream.Markers.SOP) { markPos.Add((System.Int32) fi.Pos); ppt[t]++; sop++; fi.skipBytes(4); i += 4; } if (marker == CSJ2K.j2k.codestream.Markers.EPH) { markPos.Add((System.Int32) fi.Pos); eph++; } } i++; } } markPos.Add((System.Int32) (fi.Pos + 2)); positions = new System.Int32[markPos.Count]; markPos.CopyTo(positions); }