seek() public method

Moves the current position to the given offset at which the next read or write occurs. The offset is measured from the beginning of the stream.
If in read-only and seeking beyond EOF. /// /// If an I/O error ocurred. /// ///
public seek ( int off ) : void
off int The offset where to move to. /// ///
return void
Esempio n. 1
0
        /// <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++;
                }
            }
        }
Esempio n. 2
0
        /// <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);
        }