This commit is contained in:
jevans 2013-07-09 20:22:50 -04:00
commit 4c1d029198
11 changed files with 488 additions and 429 deletions

View file

@ -13,9 +13,9 @@ import warnings
import numpy as np
from .core import LRCP, RLCP, RPCL, PCRL, CPRL
from .core import WAVELET_TRANSFORM_9x7_IRREVERSIBLE
from .core import WAVELET_TRANSFORM_5x3_REVERSIBLE
from .core import _capabilities_display
from .core import WAVELET_XFORM_9X7_IRREVERSIBLE
from .core import WAVELET_XFORM_5X3_REVERSIBLE
from .core import _CAPABILITIES_DISPLAY
from .lib import openjp2 as opj2
_PROGRESSION_ORDER_DISPLAY = {
@ -26,8 +26,8 @@ _PROGRESSION_ORDER_DISPLAY = {
CPRL: 'CPRL'}
_WAVELET_TRANSFORM_DISPLAY = {
WAVELET_TRANSFORM_9x7_IRREVERSIBLE: '9-7 irreversible',
WAVELET_TRANSFORM_5x3_REVERSIBLE: '5-3 reversible'}
WAVELET_XFORM_9X7_IRREVERSIBLE: '9-7 irreversible',
WAVELET_XFORM_5X3_REVERSIBLE: '5-3 reversible'}
# Need a catch-all list of valid markers.
# See table A-1 in ISO/IEC FCD15444-1.
@ -1134,7 +1134,7 @@ class SIZsegment(Segment):
'Signed: {10}',
'Vertical, Horizontal Subsampling: {11}']
msg += '\n '.join(lines)
msg = msg.format(_capabilities_display[self.rsiz],
msg = msg.format(_CAPABILITIES_DISPLAY[self.rsiz],
self.ysiz, self.xsiz,
self.yosiz, self.xosiz,
self.ytsiz, self.xtsiz,

View file

@ -1,3 +1,5 @@
"""Core definitions to be shared amongst the modules.
"""
# Progression order
LRCP = 0
RLCP = 1
@ -12,8 +14,8 @@ PROGRESSION_ORDER = {
'PCRL': PCRL,
'CPRL': CPRL}
WAVELET_TRANSFORM_9x7_IRREVERSIBLE = 0
WAVELET_TRANSFORM_5x3_REVERSIBLE = 1
WAVELET_XFORM_9X7_IRREVERSIBLE = 0
WAVELET_XFORM_5X3_REVERSIBLE = 1
ENUMERATED_COLORSPACE = 1
RESTRICTED_ICC_PROFILE = 2
@ -32,7 +34,7 @@ YCC = 18
E_SRGB = 20
ROMM_RGB = 21
_colorspace_map_display = {
_COLORSPACE_MAP_DISPLAY = {
CMYK: 'CMYK',
SRGB: 'sRGB',
GREYSCALE: 'greyscale',
@ -45,7 +47,7 @@ _COLOR = 0
_OPACITY = 1
_PRE_MULTIPLIED_OPACITY = 2
_UNSPECIFIED = 65535
_color_type_map_display = {
_COLOR_TYPE_MAP_DISPLAY = {
_COLOR: 'color',
_OPACITY: 'opacity',
_PRE_MULTIPLIED_OPACITY: 'pre-multiplied opacity',
@ -58,103 +60,15 @@ BLUE = 3
GREY = 1
# enumerated color channel associations
_rgb_colorspace = {"R": 1, "G": 2, "B": 3}
_greyscale_colorspace = {"Y": 1}
_ycbcr_colorspace = {"Y": 1, "Cb": 2, "Cr": 3}
_colorspace = {SRGB: _rgb_colorspace,
GREYSCALE: _greyscale_colorspace,
YCC: _ycbcr_colorspace,
E_SRGB: _rgb_colorspace,
ROMM_RGB: _rgb_colorspace}
_COLORSPACE = {SRGB: {"R": 1, "G": 2, "B": 3},
GREYSCALE: {"Y": 1},
YCC: {"Y": 1, "Cb": 2, "Cr": 3},
E_SRGB: {"R": 1, "G": 2, "B": 3},
ROMM_RGB: {"R": 1, "G": 2, "B": 3}}
# How to display the codestream profile.
_capabilities_display = {
_CAPABILITIES_DISPLAY = {
0: '2',
1: '0',
2: '1',
3: '3'}
# Reader requirements
_reader_requirements_display = {
0: 'File not completely understood',
1: 'Deprecated',
2: 'Contains multiple composition layers',
3: 'Deprecated',
4: 'JPEG 2000 Part 1 Profile 1 codestream',
5: 'Unrestricted JPEG 2000 Part 1 codestream, ITU-T Rec. T.800 '
+ '| ISO/IEC 15444-1',
6: 'Unrestricted JPEG 2000 Part 2 codestream',
7: 'JPEG codestream as defined in ISO/IEC 10918-1',
8: 'Deprecated',
9: 'Non-premultiplied opacity channel',
10: 'Premultiplied opacity channel',
11: 'Chroma-key based opacity',
12: 'Deprecated',
13: 'Fragmented codestream where all fragments are in file and in order',
14: 'Fragmented codestream where all fragments are in file '
+ 'but are out of order',
15: 'Fragmented codestream where not all fragments are within the file '
+ 'but are all in locally accessible files',
16: 'Fragmented codestream where some fragments may be accessible '
+ 'only through a URL specified network connection',
17: 'Compositing required to produce rendered result from multiple '
+ 'compositing layers',
18: 'Deprecated',
19: 'Deprecated',
20: 'Deprecated',
21: 'At least one compositing layer consists of multiple codestreams',
22: 'Deprecated',
23: 'Colourspace transformations are required to combine compositing '
+ 'layers; not all compositing layers are in the same colourspace',
24: 'Deprecated',
25: 'Deprecated',
26: 'First animation layer does not cover entire rendered result',
27: 'Deprecated',
28: 'Reuse of animation layers',
29: 'Deprecated',
30: 'Some animated frames are non-persistent',
31: 'Deprecated',
32: 'Rendered result involves scaling within a layer',
33: 'Rendered result involves scaling between layers',
34: 'ROI metadata',
35: 'IPR metadata',
36: 'Content metadata',
37: 'History metadata',
38: 'Creation metadata',
39: 'JPX digital signatures',
40: 'JPX checksums',
41: 'Desires Graphics Arts Reproduction specified',
42: 'Deprecated',
43: '(Deprecated) compositing layer uses restricted ICC profile',
44: 'Compositing layer uses Any ICC profile',
45: 'Deprecated',
46: 'Deprecated',
47: 'BiLevel 1 enumerated colourspace',
48: 'BiLevel 2 enumerated colourspace',
49: 'YCbCr 1 enumerated colourspace',
50: 'YCbCr 2 enumerated colourspace',
51: 'YCbCr 3 enumerated colourspace',
52: 'PhotoYCC enumerated colourspace',
53: 'YCCK enumerated colourspace',
54: 'CMY enumerated colourspace',
55: 'CMYK enumerated colorspace',
56: 'CIELab enumerated colourspace with default parameters',
57: 'CIELab enumerated colourspace with non-default parameters',
58: 'CIEJab enumerated colourspace with default parameters',
59: 'CIEJab enumerated colourspace with non-default parameters',
60: 'e-sRGB enumerated colorspace',
61: 'ROMM_RGB enumerated colorspace',
62: 'Non-square samples',
63: 'Deprecated',
64: 'Deprecated',
65: 'Deprecated',
66: 'Deprecated',
67: 'GIS metadata XML box',
68: 'JPSEC extensions in codestream as specified by ISO/IEC 15444-8',
69: 'JP3D extensions in codestream as specified by ISO/IEC 15444-10',
70: 'Deprecated',
71: 'e-sYCC enumerated colourspace',
72: 'JPEG 2000 Part 2 codestream as restricted by baseline conformance '
+ 'requirements in M.9.2.3',
73: 'YPbPr(1125/60) enumerated colourspace',
74: 'YPbPr(1250/50) enumerated colourspace'}

View file

@ -27,9 +27,8 @@ import xml.etree.cElementTree as ET
import numpy as np
from .codestream import Codestream
from .core import _colorspace_map_display
from .core import _color_type_map_display
from .core import _reader_requirements_display
from .core import _COLORSPACE_MAP_DISPLAY
from .core import _COLOR_TYPE_MAP_DISPLAY
from .core import ENUMERATED_COLORSPACE, RESTRICTED_ICC_PROFILE
from .core import ANY_ICC_PROFILE, VENDOR_COLOR_METHOD
@ -207,7 +206,7 @@ class ColourSpecificationBox(Jp2kBox):
dispvalue = _approximation_display[self.approximation]
msg += '\n Approximation: {0}'.format(dispvalue)
if self.colorspace is not None:
dispvalue = _colorspace_map_display[self.colorspace]
dispvalue = _COLORSPACE_MAP_DISPLAY[self.colorspace]
msg += '\n Colorspace: {0}'.format(dispvalue)
else:
# 2.7 has trouble pretty-printing ordered dicts so we just have
@ -234,10 +233,10 @@ class ColourSpecificationBox(Jp2kBox):
fptr.write('colr'.encode())
read_buffer = struct.pack('>BBBI',
self.method,
self.precedence,
self.approximation,
self.colorspace)
self.method,
self.precedence,
self.approximation,
self.colorspace)
fptr.write(read_buffer)
@staticmethod
@ -259,7 +258,8 @@ class ColourSpecificationBox(Jp2kBox):
"""
# Read the brand, minor version.
read_buffer = fptr.read(3)
(method, precedence, approximation) = struct.unpack('>BBB', read_buffer)
(method, precedence, approximation) = struct.unpack('>BBB',
read_buffer)
if method == 1:
# enumerated colour space
@ -445,7 +445,7 @@ class ChannelDefinitionBox(Jp2kBox):
def __str__(self):
msg = Jp2kBox.__str__(self)
for j in range(len(self.association)):
color_type_string = _color_type_map_display[self.channel_type[j]]
color_type_string = _COLOR_TYPE_MAP_DISPLAY[self.channel_type[j]]
if self.association[j] == 0:
assn = 'whole image'
else:
@ -463,9 +463,9 @@ class ChannelDefinitionBox(Jp2kBox):
fptr.write(struct.pack('>H', num_components))
for j in range(num_components):
fptr.write(struct.pack('>' + 'H' * 3,
self.index[j],
self.channel_type[j],
self.association[j]))
self.index[j],
self.channel_type[j],
self.association[j]))
@staticmethod
def _parse(fptr, offset, length):
@ -624,7 +624,8 @@ class ContiguousCodestreamBox(Jp2kBox):
ContiguousCodestreamBox instance
"""
main_header = Codestream(fptr, header_only=True)
box = ContiguousCodestreamBox(main_header, length=length, offset=offset)
box = ContiguousCodestreamBox(main_header, length=length,
offset=offset)
return box
@ -801,13 +802,13 @@ class ImageHeaderBox(Jp2kBox):
bit_depth_signedness = 0x80 if self.signed else 0x00
bit_depth_signedness |= self.bits_per_component - 1
read_buffer = struct.pack('>IIHBBBB',
self.height,
self.width,
self.num_components,
bit_depth_signedness,
self.compression,
1 if self.colorspace_unknown else 0,
1 if self.ip_provided else 0)
self.height,
self.width,
self.num_components,
bit_depth_signedness,
self.compression,
1 if self.colorspace_unknown else 0,
1 if self.ip_provided else 0)
fptr.write(read_buffer)
@staticmethod
@ -1135,7 +1136,90 @@ class PaletteBox(Jp2kBox):
offset=offset)
return box
# Map rreq codes to display text.
_READER_REQUIREMENTS_DISPLAY = {
0: 'File not completely understood',
1: 'Deprecated',
2: 'Contains multiple composition layers',
3: 'Deprecated',
4: 'JPEG 2000 Part 1 Profile 1 codestream',
5: 'Unrestricted JPEG 2000 Part 1 codestream, ITU-T Rec. T.800 '
+ '| ISO/IEC 15444-1',
6: 'Unrestricted JPEG 2000 Part 2 codestream',
7: 'JPEG codestream as defined in ISO/IEC 10918-1',
8: 'Deprecated',
9: 'Non-premultiplied opacity channel',
10: 'Premultiplied opacity channel',
11: 'Chroma-key based opacity',
12: 'Deprecated',
13: 'Fragmented codestream where all fragments are in file and in order',
14: 'Fragmented codestream where all fragments are in file '
+ 'but are out of order',
15: 'Fragmented codestream where not all fragments are within the file '
+ 'but are all in locally accessible files',
16: 'Fragmented codestream where some fragments may be accessible '
+ 'only through a URL specified network connection',
17: 'Compositing required to produce rendered result from multiple '
+ 'compositing layers',
18: 'Deprecated',
19: 'Deprecated',
20: 'Deprecated',
21: 'At least one compositing layer consists of multiple codestreams',
22: 'Deprecated',
23: 'Colourspace transformations are required to combine compositing '
+ 'layers; not all compositing layers are in the same colourspace',
24: 'Deprecated',
25: 'Deprecated',
26: 'First animation layer does not cover entire rendered result',
27: 'Deprecated',
28: 'Reuse of animation layers',
29: 'Deprecated',
30: 'Some animated frames are non-persistent',
31: 'Deprecated',
32: 'Rendered result involves scaling within a layer',
33: 'Rendered result involves scaling between layers',
34: 'ROI metadata',
35: 'IPR metadata',
36: 'Content metadata',
37: 'History metadata',
38: 'Creation metadata',
39: 'JPX digital signatures',
40: 'JPX checksums',
41: 'Desires Graphics Arts Reproduction specified',
42: 'Deprecated',
43: '(Deprecated) compositing layer uses restricted ICC profile',
44: 'Compositing layer uses Any ICC profile',
45: 'Deprecated',
46: 'Deprecated',
47: 'BiLevel 1 enumerated colourspace',
48: 'BiLevel 2 enumerated colourspace',
49: 'YCbCr 1 enumerated colourspace',
50: 'YCbCr 2 enumerated colourspace',
51: 'YCbCr 3 enumerated colourspace',
52: 'PhotoYCC enumerated colourspace',
53: 'YCCK enumerated colourspace',
54: 'CMY enumerated colourspace',
55: 'CMYK enumerated colorspace',
56: 'CIELab enumerated colourspace with default parameters',
57: 'CIELab enumerated colourspace with non-default parameters',
58: 'CIEJab enumerated colourspace with default parameters',
59: 'CIEJab enumerated colourspace with non-default parameters',
60: 'e-sRGB enumerated colorspace',
61: 'ROMM_RGB enumerated colorspace',
62: 'Non-square samples',
63: 'Deprecated',
64: 'Deprecated',
65: 'Deprecated',
66: 'Deprecated',
67: 'GIS metadata XML box',
68: 'JPSEC extensions in codestream as specified by ISO/IEC 15444-8',
69: 'JP3D extensions in codestream as specified by ISO/IEC 15444-10',
70: 'Deprecated',
71: 'e-sYCC enumerated colourspace',
72: 'JPEG 2000 Part 2 codestream as restricted by baseline conformance '
+ 'requirements in M.9.2.3',
73: 'YPbPr(1125/60) enumerated colourspace',
74: 'YPbPr(1250/50) enumerated colourspace'}
class ReaderRequirementsBox(Jp2kBox):
"""Container for reader requirements box information.
@ -1182,7 +1266,7 @@ class ReaderRequirementsBox(Jp2kBox):
msg += '\n Standard Features:'
for j in range(len(self.standard_flag)):
sfl = self.standard_flag[j]
rrdisp = _reader_requirements_display[self.standard_flag[j]]
rrdisp = _READER_REQUIREMENTS_DISPLAY[self.standard_flag[j]]
msg += '\n Feature {0:03d}: {1}'.format(sfl, rrdisp)
msg += '\n Vendor Features:'
@ -1803,7 +1887,7 @@ class UUIDBox(Jp2kBox):
----------
the_uuid : uuid.UUID
Identifies the type of UUID box.
raw_data :
raw_data : byte array
This is the "payload" of data for the specified UUID.
length : int
length of the box in bytes.

View file

@ -146,8 +146,8 @@ class Jp2k(Jp2kBox):
box_length = values[0]
box_id = values[1]
signature = values[2:]
if ((box_length != 12) or (box_id != b'jP ') or
(signature != (13, 10, 135, 10))):
if (((box_length != 12) or (box_id != b'jP ') or
(signature != (13, 10, 135, 10)))):
msg = '{0} is not a JPEG 2000 file.'.format(self.filename)
raise IOError(msg)
@ -378,7 +378,7 @@ class Jp2k(Jp2kBox):
else:
raise RuntimeError("unhandled datatype")
comptparms = (_opj2.image_comptparm_t * num_comps)()
comptparms = (_opj2.ImageComptParmType * num_comps)()
for j in range(num_comps):
comptparms[j].dx = cparams.subsampling_dx
comptparms[j].dy = cparams.subsampling_dy
@ -551,7 +551,8 @@ class Jp2k(Jp2kBox):
else:
# OK, I'm a jp2 file. Need to find out where the
# raw codestream actually starts.
jp2c = [box for box in self.box if box.box_id == 'jp2c']
jp2c = [box for box in self.box
if box.box_id == 'jp2c']
jp2c = jp2c[0]
ofile.write(struct.pack('>I', jp2c.length + 8))
ofile.write('jp2c'.encode())
@ -647,10 +648,9 @@ class Jp2k(Jp2kBox):
msg += "using OPENJP2 instead."
raise RuntimeError(msg)
with ExitStack() as stack:
# Set decoding parameters.
dparameters = _opj.dparameters_t()
dparameters = _opj.DecompressionParametersType()
_opj.set_default_decoder_parameters(ctypes.byref(dparameters))
dparameters.cp_reduce = rlevel
dparameters.decod_format = self._codec_format
@ -662,13 +662,13 @@ class Jp2k(Jp2kBox):
dinfo = _opj.create_decompress(dparameters.decod_format)
event_mgr = _opj.event_mgr_t()
event_mgr = _opj.EventMgrType()
info_handler = ctypes.cast(_INFO_CALLBACK, ctypes.c_void_p)
event_mgr.info_handler = info_handler if verbose else None
event_mgr.warning_handler = ctypes.cast(_WARNING_CALLBACK,
ctypes.c_void_p)
ctypes.c_void_p)
event_mgr.error_handler = ctypes.cast(_ERROR_CALLBACK,
ctypes.c_void_p)
ctypes.c_void_p)
_opj.set_event_mgr(dinfo, ctypes.byref(event_mgr))
_opj.setup_decoder(dinfo, dparameters)
@ -722,7 +722,7 @@ class Jp2k(Jp2kBox):
warnings.simplefilter("ignore")
nelts = nrows * ncols
band = np.ctypeslib.as_array(
(ctypes.c_int32 * nelts).from_address(addr))
(ctypes.c_int32 * nelts).from_address(addr))
data[:, :, k] = np.reshape(band.astype(dtype),
(nrows, ncols))
@ -909,7 +909,7 @@ class Jp2k(Jp2kBox):
with warnings.catch_warnings():
warnings.simplefilter("ignore")
band = np.ctypeslib.as_array(
(ctypes.c_int32 * nrows * ncols).from_address(addr))
(ctypes.c_int32 * nrows * ncols).from_address(addr))
if as_bands:
data.append(np.reshape(band.astype(dtype), (nrows, ncols)))
else:

View file

@ -5,6 +5,7 @@ import ctypes
from ctypes.util import find_library
import os
import platform
import warnings
import sys
if sys.hexversion <= 0x03000000:
@ -39,8 +40,10 @@ def glymurrc_fname():
def get_openjpeg_config():
""" Try to find openjpeg library on the system path first.
"""
libopenjpeg_path = find_library('openjpeg')
# If we could not find it, then look in some likely locations.
if libopenjpeg_path is None:
if platform.system() == 'Darwin':
@ -56,23 +59,27 @@ def get_openjpeg_config():
try:
if os.name == "nt":
openjpeg_lib = ctypes.windll.LoadLibrary(libopenjpeg_path)
else:
else:
openjpeg_lib = ctypes.CDLL(libopenjpeg_path)
except OSError:
openjpeg_lib = None
if openjpeg_lib is not None:
# Must be at least 1.5.0
openjpeg_lib.opj_version.restype = ctypes.c_char_p
v = openjpeg_lib.opj_version()
v = v.decode('utf-8')
major, minor, patch = v.split('.')
version = openjpeg_lib.opj_version().decode('utf-8')
_, minor, _ = version.split('.')
if minor != '5':
openjpeg_lib = None
return openjpeg_lib
def get_openjp2_config():
"""
We expect to not find openjp2 on the system path since the only version
that we currently care about is still in the svn trunk at openjpeg.org.
We must use a configuration file that the user must write.
"""
filename = glymurrc_fname()
if filename is not None:
# Read the configuration file for the library location.
@ -106,6 +113,7 @@ def glymur_config():
openjpeg_lib = get_openjpeg_config()
return openjp2_lib, openjpeg_lib
def get_configdir():
"""Return string representing the configuration directory.
@ -121,4 +129,5 @@ def get_configdir():
if 'USERPROFILE' in os.environ:
# Windows?
return os.path.join(os.environ['USERPROFILE'], 'Application Data', 'glymur')
return os.path.join(os.environ['USERPROFILE'], 'Application Data',
'glymur')

View file

@ -1,30 +1,23 @@
"""
Wraps individual functions in openjp2 library.
"""
# pylint: disable=C0302,R0903
import ctypes
from ctypes.util import find_library
import warnings
from .config import glymur_config
OPENJP2, OPENJPEG = glymur_config()
# Progression order
LRCP = 0
RLCP = 1
RPCL = 2
PCRL = 3
CPRL = 4
ERROR_MSG_LST = []
# Map certain atomic OpenJPEG datatypes to the ctypes equivalents.
bool_t = ctypes.c_int32
codec_t_p = ctypes.c_void_p
prog_order_t_p = ctypes.c_int32
cinema_mode_t = ctypes.c_int32
rsiz_capabilities_t = ctypes.c_int32
stream_t_p = ctypes.c_void_p
BOOL_TYPE = ctypes.c_int32
CODEC_TYPE = ctypes.c_void_p
PROG_ORDER_TYPE = ctypes.c_int32
CINEMA_MODE_TYPE = ctypes.c_int32
RSIZ_CAPABILITIES_TYPE = ctypes.c_int32
STREAM_TYPE_P = ctypes.c_void_p
PATH_LEN = 4096
J2K_MAXRLVLS = 33
@ -41,18 +34,21 @@ CLRSPC_UNSPECIFIED = 0
CLRSPC_SRGB = 1
CLRSPC_GRAY = 2
CLRSPC_YCC = 3
color_space_t = ctypes.c_int
COLOR_SPACE_TYPE = ctypes.c_int
# supported codec
codec_format_t = ctypes.c_int
CODEC_FORMAT_TYPE = ctypes.c_int
CODEC_UNKNOWN = -1
CODEC_J2K = 0
CODEC_JPT = 1
CODEC_JP2 = 2
class poc_t(ctypes.Structure):
"""Progression order changes."""
class PocType(ctypes.Structure):
"""Progression order changes.
Corresponds to poc_t type in openjp2 headers.
"""
# Resolution num start, Component num start, given by POC
_fields_ = [
("resno0", ctypes.c_uint32),
@ -69,8 +65,8 @@ class poc_t(ctypes.Structure):
("precno1", ctypes.c_uint32),
# Progression order enum
("prg1", prog_order_t_p),
("prg", prog_order_t_p),
("prg1", PROG_ORDER_TYPE),
("prg", PROG_ORDER_TYPE),
# Progression order string
("progorder", ctypes.c_char * 5),
@ -114,8 +110,11 @@ class poc_t(ctypes.Structure):
("ty0_t", ctypes.c_uint32)]
class dparameters_t(ctypes.Structure):
"""Decompression parameters"""
class DecompressionParametersType(ctypes.Structure):
"""Decompression parameters.
Corresponds to dparameters_t type in openjp2 headers.
"""
_fields_ = [
# Set the number of highest resolutio levels to be discarded. The
# image resolution is effectively divided by 2 to the power of
@ -153,7 +152,7 @@ class dparameters_t(ctypes.Structure):
("DA_y1", ctypes.c_uint32),
# verbose mode
("m_verbose", bool_t),
("m_verbose", BOOL_TYPE),
# tile number of the decoded tile
("tile_index", ctypes.c_uint32),
@ -162,7 +161,7 @@ class dparameters_t(ctypes.Structure):
("nb_tile_to_decode", ctypes.c_uint32),
# activates the JPWL correction capabilities
("jpwl_correct", bool_t),
("jpwl_correct", BOOL_TYPE),
# activates the JPWL correction capabilities
("jpwl_exp_comps", ctypes.c_int32),
@ -174,13 +173,16 @@ class dparameters_t(ctypes.Structure):
("flags", ctypes.c_uint32)]
class cparameters_t(ctypes.Structure):
"""Compression parameters"""
class CompressionParametersType(ctypes.Structure):
"""Compression parameters.
Corresponds to cparameters_t type in openjp2 headers.
"""
_fields_ = [
# size of tile:
# tile_size_on = false (not in argument) or
# = true (in argument)
("tile_size_on", bool_t),
("tile_size_on", BOOL_TYPE),
# XTOsiz, YTOsiz
("cp_tx0", ctypes.c_int),
@ -212,7 +214,7 @@ class cparameters_t(ctypes.Structure):
("prog_order", ctypes.c_int),
# progression order changes
("poc", poc_t * 32),
("poc", PocType * 32),
# number of progression order changes (POC), default to 0
("numpocs", ctypes.c_uint),
@ -286,7 +288,7 @@ class cparameters_t(ctypes.Structure):
# JPWL encoding parameters
# enables writing of EPC in MH, thus activating JPWL
("jpwl_epc_on", bool_t),
("jpwl_epc_on", BOOL_TYPE),
# error protection method for MH (0,1,16,32,37-128)
("jpwl_hprot_mh", ctypes.c_int),
@ -325,14 +327,14 @@ class cparameters_t(ctypes.Structure):
("jpwl_sens_tph", ctypes.c_int * JPWL_MAX_NO_TILESPECS),
# Digital Cinema compliance 0-not compliant, 1-compliant
("cp_cinema", cinema_mode_t),
("cp_cinema", CINEMA_MODE_TYPE),
# Maximum rate for each component.
# If == 0, component size limitation is not considered
("max_comp_size", ctypes.c_int),
# Profile name
("cp_rsiz", rsiz_capabilities_t),
("cp_rsiz", RSIZ_CAPABILITIES_TYPE),
# Tile part generation
("tp_on", ctypes.c_uint8),
@ -344,15 +346,18 @@ class cparameters_t(ctypes.Structure):
("tcp_mct", ctypes.c_uint8),
# Enable JPIP indexing
("jpip_on", bool_t),
("jpip_on", BOOL_TYPE),
# Naive implementation of MCT restricted to a single reversible array
# based encoding without offset concerning all the components.
("mct_data", ctypes.c_void_p)]
class image_comp_t(ctypes.Structure):
"""defines a single image component"""
class ImageCompType(ctypes.Structure):
"""Defines a single image component.
Corresponds to image_comp_t type in openjp2 headers.
"""
_fields_ = [
# XRsiz, YRsiz: horizontal, vertical separation of ith component with
# respect to the reference grid
@ -387,8 +392,11 @@ class image_comp_t(ctypes.Structure):
("data", ctypes.POINTER(ctypes.c_int32))]
class image_t(ctypes.Structure):
"""defines image data and characteristics"""
class ImageType(ctypes.Structure):
"""Defines image data and characteristics.
Corresponds to image_t type in openjp2 headers.
"""
_fields_ = [
# XOsiz, YOsiz: horizontal and vertical offset from the origin of the
# reference grid to the left side of the image area
@ -403,10 +411,10 @@ class image_t(ctypes.Structure):
("numcomps", ctypes.c_uint32),
# color space: should be sRGB, greyscale, or YUV
("color_space", color_space_t),
("color_space", COLOR_SPACE_TYPE),
# image components
("comps", ctypes.POINTER(image_comp_t)),
("comps", ctypes.POINTER(ImageCompType)),
# restricted ICC profile buffer
("icc_profile_buf", ctypes.POINTER(ctypes.c_uint8)),
@ -415,8 +423,11 @@ class image_t(ctypes.Structure):
("icc_profile_len", ctypes.c_uint32)]
class image_comptparm_t(ctypes.Structure):
"""component parameters structure used by image_create function"""
class ImageComptParmType(ctypes.Structure):
"""Component parameters structure used by image_create function.
Corresponds to image_comptparm_t type in openjp2 headers.
"""
_fields_ = [
# XRsiz, YRsiz: horizontal, vertical separation of a sample of ith
# component with respect to the reference grid
@ -441,8 +452,11 @@ class image_comptparm_t(ctypes.Structure):
("sgnd", ctypes.c_uint32)]
class tccp_info_t(ctypes.Structure):
"""tile-component coding parameters information"""
class TccpInfo(ctypes.Structure):
"""Tile-component coding parameters information.
Corresponds to tccp_info_t type in openjp2 header file.
"""
_fields_ = [
# component index
("compno", ctypes.c_uint32),
@ -485,8 +499,11 @@ class tccp_info_t(ctypes.Structure):
("prch", ctypes.c_uint32 * J2K_MAXRLVLS)]
class tile_info_v2_t(ctypes.Structure):
"""tile coding parameters information"""
class TileInfoV2(ctypes.Structure):
"""Tile coding parameters information
Corresponds to tile_info_v2_t type in openjp2 headers.
"""
_fields_ = [
# number (index) of tile
("tileno", ctypes.c_int32),
@ -495,7 +512,7 @@ class tile_info_v2_t(ctypes.Structure):
("csty", ctypes.c_uint32),
# progression order
("prg", prog_order_t_p),
("prg", PROG_ORDER_TYPE),
# number of layers
("numlayers", ctypes.c_uint32),
@ -504,11 +521,14 @@ class tile_info_v2_t(ctypes.Structure):
("mct", ctypes.c_uint32),
# information concerning tile component parameters
("tccp_info", ctypes.POINTER(tccp_info_t))]
("tccp_info", ctypes.POINTER(TccpInfo))]
class codestream_info_v2_t(ctypes.Structure):
"""information about the codestream"""
class CodestreamInfoV2(ctypes.Structure):
"""information about the codestream.
Corresponds to codestream_info_v2_t type in openjp2 header files.
"""
_fields_ = [
# tile info
# tile origin in x, y (XTOsiz, YTOsiz)
@ -527,65 +547,65 @@ class codestream_info_v2_t(ctypes.Structure):
("nbcomps", ctypes.c_uint32),
# default information regarding tiles inside of image
("m_default_tile_info", tile_info_v2_t),
("m_default_tile_info", TileInfoV2),
# information regarding tiles inside of image
("tile_info", ctypes.POINTER(tile_info_v2_t))]
("tile_info", ctypes.POINTER(TileInfoV2))]
# Restrict the input and output argument types for each function used in the
# API.
if OPENJP2 is not None:
OPENJP2.opj_create_compress.restype = codec_t_p
OPENJP2.opj_create_compress.argtypes = [codec_format_t]
OPENJP2.opj_create_compress.restype = CODEC_TYPE
OPENJP2.opj_create_compress.argtypes = [CODEC_FORMAT_TYPE]
OPENJP2.opj_create_decompress.argtypes = [codec_format_t]
OPENJP2.opj_create_decompress.restype = codec_t_p
OPENJP2.opj_create_decompress.argtypes = [CODEC_FORMAT_TYPE]
OPENJP2.opj_create_decompress.restype = CODEC_TYPE
ARGTYPES = [codec_t_p, stream_t_p, ctypes.POINTER(image_t)]
ARGTYPES = [CODEC_TYPE, STREAM_TYPE_P, ctypes.POINTER(ImageType)]
OPENJP2.opj_decode.argtypes = ARGTYPES
ARGTYPES = [codec_t_p, ctypes.c_uint32,
ARGTYPES = [CODEC_TYPE, ctypes.c_uint32,
ctypes.POINTER(ctypes.c_uint8),
ctypes.c_uint32,
stream_t_p]
STREAM_TYPE_P]
OPENJP2.opj_decode_tile_data.argtypes = ARGTYPES
ARGTYPES = [ctypes.POINTER(ctypes.POINTER(codestream_info_v2_t))]
ARGTYPES = [ctypes.POINTER(ctypes.POINTER(CodestreamInfoV2))]
OPENJP2.opj_destroy_cstr_info.argtypes = ARGTYPES
OPENJP2.opj_destroy_cstr_info.restype = ctypes.c_void_p
ARGTYPES = [codec_t_p, stream_t_p]
ARGTYPES = [CODEC_TYPE, STREAM_TYPE_P]
OPENJP2.opj_encode.argtypes = ARGTYPES
OPENJP2.opj_get_cstr_info.argtypes = [codec_t_p]
OPENJP2.opj_get_cstr_info.restype = ctypes.POINTER(codestream_info_v2_t)
OPENJP2.opj_get_cstr_info.argtypes = [CODEC_TYPE]
OPENJP2.opj_get_cstr_info.restype = ctypes.POINTER(CodestreamInfoV2)
ARGTYPES = [codec_t_p,
stream_t_p,
ctypes.POINTER(image_t),
ARGTYPES = [CODEC_TYPE,
STREAM_TYPE_P,
ctypes.POINTER(ImageType),
ctypes.c_uint32]
OPENJP2.opj_get_decoded_tile.argtypes = ARGTYPES
ARGTYPES = [ctypes.c_uint32,
ctypes.POINTER(image_comptparm_t),
color_space_t]
ctypes.POINTER(ImageComptParmType),
COLOR_SPACE_TYPE]
OPENJP2.opj_image_create.argtypes = ARGTYPES
OPENJP2.opj_image_create.restype = ctypes.POINTER(image_t)
OPENJP2.opj_image_create.restype = ctypes.POINTER(ImageType)
ARGTYPES = [ctypes.c_uint32,
ctypes.POINTER(image_comptparm_t),
color_space_t]
ctypes.POINTER(ImageComptParmType),
COLOR_SPACE_TYPE]
OPENJP2.opj_image_tile_create.argtypes = ARGTYPES
OPENJP2.opj_image_tile_create.restype = ctypes.POINTER(image_t)
OPENJP2.opj_image_tile_create.restype = ctypes.POINTER(ImageType)
OPENJP2.opj_image_destroy.argtypes = [ctypes.POINTER(image_t)]
OPENJP2.opj_image_destroy.argtypes = [ctypes.POINTER(ImageType)]
ARGTYPES = [stream_t_p, codec_t_p,
ctypes.POINTER(ctypes.POINTER(image_t))]
ARGTYPES = [STREAM_TYPE_P, CODEC_TYPE,
ctypes.POINTER(ctypes.POINTER(ImageType))]
OPENJP2.opj_read_header.argtypes = ARGTYPES
ARGTYPES = [codec_t_p,
stream_t_p,
ARGTYPES = [CODEC_TYPE,
STREAM_TYPE_P,
ctypes.POINTER(ctypes.c_uint32),
ctypes.POINTER(ctypes.c_uint32),
ctypes.POINTER(ctypes.c_int32),
@ -593,56 +613,56 @@ if OPENJP2 is not None:
ctypes.POINTER(ctypes.c_int32),
ctypes.POINTER(ctypes.c_int32),
ctypes.POINTER(ctypes.c_uint32),
ctypes.POINTER(bool_t)]
ctypes.POINTER(BOOL_TYPE)]
OPENJP2.opj_read_tile_header.argtypes = ARGTYPES
ARGTYPES = [codec_t_p, ctypes.POINTER(image_t), ctypes.c_int32,
ARGTYPES = [CODEC_TYPE, ctypes.POINTER(ImageType), ctypes.c_int32,
ctypes.c_int32, ctypes.c_int32, ctypes.c_int32]
OPENJP2.opj_set_decode_area.argtypes = ARGTYPES
ARGTYPES = [ctypes.POINTER(cparameters_t)]
ARGTYPES = [ctypes.POINTER(CompressionParametersType)]
OPENJP2.opj_set_default_encoder_parameters.argtypes = ARGTYPES
ARGTYPES = [ctypes.POINTER(dparameters_t)]
ARGTYPES = [ctypes.POINTER(DecompressionParametersType)]
OPENJP2.opj_set_default_decoder_parameters.argtypes = ARGTYPES
ARGTYPES = [codec_t_p, ctypes.c_void_p, ctypes.c_void_p]
ARGTYPES = [CODEC_TYPE, ctypes.c_void_p, ctypes.c_void_p]
OPENJP2.opj_set_error_handler.argtypes = ARGTYPES
OPENJP2.opj_set_info_handler.argtypes = ARGTYPES
OPENJP2.opj_set_warning_handler.argtypes = ARGTYPES
ARGTYPES = [codec_t_p, ctypes.POINTER(dparameters_t)]
ARGTYPES = [CODEC_TYPE, ctypes.POINTER(DecompressionParametersType)]
OPENJP2.opj_setup_decoder.argtypes = ARGTYPES
ARGTYPES = [codec_t_p,
ctypes.POINTER(cparameters_t),
ctypes.POINTER(image_t)]
ARGTYPES = [CODEC_TYPE,
ctypes.POINTER(CompressionParametersType),
ctypes.POINTER(ImageType)]
OPENJP2.opj_setup_encoder.argtypes = ARGTYPES
ARGTYPES = [ctypes.c_char_p, ctypes.c_int32]
OPENJP2.opj_stream_create_default_file_stream_v3.argtypes = ARGTYPES
OPENJP2.opj_stream_create_default_file_stream_v3.restype = stream_t_p
OPENJP2.opj_stream_create_default_file_stream_v3.restype = STREAM_TYPE_P
ARGTYPES = [codec_t_p, ctypes.POINTER(image_t), stream_t_p]
ARGTYPES = [CODEC_TYPE, ctypes.POINTER(ImageType), STREAM_TYPE_P]
OPENJP2.opj_start_compress.argtypes = ARGTYPES
OPENJP2.opj_end_compress.argtypes = [codec_t_p, stream_t_p]
OPENJP2.opj_end_decompress.argtypes = [codec_t_p, stream_t_p]
OPENJP2.opj_end_compress.argtypes = [CODEC_TYPE, STREAM_TYPE_P]
OPENJP2.opj_end_decompress.argtypes = [CODEC_TYPE, STREAM_TYPE_P]
OPENJP2.opj_stream_destroy_v3.argtypes = [stream_t_p]
OPENJP2.opj_destroy_codec.argtypes = [codec_t_p]
OPENJP2.opj_stream_destroy_v3.argtypes = [STREAM_TYPE_P]
OPENJP2.opj_destroy_codec.argtypes = [CODEC_TYPE]
ARGTYPES = [codec_t_p,
ARGTYPES = [CODEC_TYPE,
ctypes.c_uint32,
ctypes.POINTER(ctypes.c_uint8),
ctypes.c_uint32,
stream_t_p]
STREAM_TYPE_P]
OPENJP2.opj_write_tile.argtypes = ARGTYPES
def check_error(status):
"""Set a generic function as the restype attribute of all OpenJPEG
functions that return a bool_t value. This way we do not have to check
functions that return a BOOL_TYPE value. This way we do not have to check
for error status in each wrapping function and an exception will always be
appropriately raised.
"""
@ -683,7 +703,7 @@ def create_compress(codec_format):
Returns
-------
codec : Reference to codec_t_p instance.
codec : Reference to CODEC_TYPE instance.
"""
codec = OPENJP2.opj_create_compress(codec_format)
return codec
@ -696,11 +716,11 @@ def decode(codec, stream, image):
Parameters
----------
codec : codec_t_p
codec : CODEC_TYPE
The JPEG2000 codec
stream : stream_t_p
stream : STREAM_TYPE_P
The stream to decode.
image : image_t
image : ImageType
Output image structure.
Raises
@ -718,7 +738,7 @@ def decode_tile_data(codec, tidx, data, data_size, stream):
Parameters
----------
codec : codec_t_p
codec : CODEC_TYPE
The JPEG2000 codec
tile_index : int
The index of the tile being decoded
@ -726,7 +746,7 @@ def decode_tile_data(codec, tidx, data, data_size, stream):
Holds a memory block into which data will be decoded.
data_size : int
The size of data in bytes
stream : stream_t_p
stream : STREAM_TYPE_P
The stream to decode.
Raises
@ -755,7 +775,7 @@ def create_decompress(codec_format):
Returns
-------
codec : Reference to codec_t_p instance.
codec : Reference to CODEC_TYPE instance.
"""
codec = OPENJP2.opj_create_decompress(codec_format)
return codec
@ -768,7 +788,7 @@ def destroy_codec(codec):
Parameters
----------
codec : codec_t_p
codec : CODEC_TYPE
Decompressor handle to destroy.
"""
OPENJP2.opj_destroy_codec(codec)
@ -781,9 +801,9 @@ def encode(codec, stream):
Parameters
----------
codec : codec_t_p
codec : CODEC_TYPE
The jpeg2000 codec.
stream : stream_t_p
stream : STREAM_TYPE_P
The stream to which data is written.
Raises
@ -801,12 +821,12 @@ def get_cstr_info(codec):
Parameters
----------
codec : codec_t_p
codec : CODEC_TYPE
The jpeg2000 codec.
Returns
-------
cstr_info_p : codestream_info_v2_t
cstr_info_p : CodestreamInfoV2
Reference to codestream information.
"""
cstr_info_p = OPENJP2.opj_get_cstr_info(codec)
@ -820,11 +840,11 @@ def get_decoded_tile(codec, stream, imagep, tile_index):
Parameters
----------
codec : codec_t_p
codec : CODEC_TYPE
The jpeg2000 codec.
stream : stream_t_p
stream : STREAM_TYPE_P
The input stream.
image : image_t
image : ImageType
Output image structure.
tiler_index : int
Index of the tile which will be decoded.
@ -844,7 +864,7 @@ def destroy_cstr_info(cstr_info_p):
Parameters
----------
cstr_info_p : codestream_info_v2_t pointer
cstr_info_p : CodestreamInfoV2 pointer
Pointer to codestream info structure.
"""
OPENJP2.opj_destroy_cstr_info(ctypes.byref(cstr_info_p))
@ -857,9 +877,9 @@ def end_compress(codec, stream):
Parameters
----------
codec : codec_t_p
codec : CODEC_TYPE
Compressor handle.
stream : stream_t_p
stream : STREAM_TYPE_P
Output stream buffer.
Raises
@ -877,9 +897,9 @@ def end_decompress(codec, stream):
Parameters
----------
codec : codec_t_p
codec : CODEC_TYPE
Compressor handle.
stream : stream_t_p
stream : STREAM_TYPE_P
Output stream buffer.
Raises
@ -897,7 +917,7 @@ def image_destroy(image):
Parameters
----------
image : image_t pointer
image : ImageType pointer
Image resource to be disposed.
"""
OPENJP2.opj_image_destroy(image)
@ -917,12 +937,12 @@ def image_create(comptparms, clrspc):
Returns
-------
image : image_t
Reference to image_t instance.
image : ImageType
Reference to ImageType instance.
"""
image = OPENJP2.opj_image_create(len(comptparms),
comptparms,
clrspc)
comptparms,
clrspc)
return image
@ -940,12 +960,12 @@ def image_tile_create(comptparms, clrspc):
Returns
-------
image : image_t
Reference to image_t instance.
image : ImageType
Reference to ImageType instance.
"""
image = OPENJP2.opj_image_tile_create(len(comptparms),
comptparms,
clrspc)
comptparms,
clrspc)
return image
@ -956,14 +976,14 @@ def read_header(stream, codec):
Parameters
----------
stream: stream_t_p
stream: STREAM_TYPE_P
The JPEG2000 stream.
codec: codec_t
The JPEG2000 codec to read.
Returns
-------
imagep : reference to image_t instance
imagep : reference to ImageType instance
The image structure initialized with image characteristics.
Raises
@ -971,7 +991,7 @@ def read_header(stream, codec):
RuntimeError
If the OpenJPEG library routine opj_read_header fails.
"""
imagep = ctypes.POINTER(image_t)()
imagep = ctypes.POINTER(ImageType)()
OPENJP2.opj_read_header(stream, codec, ctypes.byref(imagep))
return imagep
@ -985,7 +1005,7 @@ def read_tile_header(codec, stream):
----------
codec : codec_t
The JPEG2000 codec to read.
stream : stream_t_p
stream : STREAM_TYPE_P
The JPEG2000 stream.
Returns
@ -1015,17 +1035,17 @@ def read_tile_header(codec, stream):
col1 = ctypes.c_int32()
row1 = ctypes.c_int32()
ncomps = ctypes.c_uint32()
go_on = bool_t()
go_on = BOOL_TYPE()
OPENJP2.opj_read_tile_header(codec,
stream,
ctypes.byref(tile_index),
ctypes.byref(data_size),
ctypes.byref(col0),
ctypes.byref(row0),
ctypes.byref(col1),
ctypes.byref(row1),
ctypes.byref(ncomps),
ctypes.byref(go_on))
stream,
ctypes.byref(tile_index),
ctypes.byref(data_size),
ctypes.byref(col0),
ctypes.byref(row0),
ctypes.byref(col1),
ctypes.byref(row1),
ctypes.byref(ncomps),
ctypes.byref(go_on))
go_on = bool(go_on.value)
return (tile_index.value,
data_size.value,
@ -1045,9 +1065,9 @@ def set_decode_area(codec, image, start_x=0, start_y=0, end_x=0, end_y=0):
Parameters
----------
codec : codec_t_p
codec : CODEC_TYPE
Codec initialized by create_decompress function.
image : image_t pointer
image : ImageType pointer
The decoded image previously set by read_header.
start_x, start_y : optional, int
The left and upper position of the rectangle to decode.
@ -1073,10 +1093,10 @@ def set_default_decoder_parameters():
Returns
-------
dparam : dparameters_t
dparam : DecompressionParametersType
Decompression parameters.
"""
dparams = dparameters_t()
dparams = DecompressionParametersType()
OPENJP2.opj_set_default_decoder_parameters(ctypes.byref(dparams))
return dparams
@ -1108,10 +1128,10 @@ def set_default_encoder_parameters():
Returns
-------
cparameters : cparameters_t
cparameters : CompressionParametersType
Compression parameters.
"""
cparams = cparameters_t()
cparams = CompressionParametersType()
OPENJP2.opj_set_default_encoder_parameters(ctypes.byref(cparams))
return cparams
@ -1123,7 +1143,7 @@ def set_error_handler(codec, handler, data=None):
Parameters
----------
codec : codec_t_p
codec : CODEC_TYPE
Codec initialized by create_compress function.
handler : python function
The callback function to be used.
@ -1145,7 +1165,7 @@ def set_info_handler(codec, handler, data=None):
Parameters
----------
codec : codec_t_p
codec : CODEC_TYPE
Codec initialized by create_compress function.
handler : python function
The callback function to be used.
@ -1167,7 +1187,7 @@ def set_warning_handler(codec, handler, data=None):
Parameters
----------
codec : codec_t_p
codec : CODEC_TYPE
Codec initialized by create_compress function.
handler : python function
The callback function to be used.
@ -1189,9 +1209,9 @@ def setup_decoder(codec, dparams):
Parameters
----------
codec: codec_t_p
codec: CODEC_TYPE
Codec initialized by create_compress function.
dparams: dparameters_t
dparams: DecompressionParametersType
Decompression parameters.
Raises
@ -1210,11 +1230,11 @@ def setup_encoder(codec, cparams, image):
Parameters
----------
codec : codec_t_p
codec : CODEC_TYPE
codec initialized by create_compress function
cparams : cparameters_t
cparams : CompressionParametersType
compression parameters
image : image_t
image : ImageType
input-filled image
Raises
@ -1232,11 +1252,11 @@ def start_compress(codec, image, stream):
Parameters
----------
codec : codec_t_p
codec : CODEC_TYPE
Compressor handle.
image : pointer to image_t
image : pointer to ImageType
Input filled image.
stream : stream_t_p
stream : STREAM_TYPE_P
Input stream.
Raises
@ -1278,7 +1298,7 @@ def stream_destroy_v3(stream):
Parameters
----------
stream : stream_t_p
stream : STREAM_TYPE_P
The file stream.
"""
OPENJP2.opj_stream_destroy_v3(stream)
@ -1291,7 +1311,7 @@ def write_tile(codec, tile_index, data, data_size, stream):
Parameters
----------
codec : codec_t_p
codec : CODEC_TYPE
The jpeg2000 codec
tile_index : int
The index of the tile to write, zero-indexing assumed
@ -1299,7 +1319,7 @@ def write_tile(codec, tile_index, data, data_size, stream):
Image data arranged in usual C-order
data_size : int
Size of a tile in bytes
stream : stream_t_p
stream : STREAM_TYPE_P
The stream to write data to
Raises
@ -1309,10 +1329,10 @@ def write_tile(codec, tile_index, data, data_size, stream):
"""
datap = data.ctypes.data_as(ctypes.POINTER(ctypes.c_uint8))
OPENJP2.opj_write_tile(codec,
ctypes.c_uint32(int(tile_index)),
datap,
ctypes.c_uint32(int(data_size)),
stream)
ctypes.c_uint32(int(tile_index)),
datap,
ctypes.c_uint32(int(data_size)),
stream)
def set_error_message(msg):

View file

@ -1,27 +1,30 @@
"""Wraps library calls to openjpeg.
"""
# pylint: disable=R0903
import ctypes
from ctypes.util import find_library
import platform
import os
from .config import glymur_config
_, OPENJPEG = glymur_config()
PATH_LEN = 4096 # maximum allowed size for filenames
class event_mgr_t(ctypes.Structure):
class EventMgrType(ctypes.Structure):
"""Message handler object.
Corresponds to event_mgr_t type in openjpeg headers.
"""
_fields_ = [("error_handler", ctypes.c_void_p),
("warning_handler", ctypes.c_void_p),
("info_handler", ctypes.c_void_p)]
class common_struct_t(ctypes.Structure):
class CommonStructType(ctypes.Structure):
"""Common fields between JPEG 2000 compression and decompression contextx.
"""
_fields_ = [("event_mgr", ctypes.POINTER(event_mgr_t)),
_fields_ = [("event_mgr", ctypes.POINTER(EventMgrType)),
("client_data", ctypes.c_void_p),
("is_decompressor", ctypes.c_bool),
("codec_format", ctypes.c_int),
@ -30,16 +33,20 @@ class common_struct_t(ctypes.Structure):
("mj2_handle", ctypes.c_void_p)]
class dinfo_t(ctypes.Structure):
"""Common fields between JPEG 2000 compression and decompression contextx.
This is for decompression contexts.
class DecompressionInfoType(ctypes.Structure):
"""This is for decompression contexts.
Corresponds to dinfo_t type in openjpeg headers.
"""
pass
class cio_t(ctypes.Structure):
_fields_ = [# codec context
("cinfo", ctypes.POINTER(common_struct_t)),
class CioType(ctypes.Structure):
"""Byte input-output stream (CIO)
Corresponds to cio_t in openjpeg headers.
"""
_fields_ = [("cinfo", ctypes.POINTER(CommonStructType)), # codec context
# STREAM_READ or STREAM_WRITE
("openmode", ctypes.c_int),
# pointer to start of buffer
@ -54,7 +61,11 @@ class cio_t(ctypes.Structure):
("bp", ctypes.c_char_p)]
class dparameters_t(ctypes.Structure):
class DecompressionParametersType(ctypes.Structure):
"""Decompression parameters.
Corresponds to dparameters_t type in openjpeg headers.
"""
# cp_reduce: the number of highest resolution levels to be discarded
_fields_ = [("cp_reduce", ctypes.c_int),
# cp_layer: the maximum number of quality layers to decode
@ -79,8 +90,11 @@ class dparameters_t(ctypes.Structure):
("flags", ctypes.c_uint)]
class image_comp_t(ctypes.Structure):
"""Defines a single image component. """
class ImageCompType(ctypes.Structure):
"""Defines a single image component.
Corresponds to image_comp_t type in openjpeg.
"""
_fields_ = [("dx", ctypes.c_int),
("dy", ctypes.c_int),
("w", ctypes.c_int),
@ -95,65 +109,79 @@ class image_comp_t(ctypes.Structure):
("data", ctypes.POINTER(ctypes.c_int))]
class image_t(ctypes.Structure):
"""Defines image data and characteristics."""
class ImageType(ctypes.Structure):
"""Defines image data and characteristics.
Corresponds to image_t type in openjpeg headers.
"""
_fields_ = [("x0", ctypes.c_int),
("y0", ctypes.c_int),
("x1", ctypes.c_int),
("y1", ctypes.c_int),
("numcomps", ctypes.c_int),
("color_space", ctypes.c_int),
("comps", ctypes.POINTER(image_comp_t)),
("comps", ctypes.POINTER(ImageCompType)),
("icc_profile_buf", ctypes.c_char_p),
("icc_profile_len", ctypes.c_int)]
def cio_open(cinfo, src):
"""Wrapper for openjpeg library function opj_cio_open."""
argtypes = [ctypes.POINTER(common_struct_t), ctypes.c_char_p, ctypes.c_int]
argtypes = [ctypes.POINTER(CommonStructType), ctypes.c_char_p,
ctypes.c_int]
OPENJPEG.opj_cio_open.argtypes = argtypes
OPENJPEG.opj_cio_open.restype = ctypes.POINTER(cio_t)
OPENJPEG.opj_cio_open.restype = ctypes.POINTER(CioType)
cio = OPENJPEG.opj_cio_open(ctypes.cast(cinfo, ctypes.POINTER(common_struct_t)),
cio = OPENJPEG.opj_cio_open(ctypes.cast(cinfo,
ctypes.POINTER(CommonStructType)),
src, len(src))
return cio
def cio_close(cio):
"""Wraps openjpeg library function cio_close.
"""
OPENJPEG.opj_cio_close.argtypes = [ctypes.POINTER(cio_t)]
OPENJPEG.opj_cio_close.argtypes = [ctypes.POINTER(CioType)]
OPENJPEG.opj_cio_close(cio)
def create_decompress(fmt):
"""Wraps openjpeg library function opj_create_decompress.
"""
OPENJPEG.opj_create_decompress.argtypes = [ctypes.c_int]
OPENJPEG.opj_create_decompress.restype = ctypes.POINTER(dinfo_t)
restype = ctypes.POINTER(DecompressionInfoType)
OPENJPEG.opj_create_decompress.restype = restype
dinfo = OPENJPEG.opj_create_decompress(fmt)
return dinfo
def decode(dinfo, cio):
"""Wrapper for opj_decode.
"""
argtypes = [ctypes.POINTER(dinfo_t), ctypes.POINTER(cio_t)]
argtypes = [ctypes.POINTER(DecompressionInfoType), ctypes.POINTER(CioType)]
OPENJPEG.opj_decode.argtypes = argtypes
OPENJPEG.opj_decode.restype = ctypes.POINTER(image_t)
OPENJPEG.opj_decode.restype = ctypes.POINTER(ImageType)
image = OPENJPEG.opj_decode(dinfo, cio)
return image
def destroy_decompress(dinfo):
"""Wraps openjpeg library function opj_destroy_decompress."""
OPENJPEG.opj_destroy_decompress.argtypes = [ctypes.POINTER(dinfo_t)]
argtypes = [ctypes.POINTER(DecompressionInfoType)]
OPENJPEG.opj_destroy_decompress.argtypes = argtypes
OPENJPEG.opj_destroy_decompress(dinfo)
def image_destroy(image):
"""Wraps openjpeg library function opj_image_destroy."""
OPENJPEG.opj_image_destroy.argtypes = [ctypes.POINTER(image_t)]
OPENJPEG.opj_image_destroy.argtypes = [ctypes.POINTER(ImageType)]
OPENJPEG.opj_image_destroy(image)
def set_default_decoder_parameters(dparams_p):
"""Wrapper for opj_set_default_decoder_parameters.
"""
argtypes = [ctypes.POINTER(dparameters_t)]
argtypes = [ctypes.POINTER(DecompressionParametersType)]
OPENJPEG.opj_set_default_decoder_parameters.argtypes = argtypes
OPENJPEG.opj_set_default_decoder_parameters(dparams_p)
@ -161,21 +189,25 @@ def set_default_decoder_parameters(dparams_p):
def set_event_mgr(dinfo, event_mgr, context=None):
"""Wrapper for openjpeg library function opj_set_event_mgr.
"""
argtypes = [ctypes.POINTER(common_struct_t),
ctypes.POINTER(event_mgr_t),
argtypes = [ctypes.POINTER(CommonStructType),
ctypes.POINTER(EventMgrType),
ctypes.c_void_p]
OPENJPEG.opj_set_event_mgr.argtypes = argtypes
OPENJPEG.opj_set_event_mgr(ctypes.cast(dinfo,
ctypes.POINTER(common_struct_t)),
ctypes.POINTER(CommonStructType)),
event_mgr, context)
def setup_decoder(dinfo, dparams):
"""Wrapper for openjpeg library function opj_setup_decoder."""
argtypes = [ctypes.POINTER(dinfo_t), ctypes.POINTER(dparameters_t)]
argtypes = [ctypes.POINTER(DecompressionInfoType),
ctypes.POINTER(DecompressionParametersType)]
OPENJPEG.opj_setup_decoder.argtypes = argtypes
OPENJPEG.opj_setup_decoder(dinfo, dparams)
def version():
"""Wrapper for opj_version library routine."""
OPENJPEG.opj_version.restype = ctypes.c_char_p
v = OPENJPEG.opj_version()
return v.decode('utf-8')
library_version = OPENJPEG.opj_version()
return library_version.decode('utf-8')

View file

@ -32,7 +32,7 @@ class TestOpenJP2(unittest.TestCase):
self.assertEqual(cparams.subsampling_dx, 1)
self.assertEqual(cparams.subsampling_dy, 1)
self.assertEqual(cparams.mode, 0)
self.assertEqual(cparams.prog_order, glymur.lib._openjp2.LRCP)
self.assertEqual(cparams.prog_order, glymur.core.LRCP)
self.assertEqual(cparams.roi_shift, 0)
self.assertEqual(cparams.cp_tx0, 0)
self.assertEqual(cparams.cp_ty0, 0)
@ -164,9 +164,9 @@ class TestOpenJP2(unittest.TestCase):
l_param.numresolution = 6
l_param.prog_order = glymur.lib._openjp2.LRCP
l_param.prog_order = glymur.core.LRCP
l_params = (glymur.lib._openjp2.image_comptparm_t * num_comps)()
l_params = (glymur.lib._openjp2.ImageComptParmType * num_comps)()
for j in range(num_comps):
l_params[j].dx = 1
l_params[j].dy = 1

View file

@ -21,7 +21,7 @@ class TestOpenJPEG(unittest.TestCase):
def test_set_default_decoder_parameters(self):
# Verify that we properly set the default decode parameters.
dp = glymur.lib._openjpeg.dparameters_t()
dp = glymur.lib._openjpeg.DecompressionParametersType()
glymur.lib._openjpeg.set_default_decoder_parameters(ctypes.byref(dp))
self.assertEqual(dp.cp_reduce, 0)

View file

@ -1569,7 +1569,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[3].spcod[7] & 0x0020)
self.assertEqual(c.segment[3].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
# SOT: start of tile part
self.assertEqual(c.segment[4].isot, 0)
@ -1623,7 +1623,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertTrue(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
# COC: Coding style component
self.assertEqual(c.segment[3].ccoc, 0)
@ -1643,7 +1643,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertTrue(c.segment[3].spcoc[3] & 0x0020)
self.assertEqual(c.segment[3].spcoc[4],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
# QCD: Quantization default
# quantization type
@ -1729,7 +1729,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
# QCD: Quantization default
# quantization type
@ -1846,7 +1846,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(c.segment[2]._precinct_size,
[(128, 128), (128, 128), (128, 128), (128, 128),
(128, 128), (128, 128), (128, 128)])
@ -1955,7 +1955,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# COC: Coding style component
@ -1976,7 +1976,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[3].spcoc[3] & 0x0020)
self.assertEqual(c.segment[3].spcoc[4],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
# COC: Coding style component
self.assertEqual(c.segment[4].ccoc, 3)
@ -1996,7 +1996,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[4].spcoc[3] & 0x0020)
self.assertEqual(c.segment[4].spcoc[4],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
# QCD: Quantization default
# quantization type
@ -2098,7 +2098,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -2167,7 +2167,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[7].spcoc[3] & 0x0020)
self.assertEqual(c.segment[7].spcoc[4],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
# RGN: region of interest
self.assertEqual(c.segment[8].crgn, 0) # component
@ -2235,7 +2235,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -2320,7 +2320,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# COC: Coding style component
@ -2341,7 +2341,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[3].spcoc[3] & 0x0020)
self.assertEqual(c.segment[3].spcoc[4],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
# COC: Coding style component
self.assertEqual(c.segment[4].ccoc, 1)
@ -2361,7 +2361,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[4].spcoc[3] & 0x0020)
self.assertEqual(c.segment[4].spcoc[4],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
# COC: Coding style component
self.assertEqual(c.segment[5].ccoc, 2)
@ -2381,7 +2381,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[5].spcoc[3] & 0x0020)
self.assertEqual(c.segment[5].spcoc[4],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
# QCD: Quantization default
# quantization type
@ -2473,7 +2473,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -2553,7 +2553,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -2694,7 +2694,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertTrue(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(c.segment[2]._precinct_size, [(128, 2)])
# QCD: Quantization default
@ -2775,7 +2775,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -2856,7 +2856,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# COC: Coding style component
@ -2876,7 +2876,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[3].spcoc[3] & 0x0020)
self.assertEqual(c.segment[3].spcoc[4],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
# QCD: Quantization default
# quantization type
@ -2982,7 +2982,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -3058,7 +3058,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -3212,7 +3212,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -3280,7 +3280,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertTrue(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# COC: Coding style component
@ -3300,7 +3300,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertTrue(c.segment[3].spcoc[3] & 0x0020)
self.assertEqual(c.segment[3].spcoc[4],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
# QCD: Quantization default
# quantization type
@ -3381,7 +3381,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(c.segment[2]._precinct_size,
[(128, 128), (256, 256), (512, 512), (1024, 1024),
(2048, 2048), (4096, 4096), (8192, 8192)])
@ -3495,7 +3495,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# COC: Coding style component
@ -3515,7 +3515,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[3].spcoc[3] & 0x0020)
self.assertEqual(c.segment[3].spcoc[4],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
# COC: Coding style component
self.assertEqual(c.segment[4].ccoc, 3)
@ -3534,7 +3534,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[4].spcoc[3] & 0x0020)
self.assertEqual(c.segment[4].spcoc[4],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
# QCD: Quantization default
# quantization type
@ -3641,7 +3641,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -3768,7 +3768,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(c.segment[2]._precinct_size, [(16, 16)] * 8)
self.assertEqual(c.segment[3].sqcd & 0x1f, 2) # expounded
@ -3856,7 +3856,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertTrue(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -3949,7 +3949,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(c.segment[2]._precinct_size, [(1, 1), (2, 2)])
# COC: Coding style component
@ -3969,7 +3969,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[3].spcoc[3] & 0x0020)
self.assertEqual(c.segment[3].spcoc[4],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(c.segment[3]._precinct_size, [(2, 2), (4, 4)])
# QCD: Quantization default
@ -4489,7 +4489,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(c.segment[2]._precinct_size[0], (128, 128))
self.assertEqual(c.segment[2]._precinct_size[1:], [(256, 256)] * 5)
@ -4521,7 +4521,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[4].spcoc[3] & 0x0020)
self.assertEqual(c.segment[4].spcoc[4],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
# QCC: Quantization component
# associated component
@ -4553,7 +4553,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[6].spcoc[3] & 0x0020)
self.assertEqual(c.segment[6].spcoc[4],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
# QCC: Quantization component
# associated component
@ -4641,7 +4641,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(c.segment[2]._precinct_size,
[(16, 16), (32, 32), (64, 64), (128, 128),
(128, 128), (128, 128)])
@ -4698,7 +4698,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
ids = [x.marker_id for x in c.segment]
@ -4751,7 +4751,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
ids = [x.marker_id for x in c.segment]
@ -4813,7 +4813,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -4875,7 +4875,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -4946,7 +4946,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -5023,7 +5023,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -5083,7 +5083,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -5149,7 +5149,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -5234,7 +5234,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -5294,7 +5294,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -5352,7 +5352,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -5410,7 +5410,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -5471,7 +5471,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -5532,7 +5532,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -5592,7 +5592,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -5662,7 +5662,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -5732,7 +5732,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -5794,7 +5794,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -5857,7 +5857,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(c.segment[2]._precinct_size,
[(128, 128)] + [(256, 256)] * 5)
@ -5973,7 +5973,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[3].spcod[7] & 0x0020)
self.assertEqual(c.segment[3].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[3].spcod), 9)
# QCD: Quantization default
@ -6107,7 +6107,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[3].spcod[7] & 0x0020)
self.assertEqual(c.segment[3].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[3].spcod), 9)
# QCD: Quantization default
@ -6229,7 +6229,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -6383,7 +6383,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -6484,7 +6484,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -6583,7 +6583,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -6687,7 +6687,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE)
glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -6815,7 +6815,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -6930,7 +6930,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -7025,7 +7025,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -7133,7 +7133,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -7233,7 +7233,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default
@ -7342,7 +7342,7 @@ class TestSuiteDump(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# QCD: Quantization default

View file

@ -125,7 +125,7 @@ class TestSuiteWrite(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
def test_NR_ENC_Bretagne1_ppm_2_encode(self):
@ -183,7 +183,7 @@ class TestSuiteWrite(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
def test_NR_ENC_Bretagne1_ppm_3_encode(self):
@ -242,7 +242,7 @@ class TestSuiteWrite(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(c.segment[2]._precinct_size,
[(2, 2), (4, 4), (8, 8), (16, 16), (32, 32),
(64, 64)])
@ -305,7 +305,7 @@ class TestSuiteWrite(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(c.segment[2]._precinct_size,
[(16, 16), (32, 32), (64, 64)] + [(128, 128)] * 3)
@ -363,7 +363,7 @@ class TestSuiteWrite(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
def test_NR_ENC_Bretagne2_ppm_6_encode(self):
@ -420,7 +420,7 @@ class TestSuiteWrite(unittest.TestCase):
# Segmentation symbols
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# 18 SOP segments.
@ -480,7 +480,7 @@ class TestSuiteWrite(unittest.TestCase):
# Segmentation symbols, SEGMARK(SEGSYSM)
self.assertTrue(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
# 18 EPH segments.
@ -541,7 +541,7 @@ class TestSuiteWrite(unittest.TestCase):
# Segmentation symbols, SEGMARK(SEGSYSM)
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
def test_NR_ENC_Cevennes1_bmp_9_encode(self):
@ -597,7 +597,7 @@ class TestSuiteWrite(unittest.TestCase):
# Segmentation symbols, SEGMARK(SEGSYSM)
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
def test_NR_ENC_Cevennes2_ppm_10_encode(self):
@ -653,7 +653,7 @@ class TestSuiteWrite(unittest.TestCase):
# Segmentation symbols, SEGMARK(SEGSYSM)
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
def test_NR_ENC_Rome_bmp_11_encode(self):
@ -744,7 +744,7 @@ class TestSuiteWrite(unittest.TestCase):
# Segmentation symbols, SEGMARK(SEGSYSM)
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
@unittest.skip("Known failure in openjpeg test suite.")
@ -804,7 +804,7 @@ class TestSuiteWrite(unittest.TestCase):
# Segmentation symbols, SEGMARK(SEGSYSM)
self.assertFalse(c.segment[2].spcod[7] & 0x0020)
self.assertEqual(c.segment[2].spcod[8],
glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE)
glymur.core.WAVELET_XFORM_5X3_REVERSIBLE)
self.assertEqual(len(c.segment[2].spcod), 9)
if __name__ == "__main__":