From efca5e3d342e95515d853196bc5b0af6db014583 Mon Sep 17 00:00:00 2001 From: jevans Date: Sun, 21 Jul 2013 20:32:18 -0400 Subject: [PATCH] No need for InconsistentStartOfTileError anymore, closes #81. Also fixed corruption of devel left over from issue number 79. --- glymur/codestream.py | 39 +++++++++-------------------------- glymur/test/test_opj_suite.py | 3 +-- 2 files changed, 11 insertions(+), 31 deletions(-) diff --git a/glymur/codestream.py b/glymur/codestream.py index d8ef0e2..df1575c 100644 --- a/glymur/codestream.py +++ b/glymur/codestream.py @@ -5,7 +5,6 @@ codestreams. """ # pylint: disable=C0302,R0902,R0903,R0913 -from itertools import takewhile import math import struct import sys @@ -43,16 +42,6 @@ for _marker in range(0xff90, 0xff94): _VALID_MARKERS.append(_marker) -class InconsistentStartOfTileError(IOError): - """To be raised if bad SOT segment encountered. - - SOT segment offsets are recorded as encountered. The offsets should all be - different. - """ - def __init__(self, msg): - IOError.__init__(self, msg) - - class Codestream(object): """Container for codestream information. @@ -115,6 +104,11 @@ class Codestream(object): read_buffer = fptr.read(2) marker_id, = struct.unpack('>H', read_buffer) + if marker_id == 0xff90 and header_only: + # Start-of-tile (SOT) means that we are out of the main header + # and there is no need to go further. + break + try: segment = self._process_marker_segment(fptr, marker_id) except Exception as error: @@ -139,12 +133,6 @@ class Codestream(object): fptr.seek(self._tile_offset[-1] + self._tile_length[-1]) - if header_only: - # start-of-tile (SOT) means we are out of the main header. - # No need to go any further. - gen = takewhile(lambda s: s.marker_id != 'SOT', self.segment) - self.segment = list(gen) - def _process_marker_segment(self, fptr, marker_id): """Process and return a segment from the codestream. @@ -210,19 +198,12 @@ class Codestream(object): # we encounter start-of-data marker segments. segment = _parse_sot_segment(fptr) - if segment.offset not in self._tile_offset: - self._tile_offset.append(segment.offset) - if segment.psot == 0: - tile_part_length = self.offset + self.length - segment.offset - 2 - else: - tile_part_length = segment.psot - self._tile_length.append(tile_part_length) + self._tile_offset.append(segment.offset) + if segment.psot == 0: + tile_part_length = self.offset + self.length - segment.offset - 2 else: - msg = "Inconsistent start-of-tile (SOT) marker segment " - msg += "encountered in tile with index {0}. " - msg += "Codestream parsing terminated." - msg = msg.format(segment.isot) - raise InconsistentStartOfTileError(msg) + tile_part_length = segment.psot + self._tile_length.append(tile_part_length) elif marker_id == 0xff93: # start of data. Need to seek past the current tile part. diff --git a/glymur/test/test_opj_suite.py b/glymur/test/test_opj_suite.py index cedd9cf..0371acf 100644 --- a/glymur/test/test_opj_suite.py +++ b/glymur/test/test_opj_suite.py @@ -6954,8 +6954,7 @@ class TestSuiteDump(unittest.TestCase): self.assertEqual(c.segment[3]._exponent, [4] + [5, 5, 6] * 5) def test_NR_merged_dump(self): - jfile = os.path.join(data_root, - 'input/nonregression/merged.jp2') + jfile = os.path.join(data_root, 'input/nonregression/merged.jp2') jp2 = Jp2k(jfile) ids = [box.box_id for box in jp2.box]