Using existing openjp2 handlers for now. #112

Seems a little greasy, but it works.  Probably should think about a
separate error handler, though.
This commit is contained in:
jevans 2013-09-12 21:07:58 -04:00
commit cc10537c14
3 changed files with 53 additions and 43 deletions

View file

@ -428,8 +428,13 @@ class Jp2k(Jp2kBox):
# set encode format # set encode format
cinfo = opj.create_compress(cparams.codec_fmt) cinfo = opj.create_compress(cparams.codec_fmt)
event_mgr = opj.EventMgrType(None, None, None) event_mgr = opj.EventMgrType()
#opj.set_event_mgr(cparams, ctypes.byref(event_mgr), None) _info_handler = _INFO_CALLBACK if verbose else None
event_mgr.info_handler = _info_handler
event_mgr.warning_handler = ctypes.cast(_WARNING_CALLBACK,
ctypes.c_void_p)
event_mgr.error_handler = ctypes.cast(_ERROR_CALLBACK,
ctypes.c_void_p)
opj.setup_encoder(cinfo, ctypes.byref(cparams), image) opj.setup_encoder(cinfo, ctypes.byref(cparams), image)
@ -437,7 +442,9 @@ class Jp2k(Jp2kBox):
# allocate memory for all tiles # allocate memory for all tiles
cio = opj.cio_open(cinfo) cio = opj.cio_open(cinfo)
opj.encode(cinfo, cio, image) if not opj.encode(cinfo, cio, image):
raise IOError("Encode error.")
pos = opj.cio_tell(cio) pos = opj.cio_tell(cio)
ss = ctypes.string_at(cio.contents.buffer, pos) ss = ctypes.string_at(cio.contents.buffer, pos)
@ -773,6 +780,7 @@ class Jp2k(Jp2kBox):
raise IOError(msg) raise IOError(msg)
with ExitStack() as stack: with ExitStack() as stack:
try:
# Set decoding parameters. # Set decoding parameters.
dparameters = opj.DecompressionParametersType() dparameters = opj.DecompressionParametersType()
opj.set_default_decoder_parameters(ctypes.byref(dparameters)) opj.set_default_decoder_parameters(ctypes.byref(dparameters))
@ -809,6 +817,9 @@ class Jp2k(Jp2kBox):
data = extract_image_cube(image) data = extract_image_cube(image)
except ValueError:
opj2.check_error(0)
if data.shape[2] == 1: if data.shape[2] == 1:
# The third dimension has just a single layer. Make the image # The third dimension has just a single layer. Make the image
# data 2D instead of 3D. # data 2D instead of 3D.
@ -1465,18 +1476,18 @@ _CMPFUNC = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_char_p, ctypes.c_void_p)
def _default_error_handler(msg, _): def _default_error_handler(msg, _):
"""Default error handler callback for openjpeg library.""" """Default error handler callback for libopenjp2."""
msg = "OpenJPEG library error: {0}".format(msg.decode('utf-8').rstrip()) msg = "OpenJPEG library error: {0}".format(msg.decode('utf-8').rstrip())
opj2.set_error_message(msg) opj2.set_error_message(msg)
def _default_info_handler(msg, _): def _default_info_handler(msg, _):
"""Default info handler callback for openjpeg library.""" """Default info handler callback."""
print("[INFO] {0}".format(msg.decode('utf-8').rstrip())) print("[INFO] {0}".format(msg.decode('utf-8').rstrip()))
def _default_warning_handler(library_msg, _): def _default_warning_handler(library_msg, _):
"""Default warning handler callback for openjpeg library.""" """Default warning handler callback."""
library_msg = library_msg.decode('utf-8').rstrip() library_msg = library_msg.decode('utf-8').rstrip()
msg = "OpenJPEG library warning: {0}".format(library_msg) msg = "OpenJPEG library warning: {0}".format(library_msg)
warnings.warn(msg) warnings.warn(msg)

View file

@ -685,7 +685,7 @@ def check_error(status):
raise IOError("OpenJPEG function failure.") raise IOError("OpenJPEG function failure.")
# These library functions all return an error status. Circumvent that and # These library functions all return an error status. Circumvent that and
# force # them to raise an exception. # force them to raise an exception.
FCNS = ['opj_decode', 'opj_decode_tile_data', 'opj_end_compress', FCNS = ['opj_decode', 'opj_decode_tile_data', 'opj_end_compress',
'opj_encode', 'opj_end_decompress', 'opj_get_decoded_tile', 'opj_encode', 'opj_end_decompress', 'opj_get_decoded_tile',
'opj_read_header', 'opj_read_tile_header', 'opj_set_decode_area', 'opj_read_header', 'opj_read_tile_header', 'opj_set_decode_area',

View file

@ -527,8 +527,7 @@ def encode(cinfo, cio, image):
OPENJPEG.opj_encode.argtypes = argtypes OPENJPEG.opj_encode.argtypes = argtypes
OPENJPEG.opj_encode.restype = ctypes.c_int OPENJPEG.opj_encode.restype = ctypes.c_int
status = OPENJPEG.opj_encode(cinfo, cio, image) status = OPENJPEG.opj_encode(cinfo, cio, image)
if not status: return status
raise RuntimeError("opj_encode failed")
def destroy_decompress(dinfo): def destroy_decompress(dinfo):