replaced main_header codestream attribute with codestream
changed "codestream" parameter of set_parseoptions to "full_codestream"
This commit is contained in:
parent
fe5e784b58
commit
a24bff0af1
4 changed files with 40 additions and 59 deletions
|
|
@ -5,7 +5,7 @@ import argparse
|
|||
import os
|
||||
import warnings
|
||||
|
||||
from . import Jp2k, set_printoptions, lib
|
||||
from . import Jp2k, set_printoptions, set_parseoptions, lib
|
||||
|
||||
|
||||
def main():
|
||||
|
|
@ -47,11 +47,8 @@ def main():
|
|||
|
||||
if codestream_level == 0:
|
||||
set_printoptions(codestream=False)
|
||||
print_full_codestream = False
|
||||
elif codestream_level == 1:
|
||||
print_full_codestream = False
|
||||
else:
|
||||
print_full_codestream = True
|
||||
elif codestream_level == 2:
|
||||
set_parseoptions(full_codestream=True)
|
||||
|
||||
filename = args.filename
|
||||
|
||||
|
|
@ -68,11 +65,6 @@ def main():
|
|||
elif codestream_level == 2:
|
||||
print('File: {0}'.format(os.path.basename(filename)))
|
||||
print(jp2.get_codestream(header_only=False))
|
||||
elif print_full_codestream:
|
||||
for box in jp2.box:
|
||||
if box.box_id == 'jp2c':
|
||||
box._get_codestream(header_only=False)
|
||||
print(jp2)
|
||||
else:
|
||||
print(jp2)
|
||||
|
||||
|
|
|
|||
|
|
@ -1023,13 +1023,17 @@ class ContiguousCodestreamBox(Jp2kBox):
|
|||
|
||||
@property
|
||||
def codestream(self):
|
||||
if _parseoptions['full_codestream'] is True:
|
||||
header_only = False
|
||||
else:
|
||||
header_only = True
|
||||
if self._codestream is None:
|
||||
if self._filename is not None:
|
||||
with open(self._filename, 'rb') as fptr:
|
||||
fptr.seek(self.main_header_offset)
|
||||
codestream = Codestream(fptr,
|
||||
self._length,
|
||||
header_only=True)
|
||||
header_only=header_only)
|
||||
self._codestream = codestream
|
||||
return self._codestream
|
||||
|
||||
|
|
@ -1067,40 +1071,16 @@ class ContiguousCodestreamBox(Jp2kBox):
|
|||
ContiguousCodestreamBox instance
|
||||
"""
|
||||
main_header_offset = fptr.tell()
|
||||
if _parseoptions['codestream'] is True:
|
||||
main_header = Codestream(fptr, length, header_only=True)
|
||||
if _parseoptions['full_codestream'] is True:
|
||||
codestream = Codestream(fptr, length, header_only=False)
|
||||
else:
|
||||
main_header = None
|
||||
box = cls(main_header, main_header_offset=main_header_offset,
|
||||
codestream = None
|
||||
box = cls(codestream, main_header_offset=main_header_offset,
|
||||
length=length, offset=offset)
|
||||
box._filename = fptr.name
|
||||
box._length = length
|
||||
return box
|
||||
|
||||
def _get_codestream(self, header_only=True):
|
||||
"""retrieve codestream
|
||||
|
||||
Parameters
|
||||
----------
|
||||
header_only : bool, optional
|
||||
If True, only marker segments in the main header are parsed.
|
||||
Supplying False may impose a large performance penalty.
|
||||
"""
|
||||
with open(self.filename, 'rb') as fptr:
|
||||
fptr.seek(self.offset)
|
||||
read_buffer = fptr.read(8)
|
||||
(box_length, _) = struct.unpack('>I4s', read_buffer)
|
||||
if box_length == 0:
|
||||
# The length of the box is presumed to last until the end
|
||||
# of the file. Compute the effective length of the box.
|
||||
box_length = os.path.getsize(fptr.name) - fptr.tell() + 8
|
||||
elif box_length == 1:
|
||||
# Seek past the XL field.
|
||||
read_buffer = fptr.read(8)
|
||||
box_length, = struct.unpack('>Q', read_buffer)
|
||||
self._codestream = Codestream(fptr, box_length - 8,
|
||||
header_only=header_only)
|
||||
|
||||
|
||||
class DataReferenceBox(Jp2kBox):
|
||||
"""Container for Data Reference box information.
|
||||
|
|
@ -3338,19 +3318,20 @@ _BOX_WITH_ID = {
|
|||
b'uuid': UUIDBox,
|
||||
b'xml ': XMLBox}
|
||||
|
||||
_parseoptions = {'codestream': True}
|
||||
_parseoptions = {'full_codestream': False}
|
||||
|
||||
|
||||
def set_parseoptions(codestream=True):
|
||||
def set_parseoptions(full_codestream=True):
|
||||
"""Set parsing options.
|
||||
|
||||
These options determine the way JPEG 2000 boxes are parsed.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
codestream : bool, defaults to True
|
||||
When False, the codestream header is only parsed when accessed. This
|
||||
can results in faster JP2/JPX parsing.
|
||||
full_codestream : bool, defaults to True
|
||||
When False, only the codestream header is parsed for metadata. This
|
||||
can results in faster JP2/JPX parsing. When True, the entire
|
||||
codestream is parsed for metadata.
|
||||
|
||||
See also
|
||||
--------
|
||||
|
|
@ -3361,9 +3342,9 @@ def set_parseoptions(codestream=True):
|
|||
To put back the default options, you can use:
|
||||
|
||||
>>> import glymur
|
||||
>>> glymur.set_parseoptions(codestream=True)
|
||||
>>> glymur.set_parseoptions(full_codestream=True)
|
||||
"""
|
||||
_parseoptions['codestream'] = codestream
|
||||
_parseoptions['full_codestream'] = full_codestream
|
||||
|
||||
|
||||
def get_parseoptions():
|
||||
|
|
@ -3401,10 +3382,10 @@ def set_printoptions(**kwargs):
|
|||
xml : bool, optional
|
||||
When False, printing of the XML contents of any XML boxes or UUID XMP
|
||||
boxes is suppressed.
|
||||
siz : bool, optional
|
||||
When True, only the SIZ segment is printed. When False, the entire
|
||||
codestream is printed. This option has no effect when the 'short'
|
||||
option is set to True.
|
||||
codestream : bool, optional
|
||||
When False, only the codestream header is printed. When True, the
|
||||
entire codestream is printed. This option has no effect when the
|
||||
'short' option is set to True.
|
||||
|
||||
See also
|
||||
--------
|
||||
|
|
|
|||
|
|
@ -1043,26 +1043,25 @@ class TestParsing(unittest.TestCase):
|
|||
def setUp(self):
|
||||
self.jp2file = glymur.data.nemo()
|
||||
# Reset parseoptions for every test.
|
||||
glymur.set_parseoptions(codestream=True)
|
||||
glymur.set_parseoptions(full_codestream=False)
|
||||
|
||||
def tearDown(self):
|
||||
glymur.set_parseoptions(codestream=True)
|
||||
glymur.set_parseoptions(full_codestream=False)
|
||||
|
||||
@unittest.skipIf(WARNING_INFRASTRUCTURE_ISSUE, WARNING_INFRASTRUCTURE_MSG)
|
||||
def test_bad_rsiz(self):
|
||||
"""Should not warn if RSIZ when parsing is turned off."""
|
||||
filename = opj_data_file('input/nonregression/edf_c2_1002767.jp2')
|
||||
glymur.set_parseoptions(codestream=False)
|
||||
Jp2k(filename)
|
||||
glymur.set_parseoptions(full_codestream=False)
|
||||
jp2 = Jp2k(filename)
|
||||
|
||||
glymur.set_parseoptions(codestream=True)
|
||||
glymur.set_parseoptions(full_codestream=True)
|
||||
with self.assertWarnsRegex(UserWarning, 'Invalid profile'):
|
||||
Jp2k(filename)
|
||||
|
||||
def test_main_header(self):
|
||||
"""Verify that the main header isn't loaded when parsing turned off."""
|
||||
"""verify that the main header isn't loaded during normal parsing"""
|
||||
# The hidden _main_header attribute should show up after accessing it.
|
||||
glymur.set_parseoptions(codestream=False)
|
||||
jp2 = Jp2k(self.jp2file)
|
||||
jp2c = jp2.box[4]
|
||||
self.assertIsNone(jp2c._codestream)
|
||||
|
|
|
|||
|
|
@ -1040,9 +1040,10 @@ class TestJp2dump(unittest.TestCase):
|
|||
|
||||
# Reset printoptions for every test.
|
||||
glymur.set_printoptions(short=False, xml=True, codestream=True)
|
||||
glymur.set_parseoptions(full_codestream=False)
|
||||
|
||||
def tearDown(self):
|
||||
pass
|
||||
glymur.set_parseoptions(full_codestream=False)
|
||||
|
||||
def run_jp2dump(self, args):
|
||||
sys.argv = args
|
||||
|
|
@ -1083,6 +1084,14 @@ class TestJp2dump(unittest.TestCase):
|
|||
expected = '\n'.join(expected)
|
||||
self.assertEqual(actual, expected)
|
||||
|
||||
def test_jp2_codestream_2(self):
|
||||
"""Verify dumping with -c 2, print entire jp2 jacket, codestream."""
|
||||
actual = self.run_jp2dump(['', '-c', '2', self.jp2file])
|
||||
|
||||
# shave off the non-main-header segments
|
||||
expected = fixtures.nemo
|
||||
self.assertEqual(actual, expected)
|
||||
|
||||
@unittest.skipIf(sys.hexversion < 0x03000000, "assertRegex not in 2.7")
|
||||
def test_j2k_codestream_0(self):
|
||||
"""-c 0 should print just a single line when used on a codestream."""
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue