|
10 | 10 | import random |
11 | 11 | import re |
12 | 12 | import shutil |
13 | | -import sys |
14 | 13 | import time |
15 | 14 | import unittest |
16 | 15 | from pathlib import Path |
@@ -6807,117 +6806,97 @@ def test_poppler(self): |
6807 | 6806 | @no_wasm64('MEMORY64 does not yet support SJLJ') |
6808 | 6807 | @is_slow_test |
6809 | 6808 | def test_openjpeg(self): |
6810 | | - def do_test_openjpeg(): |
6811 | | - def line_splitter(data): |
6812 | | - out = '' |
6813 | | - counter = 0 |
6814 | | - |
6815 | | - for ch in data: |
6816 | | - out += ch |
6817 | | - if ch == ' ' and counter > 60: |
6818 | | - out += '\n' |
6819 | | - counter = 0 |
6820 | | - else: |
6821 | | - counter += 1 |
6822 | | - |
6823 | | - return out |
6824 | | - |
6825 | | - # remove -g, so we have one test without it by default |
6826 | | - self.emcc_args = [x for x in self.emcc_args if x != '-g'] |
6827 | | - |
6828 | | - original_j2k = test_file('openjpeg/syntensity_lobby_s.j2k') |
6829 | | - image_bytes = list(bytearray(read_binary(original_j2k))) |
6830 | | - create_file('pre.js', """ |
6831 | | - Module.preRun = () => FS.createDataFile('/', 'image.j2k', %s, true, false, false); |
6832 | | - Module.postRun = () => { |
6833 | | - out('Data: ' + JSON.stringify(Array.from(FS.readFile('image.raw')))); |
6834 | | - }; |
6835 | | - """ % line_splitter(str(image_bytes))) |
6836 | | - |
6837 | | - # ensure libpng is built so that openjpeg's configure step can detect it. |
6838 | | - # If we don't do this then we don't know what the state of the cache will be |
6839 | | - # and this test would different non-deterministic results based on, for example, |
6840 | | - # what other tests had previously run. |
6841 | | - builder_cmd = [EMBUILDER, 'build', 'libpng'] |
6842 | | - if self.get_setting('MEMORY64'): |
6843 | | - builder_cmd.append('--wasm64') |
6844 | | - self.emcc_args.append('-Wno-pointer-to-int-cast') |
6845 | | - self.run_process(builder_cmd) |
6846 | | - lib = self.get_library('third_party/openjpeg', |
6847 | | - [Path('codec/CMakeFiles/j2k_to_image.dir/index.c.o'), |
6848 | | - Path('codec/CMakeFiles/j2k_to_image.dir/convert.c.o'), |
6849 | | - Path('codec/CMakeFiles/j2k_to_image.dir/__/common/color.c.o'), |
6850 | | - Path('bin/libopenjpeg.a')], |
6851 | | - configure=['cmake', '.'], |
6852 | | - # configure_args=['--enable-tiff=no', '--enable-jp3d=no', '--enable-png=no'], |
6853 | | - make_args=[]) # no -j 2, since parallel builds can fail |
6854 | | - |
6855 | | - # We use doubles in JS, so we get slightly different values than native code. So we |
6856 | | - # check our output by comparing the average pixel difference |
6857 | | - def image_compare(output): |
6858 | | - # Get the image generated by JS, from the JSON.stringify'd array |
6859 | | - m = re.search(r'\[[\d, -]*\]', output) |
6860 | | - self.assertIsNotNone(m, 'Failed to find proper image output in: ' + output) |
6861 | | - # Evaluate the output as a python array |
6862 | | - js_data = eval(m.group(0)) |
6863 | | - |
6864 | | - js_data = [x if x >= 0 else 256 + x for x in js_data] # Our output may be signed, so unsign it |
6865 | | - |
6866 | | - # Get the correct output |
6867 | | - true_data = bytearray(read_binary(test_file('openjpeg/syntensity_lobby_s.raw'))) |
6868 | | - |
6869 | | - # Compare them |
6870 | | - self.assertEqual(len(js_data), len(true_data)) |
6871 | | - num = len(js_data) |
6872 | | - diff_total = js_total = true_total = 0 |
6873 | | - for i in range(num): |
6874 | | - js_total += js_data[i] |
6875 | | - true_total += true_data[i] |
6876 | | - diff_total += abs(js_data[i] - true_data[i]) |
6877 | | - js_mean = js_total / float(num) |
6878 | | - true_mean = true_total / float(num) |
6879 | | - diff_mean = diff_total / float(num) |
6880 | | - |
6881 | | - image_mean = 83.265 |
6882 | | - # print '[image stats:', js_mean, image_mean, true_mean, diff_mean, num, ']' |
6883 | | - assert abs(js_mean - image_mean) < 0.01, [js_mean, image_mean] |
6884 | | - assert abs(true_mean - image_mean) < 0.01, [true_mean, image_mean] |
6885 | | - assert diff_mean < 0.01, diff_mean |
6886 | | - |
6887 | | - return output |
6888 | | - |
6889 | | - self.emcc_args += ['--minify=0'] # to compare the versions |
6890 | | - self.emcc_args += ['--pre-js', 'pre.js'] |
6891 | | - |
6892 | | - def do_test(): |
6893 | | - self.do_runf('third_party/openjpeg/codec/j2k_to_image.c', |
6894 | | - 'Successfully generated', # The real test for valid output is in image_compare |
6895 | | - args='-i image.j2k -o image.raw'.split(), |
6896 | | - emcc_args=['-sUSE_LIBPNG'], |
6897 | | - libraries=lib, |
6898 | | - includes=[test_file('third_party/openjpeg/libopenjpeg'), |
6899 | | - test_file('third_party/openjpeg/codec'), |
6900 | | - test_file('third_party/openjpeg/common'), |
6901 | | - Path(self.get_build_dir(), 'third_party/openjpeg')], |
6902 | | - output_nicerizer=image_compare) |
6903 | | - |
6904 | | - do_test() |
6905 | | - |
6906 | | - # extra testing |
6907 | | - if self.get_setting('ALLOW_MEMORY_GROWTH') == 1: |
6908 | | - print('no memory growth', file=sys.stderr) |
6909 | | - self.set_setting('ALLOW_MEMORY_GROWTH', 0) |
6910 | | - do_test() |
| 6809 | + def line_splitter(data): |
| 6810 | + out = '' |
| 6811 | + counter = 0 |
| 6812 | + |
| 6813 | + for ch in data: |
| 6814 | + out += ch |
| 6815 | + if ch == ' ' and counter > 60: |
| 6816 | + out += '\n' |
| 6817 | + counter = 0 |
| 6818 | + else: |
| 6819 | + counter += 1 |
6911 | 6820 |
|
6912 | | - if is_sanitizing(self.emcc_args): |
6913 | | - # In ASan mode we need a large initial memory (or else wasm-ld fails). |
6914 | | - # The OpenJPEG CMake will build several executables (which we need parts |
6915 | | - # of in our testing, see above), so we must enable the flag for them all. |
6916 | | - with env_modify({'EMCC_CFLAGS': '-sINITIAL_MEMORY=300MB'}): |
6917 | | - self.emcc_args.append('-Wno-unused-command-line-argument') |
6918 | | - do_test_openjpeg() |
6919 | | - else: |
6920 | | - do_test_openjpeg() |
| 6821 | + return out |
| 6822 | + |
| 6823 | + # remove -g, so we have one test without it by default |
| 6824 | + self.emcc_args = [x for x in self.emcc_args if x != '-g'] |
| 6825 | + |
| 6826 | + original_j2k = test_file('openjpeg/syntensity_lobby_s.j2k') |
| 6827 | + image_bytes = list(bytearray(read_binary(original_j2k))) |
| 6828 | + create_file('pre.js', """ |
| 6829 | + Module.preRun = () => FS.createDataFile('/', 'image.j2k', %s, true, false, false); |
| 6830 | + Module.postRun = () => { |
| 6831 | + out('Data: ' + JSON.stringify(Array.from(FS.readFile('image.raw')))); |
| 6832 | + }; |
| 6833 | + """ % line_splitter(str(image_bytes))) |
| 6834 | + |
| 6835 | + # ensure libpng is built so that openjpeg's configure step can detect it. |
| 6836 | + # If we don't do this then we don't know what the state of the cache will be |
| 6837 | + # and this test would different non-deterministic results based on, for example, |
| 6838 | + # what other tests had previously run. |
| 6839 | + builder_cmd = [EMBUILDER, 'build', 'libpng'] |
| 6840 | + if self.get_setting('MEMORY64'): |
| 6841 | + builder_cmd.append('--wasm64') |
| 6842 | + self.emcc_args.append('-Wno-pointer-to-int-cast') |
| 6843 | + self.run_process(builder_cmd) |
| 6844 | + lib = self.get_library('third_party/openjpeg', |
| 6845 | + [Path('codec/CMakeFiles/j2k_to_image.dir/index.c.o'), |
| 6846 | + Path('codec/CMakeFiles/j2k_to_image.dir/convert.c.o'), |
| 6847 | + Path('codec/CMakeFiles/j2k_to_image.dir/__/common/color.c.o'), |
| 6848 | + Path('bin/libopenjpeg.a')], |
| 6849 | + configure=['cmake', '.'], |
| 6850 | + # configure_args=['--enable-tiff=no', '--enable-jp3d=no', '--enable-png=no'], |
| 6851 | + make_args=[]) # no -j 2, since parallel builds can fail |
| 6852 | + |
| 6853 | + # We use doubles in JS, so we get slightly different values than native code. So we |
| 6854 | + # check our output by comparing the average pixel difference |
| 6855 | + def image_compare(output): |
| 6856 | + # Get the image generated by JS, from the JSON.stringify'd array |
| 6857 | + m = re.search(r'\[[\d, -]*\]', output) |
| 6858 | + |
| 6859 | + self.assertIsNotNone(m, 'Failed to find proper image output in: ' + output) |
| 6860 | + # Evaluate the output as a python array |
| 6861 | + js_data = eval(m.group(0)) |
| 6862 | + |
| 6863 | + js_data = [x if x >= 0 else 256 + x for x in js_data] # Our output may be signed, so unsign it |
| 6864 | + # Get the correct output |
| 6865 | + true_data = bytearray(read_binary(test_file('openjpeg/syntensity_lobby_s.raw'))) |
| 6866 | + |
| 6867 | + # Compare them |
| 6868 | + self.assertEqual(len(js_data), len(true_data)) |
| 6869 | + num = len(js_data) |
| 6870 | + diff_total = js_total = true_total = 0 |
| 6871 | + for i in range(num): |
| 6872 | + js_total += js_data[i] |
| 6873 | + true_total += true_data[i] |
| 6874 | + diff_total += abs(js_data[i] - true_data[i]) |
| 6875 | + js_mean = js_total / float(num) |
| 6876 | + true_mean = true_total / float(num) |
| 6877 | + diff_mean = diff_total / float(num) |
| 6878 | + |
| 6879 | + image_mean = 83.265 |
| 6880 | + # print '[image stats:', js_mean, image_mean, true_mean, diff_mean, num, ']' |
| 6881 | + assert abs(js_mean - image_mean) < 0.01, [js_mean, image_mean] |
| 6882 | + assert abs(true_mean - image_mean) < 0.01, [true_mean, image_mean] |
| 6883 | + assert diff_mean < 0.01, diff_mean |
| 6884 | + |
| 6885 | + return output |
| 6886 | + |
| 6887 | + self.emcc_args += ['--minify=0'] # to compare the versions |
| 6888 | + self.emcc_args += ['--pre-js', 'pre.js'] |
| 6889 | + |
| 6890 | + self.do_runf('third_party/openjpeg/codec/j2k_to_image.c', |
| 6891 | + 'Successfully generated', # The real test for valid output is in image_compare |
| 6892 | + args='-i image.j2k -o image.raw'.split(), |
| 6893 | + emcc_args=['-sUSE_LIBPNG'], |
| 6894 | + libraries=lib, |
| 6895 | + includes=[test_file('third_party/openjpeg/libopenjpeg'), |
| 6896 | + test_file('third_party/openjpeg/codec'), |
| 6897 | + test_file('third_party/openjpeg/common'), |
| 6898 | + Path(self.get_build_dir(), 'third_party/openjpeg')], |
| 6899 | + output_nicerizer=image_compare) |
6921 | 6900 |
|
6922 | 6901 | @also_with_standalone_wasm(impure=True) |
6923 | 6902 | @no_asan('autodebug logging interferes with asan') |
|
0 commit comments