jxl_decoder_test.js (4470B)
1 // Copyright (c) the JPEG XL Project Authors. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 function assertTrue(ok, msg) { 7 if (!ok) { 8 console.log('FAIL: ' + msg); 9 process.exit(1); 10 } 11 } 12 13 function runTest(testFn) { 14 console.log('Running ' + testFn.name); 15 testFn(); 16 console.log('PASS'); 17 } 18 19 let jxlModule; 20 21 const isAddress = (v) => { 22 return (v >= 4) && ((v & (1 << 31)) === 0); 23 }; 24 25 let splinesJxl = new Uint8Array([ 26 0xff, 0x0a, 0xf8, 0x19, 0x10, 0x09, 0xd8, 0x63, 0x10, 0x00, 0xbc, 0x00, 27 0xa6, 0x19, 0x4a, 0xa3, 0x56, 0x8c, 0x94, 0x62, 0x24, 0x7d, 0x12, 0x72, 28 0x87, 0x00, 0x00, 0xda, 0xd4, 0xc9, 0xc1, 0xe2, 0x9e, 0x02, 0xb9, 0x37, 29 0x00, 0xfe, 0x07, 0x9a, 0x91, 0x08, 0xcd, 0xbf, 0xa1, 0xdc, 0x71, 0x36, 30 0x62, 0xc8, 0x97, 0x31, 0xc4, 0x3e, 0x58, 0x02, 0xc1, 0x01, 0x00 31 ]); 32 33 let crossJxl = new Uint8Array([ 34 0xff, 0x0a, 0x98, 0x10, 0x10, 0x50, 0x5c, 0x08, 0x08, 0x02, 0x01, 35 0x00, 0x98, 0x00, 0x4b, 0x18, 0x8b, 0x15, 0x00, 0xd4, 0x92, 0x62, 36 0xcc, 0x98, 0x91, 0x17, 0x08, 0x01, 0xe0, 0x92, 0xbc, 0x7e, 0xdf, 37 0xbf, 0xff, 0x50, 0xc0, 0x64, 0x35, 0xb0, 0x40, 0x1e, 0x24, 0xa9, 38 0xac, 0x38, 0xd9, 0x13, 0x1e, 0x85, 0x4a, 0x0d 39 ]); 40 41 function testSdr() { 42 let decoder = jxlModule._jxlCreateInstance( 43 /* wantSdr */ true, /* displayNits */ 100); 44 assertTrue(isAddress(decoder), 'create decoder instance'); 45 let encoded = splinesJxl; 46 let buffer = jxlModule._malloc(encoded.length); 47 jxlModule.HEAP8.set(encoded, buffer); 48 49 let result = jxlModule._jxlProcessInput(decoder, buffer, encoded.length); 50 assertTrue(result === 0, 'process input'); 51 52 let w = jxlModule.HEAP32[decoder >> 2]; 53 let h = jxlModule.HEAP32[(decoder + 4) >> 2]; 54 let pixelData = jxlModule.HEAP32[(decoder + 8) >> 2]; 55 56 assertTrue(pixelData, 'output allocated'); 57 assertTrue(h === 320, 'output height'); 58 assertTrue(w === 320, 'output width '); 59 60 jxlModule._jxlDestroyInstance(decoder); 61 jxlModule._free(buffer); 62 } 63 64 function testRegular() { 65 let decoder = jxlModule._jxlCreateInstance( 66 /* wantSdr */ false, /* displayNits */ 100); 67 assertTrue(isAddress(decoder), 'create decoder instance'); 68 let encoded = splinesJxl; 69 let buffer = jxlModule._malloc(encoded.length); 70 jxlModule.HEAP8.set(encoded, buffer); 71 72 let result = jxlModule._jxlProcessInput(decoder, buffer, encoded.length); 73 assertTrue(result === 0, 'process input'); 74 75 let w = jxlModule.HEAP32[decoder >> 2]; 76 let h = jxlModule.HEAP32[(decoder + 4) >> 2]; 77 let pixelData = jxlModule.HEAP32[(decoder + 8) >> 2]; 78 79 assertTrue(pixelData, 'output allocated'); 80 assertTrue(h === 320, 'output height'); 81 assertTrue(w === 320, 'output width '); 82 83 jxlModule._jxlDestroyInstance(decoder); 84 jxlModule._free(buffer); 85 } 86 87 function testChunks() { 88 let decoder = jxlModule._jxlCreateInstance( 89 /* wantSdr */ false, /* displayNits */ 100); 90 assertTrue(isAddress(decoder), 'create decoder instance'); 91 let encoded = splinesJxl; 92 let buffer = jxlModule._malloc(encoded.length); 93 jxlModule.HEAP8.set(encoded, buffer); 94 95 let part1_length = encoded.length >> 1; 96 let part2_length = encoded.length - part1_length; 97 98 let result = jxlModule._jxlProcessInput(decoder, buffer, part1_length); 99 assertTrue(result === 2, 'process first part'); 100 101 result = 102 jxlModule._jxlProcessInput(decoder, buffer + part1_length, part2_length); 103 assertTrue(result === 0, 'process second part'); 104 105 let w = jxlModule.HEAP32[decoder >> 2]; 106 let h = jxlModule.HEAP32[(decoder + 4) >> 2]; 107 let pixelData = jxlModule.HEAP32[(decoder + 8) >> 2]; 108 109 assertTrue(pixelData, 'output allocated'); 110 assertTrue(h === 320, 'output height'); 111 assertTrue(w === 320, 'output width '); 112 113 jxlModule._jxlDestroyInstance(decoder); 114 jxlModule._free(buffer); 115 } 116 117 function testDecompress() { 118 let encoded = crossJxl; 119 let buffer = jxlModule._malloc(encoded.length); 120 jxlModule.HEAP8.set(encoded, buffer); 121 122 let output = jxlModule._jxlDecompress(buffer, encoded.length); 123 assertTrue(isAddress(output), 'decompress'); 124 125 jxlModule._free(buffer); 126 127 let pngSize = jxlModule.HEAP32[output >> 2]; 128 let px = 20 * 20; 129 assertTrue(pngSize >= 6 * px, 'png size'); 130 assertTrue(pngSize <= 6 * px + 800, 'png size'); 131 132 jxlModule._jxlCleanup(output); 133 } 134 135 require('jxl_decoder_for_test.js')().then(module => { 136 jxlModule = module; 137 let tests = [testSdr, testRegular, testChunks, testDecompress]; 138 tests.forEach(runTest); 139 process.exit(0); 140 });