Some read support in 2.0.0. Some segfaults, though. #90

This commit is contained in:
jevans 2013-07-28 16:14:20 -04:00
commit b0566e4791
2 changed files with 65 additions and 15 deletions

View file

@ -32,6 +32,7 @@ from .jp2box import ImageHeaderBox
from .jp2box import ColourSpecificationBox
from .lib import _openjpeg as _opj
from .lib import _openjp2 as _opj2
from .lib import c
_COLORSPACE_MAP = {'rgb': _opj2.CLRSPC_SRGB,
'gray': _opj2.CLRSPC_GRAY,
@ -882,9 +883,15 @@ class Jp2k(Jp2kBox):
dparam.nb_tile_to_decode = 1
with ExitStack() as stack:
stream = _opj2.stream_create_default_file_stream_v3(self.filename,
True)
stack.callback(_opj2.stream_destroy_v3, stream)
if hasattr(_opj2.OPENJPEG, 'opj_stream_create_default_file_stream_v3'):
stream = _opj2.stream_create_default_file_stream_v3(self.filename,
True)
stack.callback(_opj2.stream_destroy_v3, stream)
else:
fptr = c.fopen(self.filename, 'rb')
stack.callback(c.fclose, fptr)
stream = _opj2.stream_create_default_file_stream(fptr, True)
stack.callback(_opj2.stream_destroy, stream)
codec = _opj2.create_decompress(self._codec_format)
stack.callback(_opj2.destroy_codec, codec)

View file

@ -639,9 +639,16 @@ if OPENJP2 is not None:
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_TYPE_P
if hasattr(OPENJP2, 'opj_stream_create_default_file_stream_v3'):
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_TYPE_P
OPENJP2.opj_stream_destroy_v3.argtypes = [STREAM_TYPE_P]
else:
ARGTYPES = [ctypes.c_void_p, ctypes.c_int32]
OPENJP2.opj_stream_create_default_file_stream.argtypes = ARGTYPES
OPENJP2.opj_stream_create_default_file_stream.restype = STREAM_TYPE_P
OPENJP2.opj_stream_destroy.argtypes = [STREAM_TYPE_P]
ARGTYPES = [CODEC_TYPE, ctypes.POINTER(ImageType), STREAM_TYPE_P]
OPENJP2.opj_start_compress.argtypes = ARGTYPES
@ -649,7 +656,6 @@ if OPENJP2 is not None:
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_TYPE_P]
OPENJP2.opj_destroy_codec.argtypes = [CODEC_TYPE]
ARGTYPES = [CODEC_TYPE,
@ -1267,16 +1273,17 @@ def start_compress(codec, image, stream):
OPENJP2.opj_start_compress(codec, image, stream)
def stream_create_default_file_stream_v3(fname, a_read_stream):
"""Wraps openjp2 library function opj_stream_create_default_vile_stream_v3.
def stream_create_default_file_stream(fptr, isa_read_stream):
"""Wraps openjp2 library function opj_stream_create_default_vile_stream.
Sets the stream to be a file stream.
Sets the stream to be a file stream. This is valid only for version 2.0.0
of OpenJPEG.
Parameters
----------
fname : str
Specifies a file.
a_read_stream: bool
fptr : ctypes.c_void_p
Corresponds to C file pointer. Must be obtained from libc.fopen.
isa_read_stream: bool
True (read) or False (write)
Returns
@ -1284,16 +1291,52 @@ def stream_create_default_file_stream_v3(fname, a_read_stream):
stream : stream_t
An OpenJPEG file stream.
"""
read_stream = 1 if a_read_stream else 0
read_stream = 1 if isa_read_stream else 0
stream = OPENJP2.opj_stream_create_default_file_stream(fptr, read_stream)
return stream
def stream_create_default_file_stream_v3(fname, isa_read_stream):
"""Wraps openjp2 library function opj_stream_create_default_vile_stream_v3.
Sets the stream to be a file stream. This function is only valid for the
trunk/development 2.0+ version of the openjp2 library.
Parameters
----------
fname : str
Specifies a file.
isa_read_stream: bool
True (read) or False (write)
Returns
-------
stream : stream_t
An OpenJPEG file stream.
"""
read_stream = 1 if isa_read_stream else 0
file_argument = ctypes.c_char_p(fname.encode())
stream = OPENJP2.opj_stream_create_default_file_stream_v3(file_argument,
read_stream)
return stream
def stream_destroy_v3(stream):
def stream_destroy(stream):
"""Wraps openjp2 library function opj_stream_destroy.
Destroys the stream created by create_stream.
Parameters
----------
stream : STREAM_TYPE_P
The file stream.
"""
OPENJP2.opj_stream_destroy(stream)
def stream_destroy_v3(stream):
"""Wraps openjp2 library function opj_stream_destroy_v3.
Destroys the stream created by create_stream_v3.
Parameters