@@ -6807,117 +6807,97 @@ def test_poppler(self):
68076807 @no_wasm64 ('MEMORY64 does not yet support SJLJ' )
68086808 @is_slow_test
68096809 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 ()
6810+ def line_splitter (data ):
6811+ out = ''
6812+ counter = 0
6813+
6814+ for ch in data :
6815+ out += ch
6816+ if ch == ' ' and counter > 60 :
6817+ out += '\n '
6818+ counter = 0
6819+ else :
6820+ counter += 1
69116821
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 ()
6822+ return out
6823+
6824+ # remove -g, so we have one test without it by default
6825+ self .emcc_args = [x for x in self .emcc_args if x != '-g' ]
6826+
6827+ original_j2k = test_file ('openjpeg/syntensity_lobby_s.j2k' )
6828+ image_bytes = list (bytearray (read_binary (original_j2k )))
6829+ create_file ('pre.js' , """
6830+ Module.preRun = () => FS.createDataFile('/', 'image.j2k', %s, true, false, false);
6831+ Module.postRun = () => {
6832+ out('Data: ' + JSON.stringify(Array.from(FS.readFile('image.raw'))));
6833+ };
6834+ """ % line_splitter (str (image_bytes )))
6835+
6836+ # ensure libpng is built so that openjpeg's configure step can detect it.
6837+ # If we don't do this then we don't know what the state of the cache will be
6838+ # and this test would different non-deterministic results based on, for example,
6839+ # what other tests had previously run.
6840+ builder_cmd = [EMBUILDER , 'build' , 'libpng' ]
6841+ if self .get_setting ('MEMORY64' ):
6842+ builder_cmd .append ('--wasm64' )
6843+ self .emcc_args .append ('-Wno-pointer-to-int-cast' )
6844+ self .run_process (builder_cmd )
6845+ lib = self .get_library ('third_party/openjpeg' ,
6846+ [Path ('codec/CMakeFiles/j2k_to_image.dir/index.c.o' ),
6847+ Path ('codec/CMakeFiles/j2k_to_image.dir/convert.c.o' ),
6848+ Path ('codec/CMakeFiles/j2k_to_image.dir/__/common/color.c.o' ),
6849+ Path ('bin/libopenjpeg.a' )],
6850+ configure = ['cmake' , '.' ],
6851+ # configure_args=['--enable-tiff=no', '--enable-jp3d=no', '--enable-png=no'],
6852+ make_args = []) # no -j 2, since parallel builds can fail
6853+
6854+ # We use doubles in JS, so we get slightly different values than native code. So we
6855+ # check our output by comparing the average pixel difference
6856+ def image_compare (output ):
6857+ # Get the image generated by JS, from the JSON.stringify'd array
6858+ m = re .search (r'\[[\d, -]*\]' , output )
6859+
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+ # Get the correct output
6866+ true_data = bytearray (read_binary (test_file ('openjpeg/syntensity_lobby_s.raw' )))
6867+
6868+ # Compare them
6869+ self .assertEqual (len (js_data ), len (true_data ))
6870+ num = len (js_data )
6871+ diff_total = js_total = true_total = 0
6872+ for i in range (num ):
6873+ js_total += js_data [i ]
6874+ true_total += true_data [i ]
6875+ diff_total += abs (js_data [i ] - true_data [i ])
6876+ js_mean = js_total / float (num )
6877+ true_mean = true_total / float (num )
6878+ diff_mean = diff_total / float (num )
6879+
6880+ image_mean = 83.265
6881+ # print '[image stats:', js_mean, image_mean, true_mean, diff_mean, num, ']'
6882+ assert abs (js_mean - image_mean ) < 0.01 , [js_mean , image_mean ]
6883+ assert abs (true_mean - image_mean ) < 0.01 , [true_mean , image_mean ]
6884+ assert diff_mean < 0.01 , diff_mean
6885+
6886+ return output
6887+
6888+ self .emcc_args += ['--minify=0' ] # to compare the versions
6889+ self .emcc_args += ['--pre-js' , 'pre.js' ]
6890+
6891+ self .do_runf ('third_party/openjpeg/codec/j2k_to_image.c' ,
6892+ 'Successfully generated' , # The real test for valid output is in image_compare
6893+ args = '-i image.j2k -o image.raw' .split (),
6894+ emcc_args = ['-sUSE_LIBPNG' ],
6895+ libraries = lib ,
6896+ includes = [test_file ('third_party/openjpeg/libopenjpeg' ),
6897+ test_file ('third_party/openjpeg/codec' ),
6898+ test_file ('third_party/openjpeg/common' ),
6899+ Path (self .get_build_dir (), 'third_party/openjpeg' )],
6900+ output_nicerizer = image_compare )
69216901
69226902 @also_with_standalone_wasm (impure = True )
69236903 @no_asan ('autodebug logging interferes with asan' )
0 commit comments