No need for InconsistentStartOfTileError anymore, closes #81.
Also fixed corruption of devel left over from issue number 79.
This commit is contained in:
parent
16fd373af3
commit
efca5e3d34
2 changed files with 11 additions and 31 deletions
|
|
@ -5,7 +5,6 @@ codestreams.
|
||||||
"""
|
"""
|
||||||
# pylint: disable=C0302,R0902,R0903,R0913
|
# pylint: disable=C0302,R0902,R0903,R0913
|
||||||
|
|
||||||
from itertools import takewhile
|
|
||||||
import math
|
import math
|
||||||
import struct
|
import struct
|
||||||
import sys
|
import sys
|
||||||
|
|
@ -43,16 +42,6 @@ for _marker in range(0xff90, 0xff94):
|
||||||
_VALID_MARKERS.append(_marker)
|
_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):
|
class Codestream(object):
|
||||||
"""Container for codestream information.
|
"""Container for codestream information.
|
||||||
|
|
||||||
|
|
@ -115,6 +104,11 @@ class Codestream(object):
|
||||||
read_buffer = fptr.read(2)
|
read_buffer = fptr.read(2)
|
||||||
marker_id, = struct.unpack('>H', read_buffer)
|
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:
|
try:
|
||||||
segment = self._process_marker_segment(fptr, marker_id)
|
segment = self._process_marker_segment(fptr, marker_id)
|
||||||
except Exception as error:
|
except Exception as error:
|
||||||
|
|
@ -139,12 +133,6 @@ class Codestream(object):
|
||||||
|
|
||||||
fptr.seek(self._tile_offset[-1] + self._tile_length[-1])
|
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):
|
def _process_marker_segment(self, fptr, marker_id):
|
||||||
"""Process and return a segment from the codestream.
|
"""Process and return a segment from the codestream.
|
||||||
|
|
@ -210,19 +198,12 @@ class Codestream(object):
|
||||||
# we encounter start-of-data marker segments.
|
# we encounter start-of-data marker segments.
|
||||||
|
|
||||||
segment = _parse_sot_segment(fptr)
|
segment = _parse_sot_segment(fptr)
|
||||||
if segment.offset not in self._tile_offset:
|
self._tile_offset.append(segment.offset)
|
||||||
self._tile_offset.append(segment.offset)
|
if segment.psot == 0:
|
||||||
if segment.psot == 0:
|
tile_part_length = self.offset + self.length - segment.offset - 2
|
||||||
tile_part_length = self.offset + self.length - segment.offset - 2
|
|
||||||
else:
|
|
||||||
tile_part_length = segment.psot
|
|
||||||
self._tile_length.append(tile_part_length)
|
|
||||||
else:
|
else:
|
||||||
msg = "Inconsistent start-of-tile (SOT) marker segment "
|
tile_part_length = segment.psot
|
||||||
msg += "encountered in tile with index {0}. "
|
self._tile_length.append(tile_part_length)
|
||||||
msg += "Codestream parsing terminated."
|
|
||||||
msg = msg.format(segment.isot)
|
|
||||||
raise InconsistentStartOfTileError(msg)
|
|
||||||
|
|
||||||
elif marker_id == 0xff93:
|
elif marker_id == 0xff93:
|
||||||
# start of data. Need to seek past the current tile part.
|
# start of data. Need to seek past the current tile part.
|
||||||
|
|
|
||||||
|
|
@ -6954,8 +6954,7 @@ class TestSuiteDump(unittest.TestCase):
|
||||||
self.assertEqual(c.segment[3]._exponent, [4] + [5, 5, 6] * 5)
|
self.assertEqual(c.segment[3]._exponent, [4] + [5, 5, 6] * 5)
|
||||||
|
|
||||||
def test_NR_merged_dump(self):
|
def test_NR_merged_dump(self):
|
||||||
jfile = os.path.join(data_root,
|
jfile = os.path.join(data_root, 'input/nonregression/merged.jp2')
|
||||||
'input/nonregression/merged.jp2')
|
|
||||||
jp2 = Jp2k(jfile)
|
jp2 = Jp2k(jfile)
|
||||||
|
|
||||||
ids = [box.box_id for box in jp2.box]
|
ids = [box.box_id for box in jp2.box]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue