Added negative test for cinema2k frame rate not 24 or 48. #139
Some refactoring of cinema2k code.
This commit is contained in:
parent
afa611ae54
commit
3bad8a4b2e
4 changed files with 88 additions and 68 deletions
133
glymur/jp2k.py
133
glymur/jp2k.py
|
|
@ -155,6 +155,73 @@ class Jp2k(Jp2kBox):
|
||||||
msg += "profile if the file type box brand is 'jp2 '."
|
msg += "profile if the file type box brand is 'jp2 '."
|
||||||
warnings.warn(msg)
|
warnings.warn(msg)
|
||||||
|
|
||||||
|
def _set_cinema_params(self, cparams, fps):
|
||||||
|
"""Populate compression parameters structure for cinema2K.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
fps : int
|
||||||
|
Frames per second, should be either 24 or 48.
|
||||||
|
"""
|
||||||
|
if fps not in [24, 48]:
|
||||||
|
raise IOError('Cinema2K frame rate must be either 24 or 48.')
|
||||||
|
cparams.cp_cinema = fps
|
||||||
|
|
||||||
|
cparams.cp_rsiz = RSIZ['CINEMA2K']
|
||||||
|
# No tiling
|
||||||
|
cparams.tile_size_on = opj2.FALSE
|
||||||
|
cparams.cp_tdx = 1
|
||||||
|
cparams.cp_tdy = 1
|
||||||
|
|
||||||
|
# One tile part for each component.
|
||||||
|
cparams.tp_flag = ord('C')
|
||||||
|
cparams.tp_on = 1
|
||||||
|
|
||||||
|
# tile and image shall be as (0,0)
|
||||||
|
cparams.cp_tx0 = 0
|
||||||
|
cparams.cp_ty0 = 0
|
||||||
|
cparams.image_offset_x0 = 0
|
||||||
|
cparams.image_offset_y0 = 0
|
||||||
|
|
||||||
|
# Codeblock size = 32 * 32
|
||||||
|
cparams.cblockw_init = 32
|
||||||
|
cparams.cblockh_init = 32
|
||||||
|
|
||||||
|
# code block style, no mode switch enabled.
|
||||||
|
cparams.mode = 0
|
||||||
|
|
||||||
|
# no ROI
|
||||||
|
cparams.roi_compno = -1
|
||||||
|
|
||||||
|
# no subsampling
|
||||||
|
cparams.subsampling_dx = 1
|
||||||
|
cparams.subsampling_dy = 1
|
||||||
|
|
||||||
|
# 9-7 transform
|
||||||
|
cparams.irreversible = 1
|
||||||
|
|
||||||
|
# number of layers
|
||||||
|
if cparams.tcp_numlayers > 1:
|
||||||
|
# TODO: warning or error
|
||||||
|
cparams.tcp_numlayers = 1
|
||||||
|
|
||||||
|
if cparams.numresolution > 6:
|
||||||
|
# TODO: warning or error
|
||||||
|
cparams.numresolution = 6
|
||||||
|
|
||||||
|
# precincts
|
||||||
|
cparams.csty |= 0x01
|
||||||
|
cparams.res_spec = cparams.numresolution - 1
|
||||||
|
for j in range(cparams.res_spec):
|
||||||
|
cparams.prcw_init[j] = 256
|
||||||
|
cparams.prch_init[j] = 256
|
||||||
|
|
||||||
|
# Progression order shall be CPRL
|
||||||
|
cparams.prog_order = PROGRESSION_ORDER['CPRL']
|
||||||
|
|
||||||
|
# progression order changes not allowed for 2K
|
||||||
|
cparams.numpocs = 0
|
||||||
|
|
||||||
def _populate_cparams(self, **kwargs):
|
def _populate_cparams(self, **kwargs):
|
||||||
"""Populate compression parameters structure from input arguments.
|
"""Populate compression parameters structure from input arguments.
|
||||||
|
|
||||||
|
|
@ -221,64 +288,8 @@ class Jp2k(Jp2kBox):
|
||||||
cparams.tcp_numlayers = 1
|
cparams.tcp_numlayers = 1
|
||||||
cparams.cp_disto_alloc = 1
|
cparams.cp_disto_alloc = 1
|
||||||
|
|
||||||
if 'cinema2K' in kwargs:
|
if 'cinema2k' in kwargs:
|
||||||
# TODO: error if either 24 or 48
|
self._set_cinema_params(cparams, kwargs['cinema2k'])
|
||||||
cparams.cp_cinema = kwargs['cinema2K']
|
|
||||||
|
|
||||||
cparams.cp_rsiz = RSIZ['CINEMA2K']
|
|
||||||
# No tiling
|
|
||||||
cparams.tile_size_on = opj2.FALSE
|
|
||||||
cparams.cp_tdx = 1
|
|
||||||
cparams.cp_tdy = 1
|
|
||||||
|
|
||||||
# One tile part for each component.
|
|
||||||
cparams.tp_flag = ord('C')
|
|
||||||
cparams.tp_on = 1
|
|
||||||
|
|
||||||
# tile and image shall be as (0,0)
|
|
||||||
cparams.cp_tx0 = 0
|
|
||||||
cparams.cp_ty0 = 0
|
|
||||||
cparams.image_offset_x0 = 0
|
|
||||||
cparams.image_offset_y0 = 0
|
|
||||||
|
|
||||||
# Codeblock size = 32 * 32
|
|
||||||
cparams.cblockw_init = 32
|
|
||||||
cparams.cblockh_init = 32
|
|
||||||
|
|
||||||
# code block style, no mode switch enabled.
|
|
||||||
cparams.mode = 0
|
|
||||||
|
|
||||||
# no ROI
|
|
||||||
cparams.roi_compno = -1
|
|
||||||
|
|
||||||
# no subsampling
|
|
||||||
cparams.subsampling_dx = 1
|
|
||||||
cparams.subsampling_dy = 1
|
|
||||||
|
|
||||||
# 9-7 transform
|
|
||||||
cparams.irreversible = 1
|
|
||||||
|
|
||||||
# number of layers
|
|
||||||
if cparams.tcp_numlayers > 1:
|
|
||||||
# TODO: warning or error
|
|
||||||
cparams.tcp_numlayers = 1
|
|
||||||
|
|
||||||
if cparams.numresolution > 6:
|
|
||||||
# TODO: warning or error
|
|
||||||
cparams.numresolution = 6
|
|
||||||
|
|
||||||
# precincts
|
|
||||||
cparams.csty |= 0x01
|
|
||||||
cparams.res_spec = cparams.numresolution - 1
|
|
||||||
for j in range(cparams.res_spec):
|
|
||||||
cparams.prcw_init[j] = 256
|
|
||||||
cparams.prch_init[j] = 256
|
|
||||||
|
|
||||||
# Progression order shall be CPRL
|
|
||||||
cparams.prog_order = PROGRESSION_ORDER['CPRL']
|
|
||||||
|
|
||||||
# progression order changes not allowed for 2K
|
|
||||||
cparams.numpocs = 0
|
|
||||||
return cparams
|
return cparams
|
||||||
|
|
||||||
if 'cbsize' in kwargs:
|
if 'cbsize' in kwargs:
|
||||||
|
|
@ -402,8 +413,8 @@ class Jp2k(Jp2kBox):
|
||||||
Image data to be written to file.
|
Image data to be written to file.
|
||||||
cbsize : tuple, optional
|
cbsize : tuple, optional
|
||||||
Code block size (DY, DX).
|
Code block size (DY, DX).
|
||||||
cinema2K : int, optional
|
cinema2k : int, optional
|
||||||
either 24 or 48
|
frames per second, either 24 or 48
|
||||||
colorspace : str, optional
|
colorspace : str, optional
|
||||||
Either 'rgb' or 'gray'.
|
Either 'rgb' or 'gray'.
|
||||||
cratios : iterable
|
cratios : iterable
|
||||||
|
|
@ -577,7 +588,7 @@ class Jp2k(Jp2kBox):
|
||||||
|
|
||||||
_populate_image_struct(cparams, image, img_array)
|
_populate_image_struct(cparams, image, img_array)
|
||||||
|
|
||||||
if 'cinema2K' in kwargs:
|
if 'cinema2k' in kwargs:
|
||||||
self._set_cinema_rate(cparams, image)
|
self._set_cinema_rate(cparams, image)
|
||||||
|
|
||||||
codec = opj2.create_compress(cparams.codec_fmt)
|
codec = opj2.create_compress(cparams.codec_fmt)
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ try:
|
||||||
HAS_PYTHON_XMP_TOOLKIT = True
|
HAS_PYTHON_XMP_TOOLKIT = True
|
||||||
else:
|
else:
|
||||||
HAS_PYTHON_XMP_TOOLKIT = False
|
HAS_PYTHON_XMP_TOOLKIT = False
|
||||||
except ImportError:
|
except:
|
||||||
HAS_PYTHON_XMP_TOOLKIT = False
|
HAS_PYTHON_XMP_TOOLKIT = False
|
||||||
|
|
||||||
# Need to know of the libopenjp2 version is the official 2.0.0 release and NOT
|
# Need to know of the libopenjp2 version is the official 2.0.0 release and NOT
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ try:
|
||||||
import skimage.io
|
import skimage.io
|
||||||
skimage.io.use_plugin('freeimage', 'imread')
|
skimage.io.use_plugin('freeimage', 'imread')
|
||||||
_HAS_SKIMAGE_FREEIMAGE_SUPPORT = True
|
_HAS_SKIMAGE_FREEIMAGE_SUPPORT = True
|
||||||
except ImportError:
|
except ((ImportError, RuntimeError)):
|
||||||
_HAS_SKIMAGE_FREEIMAGE_SUPPORT = False
|
_HAS_SKIMAGE_FREEIMAGE_SUPPORT = False
|
||||||
|
|
||||||
from .fixtures import read_image, NO_READ_BACKEND, NO_READ_BACKEND_MSG
|
from .fixtures import read_image, NO_READ_BACKEND, NO_READ_BACKEND_MSG
|
||||||
|
|
@ -25,7 +25,6 @@ from .fixtures import OPJ_DATA_ROOT, opj_data_file
|
||||||
from glymur import Jp2k
|
from glymur import Jp2k
|
||||||
import glymur
|
import glymur
|
||||||
|
|
||||||
|
|
||||||
@unittest.skipIf(os.name == "nt", "no write support on windows, period")
|
@unittest.skipIf(os.name == "nt", "no write support on windows, period")
|
||||||
@unittest.skipIf(re.match(r"""1\.[01234]\.\d""",
|
@unittest.skipIf(re.match(r"""1\.[01234]\.\d""",
|
||||||
glymur.version.openjpeg_version) is not None,
|
glymur.version.openjpeg_version) is not None,
|
||||||
|
|
@ -53,7 +52,7 @@ class TestSuiteWrite(unittest.TestCase):
|
||||||
data = skimage.io.imread(infile)
|
data = skimage.io.imread(infile)
|
||||||
with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile:
|
with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile:
|
||||||
j = Jp2k(tfile.name, 'wb')
|
j = Jp2k(tfile.name, 'wb')
|
||||||
j.write(data, cinema2K=24)
|
j.write(data, cinema2k=24)
|
||||||
|
|
||||||
codestream = j.get_codestream()
|
codestream = j.get_codestream()
|
||||||
|
|
||||||
|
|
@ -111,7 +110,16 @@ class TestSuiteWrite(unittest.TestCase):
|
||||||
self.assertEqual(len(codestream.segment[2].spcod), 9)
|
self.assertEqual(len(codestream.segment[2].spcod), 9)
|
||||||
|
|
||||||
|
|
||||||
|
@unittest.skipIf(not _HAS_SKIMAGE_FREEIMAGE_SUPPORT,
|
||||||
|
"Cannot read input image without scikit-image/freeimage")
|
||||||
|
def test_cinema2k_bad_frame_rate(self):
|
||||||
|
relfile = 'input/nonregression/X_4_2K_24_185_CBR_WB_000.tif'
|
||||||
|
infile = opj_data_file(relfile)
|
||||||
|
data = skimage.io.imread(infile)
|
||||||
|
with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile:
|
||||||
|
j = Jp2k(tfile.name, 'wb')
|
||||||
|
with self.assertRaises(IOError):
|
||||||
|
j.write(data, cinema2k=36)
|
||||||
|
|
||||||
|
|
||||||
def test_NR_ENC_Bretagne1_ppm_1_encode(self):
|
def test_NR_ENC_Bretagne1_ppm_1_encode(self):
|
||||||
|
|
|
||||||
|
|
@ -133,7 +133,6 @@ class TestPrinting(unittest.TestCase):
|
||||||
lst = lst[1:]
|
lst = lst[1:]
|
||||||
actual = '\n'.join(lst)
|
actual = '\n'.join(lst)
|
||||||
expected = fixtures.nemo_dump_no_xml
|
expected = fixtures.nemo_dump_no_xml
|
||||||
self.maxDiff = None
|
|
||||||
self.assertEqual(actual, expected)
|
self.assertEqual(actual, expected)
|
||||||
|
|
||||||
def test_printoptions_short(self):
|
def test_printoptions_short(self):
|
||||||
|
|
@ -745,7 +744,9 @@ class TestPrinting(unittest.TestCase):
|
||||||
with patch('sys.stdout', new=StringIO()) as fake_out:
|
with patch('sys.stdout', new=StringIO()) as fake_out:
|
||||||
print(j.box[2])
|
print(j.box[2])
|
||||||
actual = fake_out.getvalue().strip()
|
actual = fake_out.getvalue().strip()
|
||||||
self.assertEqual(actual, fixtures.file7_rreq)
|
self.maxDiff = None
|
||||||
|
expected = fixtures.file7_rreq
|
||||||
|
self.assertEqual(actual, expected)
|
||||||
|
|
||||||
@unittest.skipIf(OPJ_DATA_ROOT is None,
|
@unittest.skipIf(OPJ_DATA_ROOT is None,
|
||||||
"OPJ_DATA_ROOT environment variable not set")
|
"OPJ_DATA_ROOT environment variable not set")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue