diff --git a/codecs/avif/Makefile b/codecs/avif/Makefile index 332f3290..f9aa6c61 100644 --- a/codecs/avif/Makefile +++ b/codecs/avif/Makefile @@ -1,7 +1,9 @@ -CODEC_URL = https://github.com/AOMediaCodec/libavif/archive/31d7c6d1e32cf467ac24fb8c7a76c4902a4c00db.tar.gz +# Tracking the version in google3/third_party/libavif +CODEC_URL = https://github.com/AOMediaCodec/libavif/archive/v0.9.0.tar.gz CODEC_PACKAGE = node_modules/libavif.tar.gz -LIBAOM_URL = https://aomedia.googlesource.com/aom/+archive/v2.0.0.tar.gz +# Tracking the version in google3/third_party/libaom +LIBAOM_URL = https://aomedia.googlesource.com/aom/+archive/4a8e276e3e0ef3c76083f3975d5caa85bc9593ce.tar.gz LIBAOM_PACKAGE = node_modules/libaom.tar.gz export CODEC_DIR = node_modules/libavif @@ -25,7 +27,7 @@ HELPER_MAKEFLAGS := -f helper.Makefile all: $(OUT_ENC_JS) $(OUT_DEC_JS) $(OUT_ENC_MT_JS) $(OUT_NODE_ENC_JS) $(OUT_NODE_DEC_JS) -$(OUT_NODE_ENC_JS): ENVIRONMENT=node +$(OUT_NODE_ENC_JS): ENVIRONMENT=node $(OUT_NODE_ENC_JS) $(OUT_ENC_JS): $(OUT_ENC_CPP) $(CODEC_DIR)/CMakeLists.txt $(LIBAOM_DIR)/CMakeLists.txt $(MAKE) \ $(HELPER_MAKEFLAGS) \ diff --git a/codecs/avif/dec/avif_dec.wasm b/codecs/avif/dec/avif_dec.wasm old mode 100644 new mode 100755 index cbab06e4..a0757b95 Binary files a/codecs/avif/dec/avif_dec.wasm and b/codecs/avif/dec/avif_dec.wasm differ diff --git a/codecs/avif/dec/avif_node_dec.wasm b/codecs/avif/dec/avif_node_dec.wasm index cbab06e4..a0757b95 100755 Binary files a/codecs/avif/dec/avif_node_dec.wasm and b/codecs/avif/dec/avif_node_dec.wasm differ diff --git a/codecs/avif/enc/avif_enc.cpp b/codecs/avif/enc/avif_enc.cpp index 56a2b517..0e49441c 100644 --- a/codecs/avif/enc/avif_enc.cpp +++ b/codecs/avif/enc/avif_enc.cpp @@ -9,10 +9,8 @@ struct AvifOptions { // [0 - 63] // 0 = lossless // 63 = worst quality - int minQuantizer; - int maxQuantizer; + int cqLevel; int minQuantizerAlpha; - int maxQuantizerAlpha; // [0 - 6] // Creates 2^n tiles in that dimension int tileRowsLog2; @@ -26,6 +24,12 @@ struct AvifOptions { // 2 = 4:2:2 // 3 = 4:4:4 int subsample; + // Extra chroma compression + bool chromaDeltaQ; + // 0-7 + int sharpness; + // Target ssim rather than psnr + bool targetSsim; }; thread_local const val Uint8Array = val::global("Uint8Array"); @@ -49,18 +53,18 @@ val encode(std::string buffer, int width, int height, AvifOptions options) { break; } + bool lossless = options.cqLevel == AVIF_QUANTIZER_LOSSLESS && + options.minQuantizerAlpha == AVIF_QUANTIZER_LOSSLESS && + format == AVIF_PIXEL_FORMAT_YUV444; avifImage* image = avifImageCreate(width, height, depth, format); - if (options.maxQuantizer == AVIF_QUANTIZER_LOSSLESS && - options.minQuantizer == AVIF_QUANTIZER_LOSSLESS && - options.minQuantizerAlpha == AVIF_QUANTIZER_LOSSLESS && - options.maxQuantizerAlpha == AVIF_QUANTIZER_LOSSLESS && format == AVIF_PIXEL_FORMAT_YUV444) { + if (lossless) { image->matrixCoefficients = AVIF_MATRIX_COEFFICIENTS_IDENTITY; } else { - image->matrixCoefficients = AVIF_MATRIX_COEFFICIENTS_BT709; + image->matrixCoefficients = AVIF_MATRIX_COEFFICIENTS_BT601; } - uint8_t* rgba = (uint8_t*)buffer.c_str(); + uint8_t* rgba = reinterpret_cast(const_cast(buffer.data())); avifRGBImage srcRGB; avifRGBImageSetDefaults(&srcRGB, image); @@ -69,14 +73,36 @@ val encode(std::string buffer, int width, int height, AvifOptions options) { avifImageRGBToYUV(image, &srcRGB); avifEncoder* encoder = avifEncoderCreate(); + + if (lossless) { + encoder->minQuantizer = AVIF_QUANTIZER_LOSSLESS; + encoder->maxQuantizer = AVIF_QUANTIZER_LOSSLESS; + encoder->minQuantizerAlpha = AVIF_QUANTIZER_LOSSLESS; + encoder->maxQuantizerAlpha = AVIF_QUANTIZER_LOSSLESS; + } else { + encoder->minQuantizer = AVIF_QUANTIZER_BEST_QUALITY; + encoder->maxQuantizer = AVIF_QUANTIZER_WORST_QUALITY; + encoder->minQuantizerAlpha = options.minQuantizerAlpha; + encoder->maxQuantizerAlpha = AVIF_QUANTIZER_WORST_QUALITY; + avifEncoderSetCodecSpecificOption(encoder, "end-usage", "q"); + avifEncoderSetCodecSpecificOption(encoder, "cq-level", std::to_string(options.cqLevel).c_str()); + avifEncoderSetCodecSpecificOption(encoder, "sharpness", + std::to_string(options.sharpness).c_str()); + + if (options.targetSsim) { + avifEncoderSetCodecSpecificOption(encoder, "tune", "ssim"); + } + + if (options.chromaDeltaQ) { + avifEncoderSetCodecSpecificOption(encoder, "enable-chroma-deltaq", "1"); + } + } + encoder->maxThreads = emscripten_num_logical_cores(); - encoder->minQuantizer = options.minQuantizer; - encoder->maxQuantizer = options.maxQuantizer; - encoder->minQuantizerAlpha = options.minQuantizerAlpha; - encoder->maxQuantizerAlpha = options.maxQuantizerAlpha; encoder->tileRowsLog2 = options.tileRowsLog2; encoder->tileColsLog2 = options.tileColsLog2; encoder->speed = options.speed; + avifResult encodeResult = avifEncoderWrite(encoder, image, &output); auto js_result = val::null(); if (encodeResult == AVIF_RESULT_OK) { @@ -91,13 +117,14 @@ val encode(std::string buffer, int width, int height, AvifOptions options) { EMSCRIPTEN_BINDINGS(my_module) { value_object("AvifOptions") - .field("minQuantizer", &AvifOptions::minQuantizer) - .field("maxQuantizer", &AvifOptions::maxQuantizer) + .field("cqLevel", &AvifOptions::cqLevel) .field("minQuantizerAlpha", &AvifOptions::minQuantizerAlpha) - .field("maxQuantizerAlpha", &AvifOptions::maxQuantizerAlpha) .field("tileRowsLog2", &AvifOptions::tileRowsLog2) .field("tileColsLog2", &AvifOptions::tileColsLog2) .field("speed", &AvifOptions::speed) + .field("chromaDeltaQ", &AvifOptions::chromaDeltaQ) + .field("sharpness", &AvifOptions::sharpness) + .field("targetSsim", &AvifOptions::targetSsim) .field("subsample", &AvifOptions::subsample); function("encode", &encode); diff --git a/codecs/avif/enc/avif_enc.d.ts b/codecs/avif/enc/avif_enc.d.ts index e32d84b9..d6537733 100644 --- a/codecs/avif/enc/avif_enc.d.ts +++ b/codecs/avif/enc/avif_enc.d.ts @@ -1,12 +1,13 @@ export interface EncodeOptions { - minQuantizer: number; - maxQuantizer: number; + cqLevel: number; minQuantizerAlpha: number; - maxQuantizerAlpha: number; tileRowsLog2: number; tileColsLog2: number; speed: number; subsample: number; + chromaDeltaQ: boolean; + sharpness: number; + targetSsim: boolean; } export interface AVIFModule extends EmscriptenWasm.Module { diff --git a/codecs/avif/enc/avif_enc.js b/codecs/avif/enc/avif_enc.js index 9d69ac73..cdff3da5 100644 --- a/codecs/avif/enc/avif_enc.js +++ b/codecs/avif/enc/avif_enc.js @@ -28,21 +28,21 @@ function cb(a,b){0<=a.indexOf("j")||y("Assertion failed: getDynCaller should onl function U(a,b){a=R(a);var c=-1!=a.indexOf("j")?cb(a,b):I.get(b);"function"!==typeof c&&S("unknown function pointer with signature "+a+": "+b);return c}var db=void 0;function eb(a){a=fb(a);var b=R(a);V(a);return b}function gb(a,b){function c(g){e[g]||P[g]||(La[g]?La[g].forEach(c):(d.push(g),e[g]=!0))}var d=[],e={};b.forEach(c);throw new db(a+": "+d.map(eb).join([", "]));} function hb(a,b,c){switch(b){case 0:return c?function(d){return ra[d]}:function(d){return C[d]};case 1:return c?function(d){return E[d>>1]}:function(d){return D[d>>1]};case 2:return c?function(d){return F[d>>2]}:function(d){return H[d>>2]};default:throw new TypeError("Unknown integer type: "+a);}}var ib={};function jb(){return"object"===typeof globalThis?globalThis:Function("return this")()}function kb(a,b){var c=P[a];void 0===c&&S(b+" has unknown type "+eb(a));return c}var lb={}; Pa=f.InternalError=Oa("InternalError");for(var mb=Array(256),nb=0;256>nb;++nb)mb[nb]=String.fromCharCode(nb);Sa=mb;Ta=f.BindingError=Oa("BindingError");f.count_emval_handles=function(){for(var a=0,b=5;b>g])},ca:null})},I:function(a,b){b=R(b);Q(a,{name:b,fromWireType:function(c){var d=T[c].value;Va(c);return d},toWireType:function(c,d){return Wa(d)},argPackAdvance:8,readValueFromPointer:Ka,ca:null})},v:function(a,b,c){c=Ra(c);b=R(b);Q(a,{name:b,fromWireType:function(d){return d},toWireType:function(d,e){if("number"!==typeof e&&"boolean"!==typeof e)throw new TypeError('Cannot convert "'+Xa(e)+'" to '+this.name); return e},argPackAdvance:8,readValueFromPointer:Ya(b,c),ca:null})},y:function(a,b,c,d,e,g){var k=bb(b,c);a=R(a);e=U(d,e);ab(a,function(){gb("Cannot call "+a+" due to unbound types",k)},b-1);Qa([],k,function(h){var n=a,l=a;h=[h[0],null].concat(h.slice(1));var m=e,q=h.length;2>q&&S("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var r=null!==h[1]&&!1,z=!1,p=1;p>>h}}var n=-1!=b.indexOf("unsigned");Q(a,{name:b,fromWireType:g,toWireType:function(l,m){if("number"!==typeof m&&"boolean"!==typeof m)throw new TypeError('Cannot convert "'+ +A.push(l+"}\n");h=Za(A).apply(null,m);p=b-1;if(!f.hasOwnProperty(n))throw new Pa("Replacing nonexistant public symbol");void 0!==f[n].ba&&void 0!==p?f[n].ba[p]=h:(f[n]=h,f[n].ga=p);return[]})},j:function(a,b,c,d,e){function g(l){return l}b=R(b);-1===e&&(e=4294967295);var k=Ra(c);if(0===d){var h=32-8*c;g=function(l){return l<>>h}}var n=-1!=b.indexOf("unsigned");Q(a,{name:b,fromWireType:g,toWireType:function(l,m){if("number"!==typeof m&&"boolean"!==typeof m)throw new TypeError('Cannot convert "'+ Xa(m)+'" to '+this.name);if(me)throw new TypeError('Passing a number "'+Xa(m)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+d+", "+e+"]!");return n?m>>>0:m|0},argPackAdvance:8,readValueFromPointer:hb(b,k,0!==d),ca:null})},f:function(a,b,c){function d(g){g>>=2;var k=H;return new e(G,k[g+1],k[g])}var e=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=R(c);Q(a,{name:c,fromWireType:d,argPackAdvance:8, readValueFromPointer:d},{ma:!0})},w:function(a,b){b=R(b);var c="std::string"===b;Q(a,{name:b,fromWireType:function(d){var e=H[d>>2];if(c)for(var g=d+4,k=0;k<=e;++k){var h=d+4+k;if(k==e||0==C[h]){if(g){for(var n=g+(h-g),l=g;!(l>=n)&&C[l];)++l;g=ia.decode(C.subarray(g,l))}else g="";if(void 0===m)var m=g;else m+=String.fromCharCode(0),m+=g;g=h+1}}else{m=Array(e);for(k=0;k=q&&(q=65536+((q&1023)<<10)|e.charCodeAt(++m)&1023);127>=q?++l:l=2047>=q?l+2:65535>=q?l+3:l+4}return l}:function(){return e.length})(),h=pb(4+k+1);H[h>>2]=k;if(c&&g)ja(e,h+4,k+1);else if(g)for(g=0;g>2],m=k(),q,r=n+4,z=0;z<=l;++z){var p=n+4+z*b;if(z==l||0==m[p>>h])r=d(r,p-r),void 0===q?q=r:(q+=String.fromCharCode(0),q+=r),r=p+b}V(n);return q},toWireType:function(n, -l){"string"!==typeof l&&S("Cannot pass non-string to C++ string type "+c);var m=g(l),q=pb(4+m+b);H[q>>2]=m>>h;e(l,q+4,m+b);null!==n&&n.push(V,q);return q},argPackAdvance:8,readValueFromPointer:Ka,ca:function(n){V(n)}})},A:function(a,b,c,d,e,g){Ia[a]={name:R(b),na:U(c,d),oa:U(e,g),fa:[]}},j:function(a,b,c,d,e,g,k,h,n,l){Ia[a].fa.push({ha:R(b),la:c,ja:U(d,e),ka:g,qa:k,pa:U(h,n),ra:l})},K:function(a,b){b=R(b);Q(a,{ua:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},m:Va, +l){"string"!==typeof l&&S("Cannot pass non-string to C++ string type "+c);var m=g(l),q=pb(4+m+b);H[q>>2]=m>>h;e(l,q+4,m+b);null!==n&&n.push(V,q);return q},argPackAdvance:8,readValueFromPointer:Ka,ca:function(n){V(n)}})},A:function(a,b,c,d,e,g){Ia[a]={name:R(b),na:U(c,d),oa:U(e,g),fa:[]}},i:function(a,b,c,d,e,g,k,h,n,l){Ia[a].fa.push({ha:R(b),la:c,ja:U(d,e),ka:g,qa:k,pa:U(h,n),ra:l})},K:function(a,b){b=R(b);Q(a,{ua:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},m:Va, M:function(a){if(0===a)return Wa(jb());var b=ib[a];a=void 0===b?R(a):b;return Wa(jb()[a])},x:function(a){4>> 2) + "+g+'], "parameter '+g+'");\nvar arg'+g+" = argType"+ g+".readValueFromPointer(args);\nargs += argType"+g+"['argPackAdvance'];\n";e=(new Function("requireRegisteredType","Module","__emval_register",k+("var obj = new constructor("+e+");\nreturn __emval_register(obj);\n}\n")))(kb,f,Wa);lb[b]=e}return e(a,c,d)},h:function(){y()},e:function(a,b){W(a,b||1);throw"longjmp";},E:function(a,b,c){C.copyWithin(a,b,b+c)},k:function(a){a>>>=0;var b=C.length;if(2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);d=Math.max(16777216, -a,d);0>>16);ua(B.buffer);var e=1;break a}catch(g){}e=void 0}if(e)return!0}return!1},u:function(){return 0},F:function(a,b,c,d){a=Ha.ta(a);b=Ha.sa(a,b,c);F[d>>2]=b;return 0},B:function(){},s:function(a,b,c,d){for(var e=0,g=0;g>2],h=F[b+(8*g+4)>>2],n=0;n>>16);ua(B.buffer);var e=1;break a}catch(g){}e=void 0}if(e)return!0}return!1},u:function(){return 0},F:function(a,b,c,d){a=Ha.ta(a);b=Ha.sa(a,b,c);F[d>>2]=b;return 0},B:function(){},t:function(a,b,c,d){for(var e=0,g=0;g>2],h=F[b+(8*g+4)>>2],n=0;n>2]=e;return 0},c:function(){return ea|0},r:qb,C:rb,q:sb,l:tb,o:ub,g:vb,d:wb,n:xb,a:B,b:function(a){ea=a|0},L:function(a){var b=Date.now()/1E3|0;a&&(F[a>>2]=b);return b}}; (function(){function a(e){f.asm=e.exports;I=f.asm.O;K--;f.monitorRunDependencies&&f.monitorRunDependencies(K);0==K&&(null!==Ba&&(clearInterval(Ba),Ba=null),L&&(e=L,L=null,e()))}function b(e){a(e.instance)}function c(e){return Fa().then(function(g){return WebAssembly.instantiate(g,d)}).then(e,function(g){w("failed to asynchronously prepare wasm: "+g);y(g)})}var d={a:yb};K++;f.monitorRunDependencies&&f.monitorRunDependencies(K);if(f.instantiateWasm)try{return f.instantiateWasm(d,a)}catch(e){return w("Module.instantiateWasm callback failed with error: "+ e),!1}(function(){return x||"function"!==typeof WebAssembly.instantiateStreaming||Ca()||"function"!==typeof fetch?c(b):fetch(M,{credentials:"same-origin"}).then(function(e){return WebAssembly.instantiateStreaming(e,d).then(b,function(g){w("wasm streaming compile failed: "+g);w("falling back to ArrayBuffer instantiation");return c(b)})})})().catch(ba);return{}})(); diff --git a/codecs/avif/enc/avif_enc.wasm b/codecs/avif/enc/avif_enc.wasm old mode 100644 new mode 100755 index a4c20cac..0733af68 Binary files a/codecs/avif/enc/avif_enc.wasm and b/codecs/avif/enc/avif_enc.wasm differ diff --git a/codecs/avif/enc/avif_enc_mt.js b/codecs/avif/enc/avif_enc_mt.js index 650688fe..89ffe616 100644 --- a/codecs/avif/enc/avif_enc_mt.js +++ b/codecs/avif/enc/avif_enc_mt.js @@ -16,82 +16,82 @@ function Ca(a){for(var b=0,c=0;c=b/4);){var f=w()[a+4*c>>2];if(0==f)break;++c;65536<=f?(f-=65536,d+=String.fromCharCode(55296|f>>10,56320|f&1023)):d+=String.fromCharCode(f)}return d}function Ha(a,b,c){void 0===c&&(c=2147483647);if(4>c)return 0;var d=b;c=d+c-4;for(var f=0;f=g){var h=a.charCodeAt(++f);g=65536+((g&1023)<<10)|h&1023}w()[b>>2]=g;b+=4;if(b+4>c)break}w()[b>>2]=0;return b-d} function Ia(a){for(var b=0,c=0;c=d&&++c;b+=4}return b}var l,ba,ca,da,ha,ia,ja,la,na;function n(a){l=a;z.HEAP8=ba=new Int8Array(a);z.HEAP16=da=new Int16Array(a);z.HEAP32=ia=new Int32Array(a);z.HEAPU8=ca=new Uint8Array(a);z.HEAPU16=ha=new Uint16Array(a);z.HEAPU32=ja=new Uint32Array(a);z.HEAPF32=la=new Float32Array(a);z.HEAPF64=na=new Float64Array(a)}var Ja=z.INITIAL_MEMORY||16777216; if(B)e=z.wasmMemory,l=z.buffer;else if(z.wasmMemory)e=z.wasmMemory;else if(e=new WebAssembly.Memory({initial:Ja/65536,maximum:32768,shared:!0}),!(e.buffer instanceof SharedArrayBuffer))throw D("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"),Error("bad memory");e&&(l=e.buffer);Ja=l.byteLength;n(l);var H,Ka=[],La=[],Ma=[],Na=[]; -function Oa(){var a=z.preRun.shift();Ka.unshift(a)}var J=0,Pa=null,Qa=null;z.preloadedImages={};z.preloadedAudios={};function E(a){if(z.onAbort)z.onAbort(a);B&&console.error("Pthread aborting at "+Error().stack);D(a);ya=!0;a=new WebAssembly.RuntimeError("abort("+a+"). Build with -s ASSERTIONS=1 for more info.");pa(a);throw a;}function Ra(){var a=K;return String.prototype.startsWith?a.startsWith("data:application/octet-stream;base64,"):0===a.indexOf("data:application/octet-stream;base64,")}var K="avif_enc_mt.wasm"; +function Oa(){var a=z.preRun.shift();Ka.unshift(a)}var I=0,Pa=null,Qa=null;z.preloadedImages={};z.preloadedAudios={};function E(a){if(z.onAbort)z.onAbort(a);B&&console.error("Pthread aborting at "+Error().stack);D(a);ya=!0;a=new WebAssembly.RuntimeError("abort("+a+"). Build with -s ASSERTIONS=1 for more info.");pa(a);throw a;}function Ra(){var a=K;return String.prototype.startsWith?a.startsWith("data:application/octet-stream;base64,"):0===a.indexOf("data:application/octet-stream;base64,")}var K="avif_enc_mt.wasm"; Ra()||(K=sa(K));function Sa(){try{if(wa)return new Uint8Array(wa);if(ta)return ta(K);throw"both async and sync fetching of the wasm failed";}catch(a){E(a)}}function Ta(){return wa||"function"!==typeof fetch?Promise.resolve().then(Sa):fetch(K,{credentials:"same-origin"}).then(function(a){if(!a.ok)throw"failed to load wasm binary file at '"+K+"'";return a.arrayBuffer()}).catch(function(){return Sa()})} -var Va={575933:function(a,b){setTimeout(function(){Ua(a,b)},0)},576011:function(){throw"Canceled!";}};function Wa(a){for(;0=a||a>aa().length||a&1||0>b)return-28;if(0==b)return 0;2147483647<=b&&(b=Infinity);var c=Atomics.load(w(),M.ub>>2),d=0;if(c==a&&Atomics.compareExchange(w(),M.ub>>2,c,0)==c&&(--b,d=1,0>=b))return 1;a=Atomics.notify(w(),a>>2,b);if(0<=a)return a+d;throw"Atomics.notify returned an unexpected value "+a;}z._emscripten_futex_wake=ab; -function bb(a){if(B)throw"Internal Error! cleanupThread() can only ever be called from main application thread!";if(!a)throw"Internal Error! Null pthread_ptr in cleanupThread!";w()[a+12>>2]=0;(a=M.Xa[a])&&M.ib(a.worker)} -var M={$b:1,jc:{xb:0,yb:0},Va:[],Za:[],Kb:function(){for(var a=navigator.hardwareConcurrency,b=0;ba;++a)y()[M.Ta/4+a]=0;w()[M.Ta+12>>2]=M.Ta;a=M.Ta+156;w()[a>>2]=a;var b=N(512);for(a=0;128>a;++a)y()[b/4+a]=0;Atomics.store(y(),M.Ta+104>>2,b);Atomics.store(y(),M.Ta+40>>2,M.Ta);Atomics.store(y(),M.Ta+44>>2,42);M.sb();$a(M.Ta,!1,1);cb(M.Ta)},Mb:function(){M.sb();oa(z);M.receiveObjectTransfer=M.Rb;M.setThreadStatus=M.Sb;M.threadCancel=M.Xb;M.threadExit= -M.Yb},sb:function(){M.ub=db},Xa:{},jb:[],Sb:function(){},wb:function(){for(;0>2,a),Atomics.store(y(),b+0>>2,1),Atomics.store(y(),b+60>>2,1),Atomics.store(y(),b+64>>2,0),M.wb(),ab(b+0,2147483647),$a(0,0,0),threadInfoStruct=0,B&&postMessage({cmd:"exit"}))},Xb:function(){M.wb();Atomics.store(y(),threadInfoStruct+4>>2,-1);Atomics.store(y(),threadInfoStruct+0>>2,1);ab(threadInfoStruct+0,2147483647); -threadInfoStruct=selfThreadId=0;$a(0,0,0);postMessage({cmd:"cancelDone"})},qc:function(){for(var a in M.Xa){var b=M.Xa[a];b&&b.worker&&M.ib(b.worker)}M.Xa={};for(a=0;a>2];w()[a.threadInfoStruct+104>>2]=0;O(b);O(a.threadInfoStruct)}a.threadInfoStruct=0;a.kb&&a.$a&&O(a.$a);a.$a=0;a.worker&&(a.worker.Ua= -null)}},ib:function(a){delete M.Xa[a.Ua.zb];M.Va.push(a);M.Za.splice(M.Za.indexOf(a),1);M.mb(a.Ua);a.Ua=void 0},Rb:function(){},tb:function(a,b){a.onmessage=function(c){var d=c.data,f=d.cmd;a.Ua&&(M.lb=a.Ua.threadInfoStruct);if(d.targetThread&&d.targetThread!=(L|0)){var g=M.Xa[d.pc];g?g.worker.postMessage(c.data,d.transferList):console.error('Internal error! Worker sent a message "'+f+'" to target pthread '+d.targetThread+", but that thread no longer exists!")}else if("processQueuedMainThreadWork"=== -f)fb();else if("spawnThread"===f)gb(c.data);else if("cleanupThread"===f)bb(d.thread);else if("killThread"===f){c=d.thread;if(B)throw"Internal Error! killThread() can only ever be called from main application thread!";if(!c)throw"Internal Error! Null pthread_ptr in killThread!";w()[c+12>>2]=0;c=M.Xa[c];c.worker.terminate();M.mb(c);M.Za.splice(M.Za.indexOf(c.worker),1);c.worker.Ua=void 0}else if("cancelThread"===f){c=d.thread;if(B)throw"Internal Error! cancelThread() can only ever be called from main application thread!"; -if(!c)throw"Internal Error! Null pthread_ptr in cancelThread!";M.Xa[c].worker.postMessage({cmd:"cancel"})}else"loaded"===f?(a.loaded=!0,b&&b(a),a.eb&&(a.eb(),delete a.eb)):"print"===f?ua("Thread "+d.threadId+": "+d.text):"printErr"===f?D("Thread "+d.threadId+": "+d.text):"alert"===f?alert("Thread "+d.threadId+": "+d.text):"exit"===f?a.Ua&&Atomics.load(y(),a.Ua.zb+68>>2)&&M.ib(a):"cancelDone"===f?M.ib(a):"objectTransfer"!==f&&("setimmediate"===c.data.target?a.postMessage(c.data):D("worker sent an unknown command "+ -f));M.lb=void 0};a.onerror=function(c){D("pthread sent an error! "+c.filename+":"+c.lineno+": "+c.message)};a.postMessage({cmd:"load",urlOrBlob:z.mainScriptUrlOrBlob||_scriptDir,wasmMemory:e,wasmModule:xa})},ob:function(){var a=sa("avif_enc_mt.worker.js");M.Va.push(new Worker(a))},Eb:function(){0==M.Va.length&&(M.ob(),M.tb(M.Va[0]));return 0>2])}var S={},T={},rb={}; +var Va={596853:function(a,b){setTimeout(function(){Ua(a,b)},0)},596931:function(){throw"Canceled!";}};function Wa(a){for(;0=a||a>aa().length||a&1||0>b)return-28;if(0==b)return 0;2147483647<=b&&(b=Infinity);var c=Atomics.load(w(),M.vb>>2),d=0;if(c==a&&Atomics.compareExchange(w(),M.vb>>2,c,0)==c&&(--b,d=1,0>=b))return 1;a=Atomics.notify(w(),a>>2,b);if(0<=a)return a+d;throw"Atomics.notify returned an unexpected value "+a;}z._emscripten_futex_wake=ab; +function bb(a){if(B)throw"Internal Error! cleanupThread() can only ever be called from main application thread!";if(!a)throw"Internal Error! Null pthread_ptr in cleanupThread!";w()[a+12>>2]=0;(a=M.Ya[a])&&M.jb(a.worker)} +var M={ac:1,kc:{yb:0,zb:0},Wa:[],$a:[],Lb:function(){for(var a=navigator.hardwareConcurrency,b=0;ba;++a)y()[M.Ua/4+a]=0;w()[M.Ua+12>>2]=M.Ua;a=M.Ua+156;w()[a>>2]=a;var b=N(512);for(a=0;128>a;++a)y()[b/4+a]=0;Atomics.store(y(),M.Ua+104>>2,b);Atomics.store(y(),M.Ua+40>>2,M.Ua);Atomics.store(y(),M.Ua+44>>2,42);M.tb();$a(M.Ua,!1,1);cb(M.Ua)},Nb:function(){M.tb();oa(z);M.receiveObjectTransfer=M.Sb;M.setThreadStatus=M.Tb;M.threadCancel=M.Yb;M.threadExit= +M.Zb},tb:function(){M.vb=db},Ya:{},kb:[],Tb:function(){},xb:function(){for(;0>2,a),Atomics.store(y(),b+0>>2,1),Atomics.store(y(),b+60>>2,1),Atomics.store(y(),b+64>>2,0),M.xb(),ab(b+0,2147483647),$a(0,0,0),threadInfoStruct=0,B&&postMessage({cmd:"exit"}))},Yb:function(){M.xb();Atomics.store(y(),threadInfoStruct+4>>2,-1);Atomics.store(y(),threadInfoStruct+0>>2,1);ab(threadInfoStruct+0,2147483647); +threadInfoStruct=selfThreadId=0;$a(0,0,0);postMessage({cmd:"cancelDone"})},rc:function(){for(var a in M.Ya){var b=M.Ya[a];b&&b.worker&&M.jb(b.worker)}M.Ya={};for(a=0;a>2];w()[a.threadInfoStruct+104>>2]=0;O(b);O(a.threadInfoStruct)}a.threadInfoStruct=0;a.lb&&a.ab&&O(a.ab);a.ab=0;a.worker&&(a.worker.Va= +null)}},jb:function(a){delete M.Ya[a.Va.Ab];M.Wa.push(a);M.$a.splice(M.$a.indexOf(a),1);M.nb(a.Va);a.Va=void 0},Sb:function(){},ub:function(a,b){a.onmessage=function(c){var d=c.data,f=d.cmd;a.Va&&(M.mb=a.Va.threadInfoStruct);if(d.targetThread&&d.targetThread!=(L|0)){var g=M.Ya[d.qc];g?g.worker.postMessage(c.data,d.transferList):console.error('Internal error! Worker sent a message "'+f+'" to target pthread '+d.targetThread+", but that thread no longer exists!")}else if("processQueuedMainThreadWork"=== +f)fb();else if("spawnThread"===f)gb(c.data);else if("cleanupThread"===f)bb(d.thread);else if("killThread"===f){c=d.thread;if(B)throw"Internal Error! killThread() can only ever be called from main application thread!";if(!c)throw"Internal Error! Null pthread_ptr in killThread!";w()[c+12>>2]=0;c=M.Ya[c];c.worker.terminate();M.nb(c);M.$a.splice(M.$a.indexOf(c.worker),1);c.worker.Va=void 0}else if("cancelThread"===f){c=d.thread;if(B)throw"Internal Error! cancelThread() can only ever be called from main application thread!"; +if(!c)throw"Internal Error! Null pthread_ptr in cancelThread!";M.Ya[c].worker.postMessage({cmd:"cancel"})}else"loaded"===f?(a.loaded=!0,b&&b(a),a.fb&&(a.fb(),delete a.fb)):"print"===f?ua("Thread "+d.threadId+": "+d.text):"printErr"===f?D("Thread "+d.threadId+": "+d.text):"alert"===f?alert("Thread "+d.threadId+": "+d.text):"exit"===f?a.Va&&Atomics.load(y(),a.Va.Ab+68>>2)&&M.jb(a):"cancelDone"===f?M.jb(a):"objectTransfer"!==f&&("setimmediate"===c.data.target?a.postMessage(c.data):D("worker sent an unknown command "+ +f));M.mb=void 0};a.onerror=function(c){D("pthread sent an error! "+c.filename+":"+c.lineno+": "+c.message)};a.postMessage({cmd:"load",urlOrBlob:z.mainScriptUrlOrBlob||_scriptDir,wasmMemory:e,wasmModule:xa})},pb:function(){var a=sa("avif_enc_mt.worker.js");M.Wa.push(new Worker(a))},Fb:function(){0==M.Wa.length&&(M.pb(),M.ub(M.Wa[0]));return 0>2])}var S={},T={},rb={}; function sb(a){if(void 0===a)return"_unknown";a=a.replace(/[^a-zA-Z0-9_]/g,"$");var b=a.charCodeAt(0);return 48<=b&&57>=b?"_"+a:a}function tb(a,b){a=sb(a);return(new Function("body","return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(b)} function ub(a){var b=Error,c=tb(a,function(d){this.name=a;this.message=d;d=Error(d).stack;void 0!==d&&(this.stack=this.toString()+"\n"+d.replace(/^Error(:[^\n]*)?\n/,""))});c.prototype=Object.create(b.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message};return c}var vb=void 0; function wb(a,b,c){function d(k){k=c(k);if(k.length!==a.length)throw new vb("Mismatched type converter count");for(var m=0;m>2])};case 3:return function(c){return this.fromWireType(ma()[c>>3])};default:throw new TypeError("Unknown float type: "+a);}}function Fb(a){var b=Function;if(!(b instanceof Function))throw new TypeError("new_ called with constructor type "+typeof b+" which is not a function");var c=tb(b.name||"unknownFunctionName",function(){});c.prototype=b.prototype;c=new c;a=b.apply(c,a);return a instanceof Object?a:c} -function Gb(a,b){var c=z;if(void 0===c[a].Wa){var d=c[a];c[a]=function(){c[a].Wa.hasOwnProperty(arguments.length)||W("Function '"+b+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+c[a].Wa+")!");return c[a].Wa[arguments.length].apply(this,arguments)};c[a].Wa=[];c[a].Wa[d.Ab]=d}} -function Hb(a,b,c){z.hasOwnProperty(a)?((void 0===c||void 0!==z[a].Wa&&void 0!==z[a].Wa[c])&&W("Cannot register public name '"+a+"' twice"),Gb(a,a),z.hasOwnProperty(c)&&W("Cannot register multiple overloads of a function with the same number of arguments ("+c+")!"),z[a].Wa[c]=b):(z[a]=b,void 0!==c&&(z[a].mc=c))}function Ib(a,b){for(var c=[],d=0;d>2)+d]);return c} +function Gb(a,b){var c=z;if(void 0===c[a].Xa){var d=c[a];c[a]=function(){c[a].Xa.hasOwnProperty(arguments.length)||W("Function '"+b+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+c[a].Xa+")!");return c[a].Xa[arguments.length].apply(this,arguments)};c[a].Xa=[];c[a].Xa[d.Bb]=d}} +function Hb(a,b,c){z.hasOwnProperty(a)?((void 0===c||void 0!==z[a].Xa&&void 0!==z[a].Xa[c])&&W("Cannot register public name '"+a+"' twice"),Gb(a,a),z.hasOwnProperty(c)&&W("Cannot register multiple overloads of a function with the same number of arguments ("+c+")!"),z[a].Xa[c]=b):(z[a]=b,void 0!==c&&(z[a].nc=c))}function Ib(a,b){for(var c=[],d=0;d>2)+d]);return c} function Jb(a,b){za(0<=a.indexOf("j"),"getDynCaller should only be called with i64 sigs");var c=[];return function(){c.length=arguments.length;for(var d=0;d>1]}:function(d){return fa()[d>>1]};case 2:return c?function(d){return w()[d>>2]}:function(d){return y()[d>>2]};default:throw new TypeError("Unknown integer type: "+a);}}var Qb={}; function Rb(){return"object"===typeof globalThis?globalThis:Function("return this")()}function Sb(a,b){var c=T[a];void 0===c&&W(b+" has unknown type "+Mb(a));return c}var Tb={};function Ub(a,b,c){if(0>=a||a>aa().length||a&1)return-28;a=Atomics.wait(w(),a>>2,b,c);if("timed-out"===a)return-73;if("not-equal"===a)return-6;if("ok"===a)return 0;throw"Atomics.wait returned an unexpected value "+a;} function Q(a,b){for(var c=arguments.length-2,d=Y(),f=Vb(8*c),g=f>>3,h=0;h>2]=b,w()[d.hb+4>>2]=c);if(d.vb||!d.cc)d.vb&&(d=d.vb),a=!1,d.gb&&d.gb.fb&&(a=d.gb.fb.getParameter(2978),a=0===a[0]&&0===a[1]&&a[2]===d.width&&a[3]===d.height),d.width=b,d.height=c,a&&d.gb.fb.viewport(0,0,b,c);else{if(d.hb){d=w()[d.hb+8>>2];a=a?G(a):"";var f=Y(),g=Vb(12),h=0;if(a){h=Ca(a)+1;var k=N(h);Ba(a,k,h);h=k}w()[g>>2]=h;w()[g+4>>2]=b;w()[g+8>>2]=c;bc(0,d,657457152,0,h,g);P(f);return 1}return-4}return 0} +function ac(a,b,c){var d=$b(a);if(!d)return-4;d.ib&&(w()[d.ib>>2]=b,w()[d.ib+4>>2]=c);if(d.wb||!d.dc)d.wb&&(d=d.wb),a=!1,d.hb&&d.hb.gb&&(a=d.hb.gb.getParameter(2978),a=0===a[0]&&0===a[1]&&a[2]===d.width&&a[3]===d.height),d.width=b,d.height=c,a&&d.hb.gb.viewport(0,0,b,c);else{if(d.ib){d=w()[d.ib+8>>2];a=a?G(a):"";var f=Y(),g=Vb(12),h=0;if(a){h=Ca(a)+1;var k=N(h);Ba(a,k,h);h=k}w()[g>>2]=h;w()[g+4>>2]=b;w()[g+8>>2]=c;bc(0,d,657457152,0,h,g);P(f);return 1}return-4}return 0} function cc(a,b,c){return B?Q(4,1,a,b,c):ac(a,b,c)}function dc(a){var b=a.getExtension("ANGLE_instanced_arrays");b&&(a.vertexAttribDivisor=function(c,d){b.vertexAttribDivisorANGLE(c,d)},a.drawArraysInstanced=function(c,d,f,g){b.drawArraysInstancedANGLE(c,d,f,g)},a.drawElementsInstanced=function(c,d,f,g,h){b.drawElementsInstancedANGLE(c,d,f,g,h)})} function ec(a){var b=a.getExtension("OES_vertex_array_object");b&&(a.createVertexArray=function(){return b.createVertexArrayOES()},a.deleteVertexArray=function(c){b.deleteVertexArrayOES(c)},a.bindVertexArray=function(c){b.bindVertexArrayOES(c)},a.isVertexArray=function(c){return b.isVertexArrayOES(c)})}function fc(a){var b=a.getExtension("WEBGL_draw_buffers");b&&(a.drawBuffers=function(c,d){b.drawBuffersWEBGL(c,d)})} -function gc(a){a||(a=hc);if(!a.Jb){a.Jb=!0;var b=a.fb;dc(b);ec(b);fc(b);b.dc=b.getExtension("EXT_disjoint_timer_query");b.lc=b.getExtension("WEBGL_multi_draw");var c="OES_texture_float OES_texture_half_float OES_standard_derivatives OES_vertex_array_object WEBGL_compressed_texture_s3tc WEBGL_depth_texture OES_element_index_uint EXT_texture_filter_anisotropic EXT_frag_depth WEBGL_draw_buffers ANGLE_instanced_arrays OES_texture_float_linear OES_texture_half_float_linear EXT_blend_minmax EXT_shader_texture_lod EXT_texture_norm16 WEBGL_compressed_texture_pvrtc EXT_color_buffer_half_float WEBGL_color_buffer_float EXT_sRGB WEBGL_compressed_texture_etc1 EXT_disjoint_timer_query WEBGL_compressed_texture_etc WEBGL_compressed_texture_astc EXT_color_buffer_float WEBGL_compressed_texture_s3tc_srgb EXT_disjoint_timer_query_webgl2 WEBKIT_WEBGL_compressed_texture_pvrtc".split(" "); -(b.getSupportedExtensions()||[]).forEach(function(d){-1!=c.indexOf(d)&&b.getExtension(d)})}}var hc,ic=["default","low-power","high-performance"];function jc(a){return B?Q(5,1,a):0}function kc(a,b,c,d){if(B)return Q(6,1,a,b,c,d);a=kb.fc(a);b=kb.ec(a,b,c);w()[d>>2]=b;return 0}function lc(a,b,c,d,f){if(B)return Q(7,1,a,b,c,d,f)} +function gc(a){a||(a=hc);if(!a.Kb){a.Kb=!0;var b=a.gb;dc(b);ec(b);fc(b);b.ec=b.getExtension("EXT_disjoint_timer_query");b.mc=b.getExtension("WEBGL_multi_draw");var c="OES_texture_float OES_texture_half_float OES_standard_derivatives OES_vertex_array_object WEBGL_compressed_texture_s3tc WEBGL_depth_texture OES_element_index_uint EXT_texture_filter_anisotropic EXT_frag_depth WEBGL_draw_buffers ANGLE_instanced_arrays OES_texture_float_linear OES_texture_half_float_linear EXT_blend_minmax EXT_shader_texture_lod EXT_texture_norm16 WEBGL_compressed_texture_pvrtc EXT_color_buffer_half_float WEBGL_color_buffer_float EXT_sRGB WEBGL_compressed_texture_etc1 EXT_disjoint_timer_query WEBGL_compressed_texture_etc WEBGL_compressed_texture_astc EXT_color_buffer_float WEBGL_compressed_texture_s3tc_srgb EXT_disjoint_timer_query_webgl2 WEBKIT_WEBGL_compressed_texture_pvrtc".split(" "); +(b.getSupportedExtensions()||[]).forEach(function(d){-1!=c.indexOf(d)&&b.getExtension(d)})}}var hc,ic=["default","low-power","high-performance"];function jc(a){return B?Q(5,1,a):0}function kc(a,b,c,d){if(B)return Q(6,1,a,b,c,d);a=kb.hc(a);b=kb.fc(a,b,c);w()[d>>2]=b;return 0}function lc(a,b,c,d,f){if(B)return Q(7,1,a,b,c,d,f)} function mc(a,b,c,d){if(B)return Q(8,1,a,b,c,d);for(var f=0,g=0;g>2],k=w()[b+(8*g+4)>>2],m=0;m>2]=f;return 0} -function gb(a){if(B)throw"Internal Error! spawnThread() can only ever be called from main application thread!";var b=M.Eb();if(void 0!==b.Ua)throw"Internal error!";if(!a.ab)throw"Internal error, no pthread ptr!";M.Za.push(b);for(var c=N(512),d=0;128>d;++d)w()[c+4*d>>2]=0;var f=a.$a+a.bb;d=M.Xa[a.ab]={worker:b,$a:a.$a,bb:a.bb,kb:a.kb,zb:a.ab,threadInfoStruct:a.ab};var g=d.threadInfoStruct>>2;Atomics.store(y(),g,0);Atomics.store(y(),g+1,0);Atomics.store(y(),g+2,0);Atomics.store(y(),g+17,a.pb);Atomics.store(y(), -g+26,c);Atomics.store(y(),g+12,0);Atomics.store(y(),g+10,d.threadInfoStruct);Atomics.store(y(),g+11,42);Atomics.store(y(),g+27,a.bb);Atomics.store(y(),g+21,a.bb);Atomics.store(y(),g+20,f);Atomics.store(y(),g+29,f);Atomics.store(y(),g+30,a.pb);Atomics.store(y(),g+32,a.xb);Atomics.store(y(),g+33,a.yb);c=nc()+40;Atomics.store(y(),g+44,c);b.Ua=d;var h={cmd:"run",start_routine:a.Wb,arg:a.cb,threadInfoStruct:a.ab,selfThreadId:a.ab,parentThreadId:a.Ob,stackBase:a.$a,stackSize:a.bb};b.eb=function(){h.time= -performance.now();b.postMessage(h,a.Zb)};b.loaded&&(b.eb(),delete b.eb)}function oc(){return L|0}z._pthread_self=oc; -function pc(a,b){if(!a)return D("pthread_join attempted on a null thread pointer!"),71;if(B&&selfThreadId==a)return D("PThread "+a+" is attempting to join to itself!"),16;if(!B&&M.Ta==a)return D("Main thread "+a+" is attempting to join to itself!"),16;if(w()[a+12>>2]!==a)return D("pthread_join attempted on thread "+a+", which does not point to a valid thread, or does not exist anymore!"),71;if(Atomics.load(y(),a+68>>2))return D("Attempted to join thread "+a+", which was already detached!"),28;for(;;){var c= -Atomics.load(y(),a+0>>2);if(1==c)return c=Atomics.load(y(),a+4>>2),b&&(w()[b>>2]=c),Atomics.store(y(),a+68>>2,1),B?postMessage({cmd:"cleanupThread",thread:a}):bb(a),0;if(B&&threadInfoStruct&&!Atomics.load(y(),threadInfoStruct+60>>2)&&2==Atomics.load(y(),threadInfoStruct+0>>2))throw"Canceled!";B||fb();Ub(a+0,c,B?100:1)}}B||M.Kb();vb=z.InternalError=ub("InternalError");for(var qc=Array(256),rc=0;256>rc;++rc)qc[rc]=String.fromCharCode(rc);yb=qc;zb=z.BindingError=ub("BindingError"); -z.count_emval_handles=function(){for(var a=0,b=5;b>g])},Ya:null})},$:function(a,b){b=V(b);U(a,{name:b,fromWireType:function(c){var d=X[c].value;Bb(c);return d},toWireType:function(c,d){return Cb(d)},argPackAdvance:8,readValueFromPointer:qb,Ya:null})},F:function(a,b,c){c=xb(c);b=V(b);U(a,{name:b,fromWireType:function(d){return d},toWireType:function(d,f){if("number"!==typeof f&& -"boolean"!==typeof f)throw new TypeError('Cannot convert "'+Db(f)+'" to '+this.name);return f},argPackAdvance:8,readValueFromPointer:Eb(b,c),Ya:null})},J:function(a,b,c,d,f,g){var h=Ib(b,c);a=V(a);f=Kb(d,f);Hb(a,function(){Ob("Cannot call "+a+" due to unbound types",h)},b-1);wb([],h,function(k){var m=a,q=a;k=[k[0],null].concat(k.slice(1));var p=f,v=k.length;2>v&&W("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var x=null!==k[1]&&!1,F=!1,t=1;t>>k}}var m=-1!=b.indexOf("unsigned");U(a,{name:b,fromWireType:g,toWireType:function(q,p){if("number"!== -typeof p&&"boolean"!==typeof p)throw new TypeError('Cannot convert "'+Db(p)+'" to '+this.name);if(pf)throw new TypeError('Passing a number "'+Db(p)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+d+", "+f+"]!");return m?p>>>0:p|0},argPackAdvance:8,readValueFromPointer:Pb(b,h,0!==d),Ya:null})},k:function(a,b,c){function d(g){g>>=2;var h=y();return new f(l,h[g+1],h[g])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array, -Float64Array][b];c=V(c);U(a,{name:c,fromWireType:d,argPackAdvance:8,readValueFromPointer:d},{Ib:!0})},G:function(a,b){b=V(b);var c="std::string"===b;U(a,{name:b,fromWireType:function(d){var f=y()[d>>2];if(c)for(var g=d+4,h=0;h<=f;++h){var k=d+4+h;if(h==f||0==r()[k]){g=G(g,k-g);if(void 0===m)var m=g;else m+=String.fromCharCode(0),m+=g;g=k+1}}else{m=Array(f);for(h=0;hd;++d)w()[c+4*d>>2]=0;var f=a.ab+a.cb;d=M.Ya[a.bb]={worker:b,ab:a.ab,cb:a.cb,lb:a.lb,Ab:a.bb,threadInfoStruct:a.bb};var g=d.threadInfoStruct>>2;Atomics.store(y(),g,0);Atomics.store(y(),g+1,0);Atomics.store(y(),g+2,0);Atomics.store(y(),g+17,a.qb);Atomics.store(y(), +g+26,c);Atomics.store(y(),g+12,0);Atomics.store(y(),g+10,d.threadInfoStruct);Atomics.store(y(),g+11,42);Atomics.store(y(),g+27,a.cb);Atomics.store(y(),g+21,a.cb);Atomics.store(y(),g+20,f);Atomics.store(y(),g+29,f);Atomics.store(y(),g+30,a.qb);Atomics.store(y(),g+32,a.yb);Atomics.store(y(),g+33,a.zb);c=nc()+40;Atomics.store(y(),g+44,c);b.Va=d;var h={cmd:"run",start_routine:a.Xb,arg:a.eb,threadInfoStruct:a.bb,selfThreadId:a.bb,parentThreadId:a.Pb,stackBase:a.ab,stackSize:a.cb};b.fb=function(){h.time= +performance.now();b.postMessage(h,a.$b)};b.loaded&&(b.fb(),delete b.fb)}function oc(){return L|0}z._pthread_self=oc; +function pc(a,b){if(!a)return D("pthread_join attempted on a null thread pointer!"),71;if(B&&selfThreadId==a)return D("PThread "+a+" is attempting to join to itself!"),16;if(!B&&M.Ua==a)return D("Main thread "+a+" is attempting to join to itself!"),16;if(w()[a+12>>2]!==a)return D("pthread_join attempted on thread "+a+", which does not point to a valid thread, or does not exist anymore!"),71;if(Atomics.load(y(),a+68>>2))return D("Attempted to join thread "+a+", which was already detached!"),28;for(;;){var c= +Atomics.load(y(),a+0>>2);if(1==c)return c=Atomics.load(y(),a+4>>2),b&&(w()[b>>2]=c),Atomics.store(y(),a+68>>2,1),B?postMessage({cmd:"cleanupThread",thread:a}):bb(a),0;if(B&&threadInfoStruct&&!Atomics.load(y(),threadInfoStruct+60>>2)&&2==Atomics.load(y(),threadInfoStruct+0>>2))throw"Canceled!";B||fb();Ub(a+0,c,B?100:1)}}B||M.Lb();vb=z.InternalError=ub("InternalError");for(var qc=Array(256),rc=0;256>rc;++rc)qc[rc]=String.fromCharCode(rc);yb=qc;zb=z.BindingError=ub("BindingError"); +z.count_emval_handles=function(){for(var a=0,b=5;b>g])},Za:null})},aa:function(a,b){b=V(b);U(a,{name:b,fromWireType:function(c){var d=X[c].value;Bb(c);return d},toWireType:function(c,d){return Cb(d)},argPackAdvance:8,readValueFromPointer:qb,Za:null})},G:function(a,b,c){c=xb(c);b=V(b);U(a,{name:b,fromWireType:function(d){return d},toWireType:function(d,f){if("number"!== +typeof f&&"boolean"!==typeof f)throw new TypeError('Cannot convert "'+Db(f)+'" to '+this.name);return f},argPackAdvance:8,readValueFromPointer:Eb(b,c),Za:null})},K:function(a,b,c,d,f,g){var h=Ib(b,c);a=V(a);f=Kb(d,f);Hb(a,function(){Ob("Cannot call "+a+" due to unbound types",h)},b-1);wb([],h,function(k){var m=a,q=a;k=[k[0],null].concat(k.slice(1));var p=f,v=k.length;2>v&&W("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var x=null!==k[1]&&!1,F=!1,t=1;t>>k}}var m=-1!=b.indexOf("unsigned");U(a,{name:b,fromWireType:g,toWireType:function(q,p){if("number"!== +typeof p&&"boolean"!==typeof p)throw new TypeError('Cannot convert "'+Db(p)+'" to '+this.name);if(pf)throw new TypeError('Passing a number "'+Db(p)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+d+", "+f+"]!");return m?p>>>0:p|0},argPackAdvance:8,readValueFromPointer:Pb(b,h,0!==d),Za:null})},l:function(a,b,c){function d(g){g>>=2;var h=y();return new f(l,h[g+1],h[g])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array, +Float64Array][b];c=V(c);U(a,{name:c,fromWireType:d,argPackAdvance:8,readValueFromPointer:d},{Jb:!0})},H:function(a,b){b=V(b);var c="std::string"===b;U(a,{name:b,fromWireType:function(d){var f=y()[d>>2];if(c)for(var g=d+4,h=0;h<=f;++h){var k=d+4+h;if(h==f||0==r()[k]){g=G(g,k-g);if(void 0===m)var m=g;else m+=String.fromCharCode(0),m+=g;g=k+1}}else{m=Array(f);for(h=0;h>2]=h;if(c&&g)Ba(f,k+4,h+1);else if(g)for(g=0;g>2],p=h(),v,x=m+4,F=0;F<=q;++F){var t=m+4+F*b;if(F==q||0==p[t>>k])x=d(x,t-x),void 0===v?v=x:(v+=String.fromCharCode(0),v+=x),x=t+b}O(m);return v},toWireType:function(m,q){"string"!==typeof q&&W("Cannot pass non-string to C++ string type "+c);var p=g(q),v=N(4+p+b);y()[v>> -2]=p>>k;f(q,v+4,p+b);null!==m&&m.push(O,v);return v},argPackAdvance:8,readValueFromPointer:qb,Ya:function(m){O(m)}})},N:function(a,b,c,d,f,g){ob[a]={name:V(b),Pb:Kb(c,d),Qb:Kb(f,g),rb:[]}},p:function(a,b,c,d,f,g,h,k,m,q){ob[a].rb.push({Cb:V(b),Hb:c,Fb:Kb(d,f),Gb:g,Ub:h,Tb:Kb(k,m),Vb:q})},ba:function(a,b){b=V(b);U(a,{ic:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},T:function(a,b){if(a==b)postMessage({cmd:"processQueuedMainThreadWork"});else if(B)postMessage({targetThread:a, -cmd:"processThreadQueue"});else{a=(a=M.Xa[a])&&a.worker;if(!a)return;a.postMessage({cmd:"processThreadQueue"})}return 1},w:Bb,_:function(a){if(0===a)return Cb(Rb());var b=Qb[a];a=void 0===b?V(a):b;return Cb(Rb()[a])},I:function(a){4>> 2) + "+g+'], "parameter '+g+'");\nvar arg'+g+" = argType"+g+".readValueFromPointer(args);\nargs += argType"+g+"['argPackAdvance'];\n";f=(new Function("requireRegisteredType","Module","__emval_register",h+("var obj = new constructor("+f+");\nreturn __emval_register(obj);\n}\n")))(Sb,z,Cb);Tb[b]=f}return f(a,c,d)},o:function(){E()},t:function(a,b,c){Yb.length=0;var d;for(c>>=2;d=r()[b++];)(d=105>d)&&c&1&&c++,Yb.push(d?ma()[c++>>1]:w()[c]),++c; -return Va[a].apply(null,Yb)},W:function(){},A:function(){},h:Ub,i:ab,f:hb,v:function(){return Za|0},u:function(){return Ya|0},j:function(a,b){Z(a,b||1);throw"longjmp";},P:function(a,b,c){r().copyWithin(a,b,b+c)},ea:function(){return navigator.hardwareConcurrency},Q:function(a,b,c){Xb.length=b;c>>=3;for(var d=0;da?Va[-a-1]:sc[a]).apply(null,Xb)},q:function(a){a>>>=0;var b=r().length;if(a<=b||2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d, -a+100663296);d=Math.max(16777216,a,d);0>>16);n(e.buffer);var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},R:function(a,b,c){return $b(a)?ac(a,b,c):cc(a,b,c)},g:function(){},S:function(a,b){var c={};b>>=2;c.alpha=!!w()[b];c.depth=!!w()[b+1];c.stencil=!!w()[b+2];c.antialias=!!w()[b+3];c.premultipliedAlpha=!!w()[b+4];c.preserveDrawingBuffer=!!w()[b+5];var d=w()[b+6];c.powerPreference=ic[d];c.failIfMajorPerformanceCaveat= -!!w()[b+7];c.Nb=w()[b+8];c.kc=w()[b+9];c.qb=w()[b+10];c.Bb=w()[b+11];c.nc=w()[b+12];c.oc=w()[b+13];a=$b(a);!a||c.Bb?c=0:(a=a.getContext("webgl",c))?(b=N(8),w()[b+4>>2]=L|0,d={hc:b,attributes:c,version:c.Nb,fb:a},a.canvas&&(a.canvas.gb=d),("undefined"===typeof c.qb||c.qb)&&gc(d),c=b):c=0;return c},E:jc,X:kc,L:lc,C:mc,c:function(){return va|0},O:function(){M.Lb()},z:uc,M:vc,y:wc,r:xc,s:yc,l:zc,d:Ac,a:e||z.wasmMemory,V:function(a){var b=M.jb.pop();a&&b()},B:ib,H:function(a,b,c,d){if("undefined"===typeof SharedArrayBuffer)return D("Current environment does not support SharedArrayBuffer, pthreads are not available!"), -6;if(!a)return D("pthread_create called with a null thread pointer!"),28;var f=[];if(B&&0===f.length)return Bc(687865856,a,b,c,d);var g=0,h=0,k=0,m=0;if(b){var q=w()[b>>2];q+=81920;g=w()[b+8>>2];h=0!==w()[b+12>>2];if(0===w()[b+16>>2]){var p=w()[b+20>>2],v=w()[b+24>>2];k=b+20;m=b+24;var x=M.lb?M.lb:L|0;if(k||m)if(x)if(w()[x+12>>2]!==x)D("pthread_getschedparam attempted on thread "+x+", which does not point to a valid thread, or does not exist anymore!");else{var F=Atomics.load(y(),x+108+20>>2);x=Atomics.load(y(), -x+108+24>>2);k&&(w()[k>>2]=F);m&&(w()[m>>2]=x)}else D("pthread_getschedparam called with a null thread pointer!");k=w()[b+20>>2];m=w()[b+24>>2];w()[b+20>>2]=p;w()[b+24>>2]=v}else k=w()[b+20>>2],m=w()[b+24>>2]}else q=2097152;(b=0==g)?g=Cc(16,q):(g-=q,za(0v;++v)y()[(p>>2)+v]=0;w()[a>>2]=p;w()[p+12>>2]=p;a=p+156;w()[a>>2]=a;c={$a:g,bb:q,kb:b,xb:k,yb:m,pb:h,Wb:c,ab:p,Ob:L|0,cb:d,Zb:f};B?(c.bc="spawnThread",postMessage(c,f)):gb(c);return 0},ca:function(a,b){return pc(a,b)},e:oc, -b:function(a){va=a|0},da:function(a){var b=Date.now()/1E3|0;a&&(w()[a>>2]=b);return b}}; -(function(){function a(f,g){z.asm=f.exports;H=z.asm.ga;xa=g;if(!B){var h=M.Va.length;M.Va.forEach(function(k){M.tb(k,function(){if(!--h&&(J--,z.monitorRunDependencies&&z.monitorRunDependencies(J),0==J&&(null!==Pa&&(clearInterval(Pa),Pa=null),Qa))){var m=Qa;Qa=null;m()}})})}}function b(f){a(f.instance,f.module)}function c(f){return Ta().then(function(g){return WebAssembly.instantiate(g,d)}).then(f,function(g){D("failed to asynchronously prepare wasm: "+g);E(g)})}var d={a:Dc};B||(za(!B,"addRunDependency cannot be used in a pthread worker"), -J++,z.monitorRunDependencies&&z.monitorRunDependencies(J));if(z.instantiateWasm)try{return z.instantiateWasm(d,a)}catch(f){return D("Module.instantiateWasm callback failed with error: "+f),!1}(function(){return wa||"function"!==typeof WebAssembly.instantiateStreaming||Ra()||"function"!==typeof fetch?c(b):fetch(K,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,d).then(b,function(g){D("wasm streaming compile failed: "+g);D("falling back to ArrayBuffer instantiation"); -return c(b)})})})().catch(pa);return{}})();var tc=z.___wasm_call_ctors=function(){return(tc=z.___wasm_call_ctors=z.asm.ha).apply(null,arguments)},N=z._malloc=function(){return(N=z._malloc=z.asm.ia).apply(null,arguments)},O=z._free=function(){return(O=z._free=z.asm.ja).apply(null,arguments)},Nb=z.___getTypeName=function(){return(Nb=z.___getTypeName=z.asm.ka).apply(null,arguments)}; -z.___embind_register_native_and_builtin_types=function(){return(z.___embind_register_native_and_builtin_types=z.asm.la).apply(null,arguments)};var nc=z._emscripten_get_global_libc=function(){return(nc=z._emscripten_get_global_libc=z.asm.ma).apply(null,arguments)};z.___em_js__initPthreadsJS=function(){return(z.___em_js__initPthreadsJS=z.asm.na).apply(null,arguments)}; -var Y=z.stackSave=function(){return(Y=z.stackSave=z.asm.oa).apply(null,arguments)},P=z.stackRestore=function(){return(P=z.stackRestore=z.asm.pa).apply(null,arguments)},Vb=z.stackAlloc=function(){return(Vb=z.stackAlloc=z.asm.qa).apply(null,arguments)},Z=z._setThrew=function(){return(Z=z._setThrew=z.asm.ra).apply(null,arguments)},Cc=z._memalign=function(){return(Cc=z._memalign=z.asm.sa).apply(null,arguments)}; -z._emscripten_main_browser_thread_id=function(){return(z._emscripten_main_browser_thread_id=z.asm.ta).apply(null,arguments)};var eb=z.___pthread_tsd_run_dtors=function(){return(eb=z.___pthread_tsd_run_dtors=z.asm.ua).apply(null,arguments)},fb=z._emscripten_main_thread_process_queued_calls=function(){return(fb=z._emscripten_main_thread_process_queued_calls=z.asm.va).apply(null,arguments)}; -z._emscripten_current_thread_process_queued_calls=function(){return(z._emscripten_current_thread_process_queued_calls=z.asm.wa).apply(null,arguments)};var cb=z._emscripten_register_main_browser_thread_id=function(){return(cb=z._emscripten_register_main_browser_thread_id=z.asm.xa).apply(null,arguments)},Ua=z._do_emscripten_dispatch_to_thread=function(){return(Ua=z._do_emscripten_dispatch_to_thread=z.asm.ya).apply(null,arguments)}; -z._emscripten_async_run_in_main_thread=function(){return(z._emscripten_async_run_in_main_thread=z.asm.za).apply(null,arguments)};z._emscripten_sync_run_in_main_thread=function(){return(z._emscripten_sync_run_in_main_thread=z.asm.Aa).apply(null,arguments)};z._emscripten_sync_run_in_main_thread_0=function(){return(z._emscripten_sync_run_in_main_thread_0=z.asm.Ba).apply(null,arguments)}; -z._emscripten_sync_run_in_main_thread_1=function(){return(z._emscripten_sync_run_in_main_thread_1=z.asm.Ca).apply(null,arguments)};z._emscripten_sync_run_in_main_thread_2=function(){return(z._emscripten_sync_run_in_main_thread_2=z.asm.Da).apply(null,arguments)};z._emscripten_sync_run_in_main_thread_xprintf_varargs=function(){return(z._emscripten_sync_run_in_main_thread_xprintf_varargs=z.asm.Ea).apply(null,arguments)}; -z._emscripten_sync_run_in_main_thread_3=function(){return(z._emscripten_sync_run_in_main_thread_3=z.asm.Fa).apply(null,arguments)};var Bc=z._emscripten_sync_run_in_main_thread_4=function(){return(Bc=z._emscripten_sync_run_in_main_thread_4=z.asm.Ga).apply(null,arguments)};z._emscripten_sync_run_in_main_thread_5=function(){return(z._emscripten_sync_run_in_main_thread_5=z.asm.Ha).apply(null,arguments)}; -z._emscripten_sync_run_in_main_thread_6=function(){return(z._emscripten_sync_run_in_main_thread_6=z.asm.Ia).apply(null,arguments)};z._emscripten_sync_run_in_main_thread_7=function(){return(z._emscripten_sync_run_in_main_thread_7=z.asm.Ja).apply(null,arguments)}; -var Wb=z._emscripten_run_in_main_runtime_thread_js=function(){return(Wb=z._emscripten_run_in_main_runtime_thread_js=z.asm.Ka).apply(null,arguments)},bc=z.__emscripten_call_on_thread=function(){return(bc=z.__emscripten_call_on_thread=z.asm.La).apply(null,arguments)};z._emscripten_tls_init=function(){return(z._emscripten_tls_init=z.asm.Ma).apply(null,arguments)};z.dynCall_jiiiiiiiii=function(){return(z.dynCall_jiiiiiiiii=z.asm.Na).apply(null,arguments)}; -z.dynCall_jiji=function(){return(z.dynCall_jiji=z.asm.Oa).apply(null,arguments)};z.dynCall_jiiiiiiii=function(){return(z.dynCall_jiiiiiiii=z.asm.Pa).apply(null,arguments)};z.dynCall_jiiiiii=function(){return(z.dynCall_jiiiiii=z.asm.Qa).apply(null,arguments)};z.dynCall_jiiiii=function(){return(z.dynCall_jiiiii=z.asm.Ra).apply(null,arguments)};z.dynCall_iiijii=function(){return(z.dynCall_iiijii=z.asm.Sa).apply(null,arguments)};var db=z._main_thread_futex=877788; -function yc(a,b){var c=Y();try{H.get(a)(b)}catch(d){P(c);if(d!==d+0&&"longjmp"!==d)throw d;Z(1,0)}}function Ac(a,b,c,d,f){var g=Y();try{H.get(a)(b,c,d,f)}catch(h){P(g);if(h!==h+0&&"longjmp"!==h)throw h;Z(1,0)}}function zc(a,b,c){var d=Y();try{H.get(a)(b,c)}catch(f){P(d);if(f!==f+0&&"longjmp"!==f)throw f;Z(1,0)}}function xc(a,b,c,d,f,g,h,k,m){var q=Y();try{return H.get(a)(b,c,d,f,g,h,k,m)}catch(p){P(q);if(p!==p+0&&"longjmp"!==p)throw p;Z(1,0)}} -function uc(a,b,c){var d=Y();try{return H.get(a)(b,c)}catch(f){P(d);if(f!==f+0&&"longjmp"!==f)throw f;Z(1,0)}}function wc(a,b,c,d,f){var g=Y();try{return H.get(a)(b,c,d,f)}catch(h){P(g);if(h!==h+0&&"longjmp"!==h)throw h;Z(1,0)}}function vc(a,b,c,d){var f=Y();try{return H.get(a)(b,c,d)}catch(g){P(f);if(g!==g+0&&"longjmp"!==g)throw g;Z(1,0)}}z.PThread=M;z.PThread=M;z._pthread_self=oc;z.wasmMemory=e;z.ExitStatus=Ec;var Fc; -function Ec(a){this.name="ExitStatus";this.message="Program terminated with exit("+a+")";this.status=a}Qa=function Gc(){Fc||Hc();Fc||(Qa=Gc)}; -function Hc(){function a(){if(!Fc&&(Fc=!0,z.calledRun=!0,!ya)){Wa(La);B||Wa(Ma);oa(z);if(z.onRuntimeInitialized)z.onRuntimeInitialized();if(!B){if(z.postRun)for("function"==typeof z.postRun&&(z.postRun=[z.postRun]);z.postRun.length;){var b=z.postRun.shift();Na.unshift(b)}Wa(Na)}}}if(!(0>2],p=h(),v,x=m+4,F=0;F<=q;++F){var t=m+4+F*b;if(F==q||0==p[t>>k])x=d(x,t-x),void 0===v?v=x:(v+=String.fromCharCode(0),v+=x),x=t+b}O(m);return v},toWireType:function(m,q){"string"!==typeof q&&W("Cannot pass non-string to C++ string type "+c);var p=g(q),v=N(4+p+b);y()[v>> +2]=p>>k;f(q,v+4,p+b);null!==m&&m.push(O,v);return v},argPackAdvance:8,readValueFromPointer:qb,Za:function(m){O(m)}})},O:function(a,b,c,d,f,g){ob[a]={name:V(b),Qb:Kb(c,d),Rb:Kb(f,g),sb:[]}},m:function(a,b,c,d,f,g,h,k,m,q){ob[a].sb.push({Db:V(b),Ib:c,Gb:Kb(d,f),Hb:g,Vb:h,Ub:Kb(k,m),Wb:q})},ca:function(a,b){b=V(b);U(a,{jc:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},U:function(a,b){if(a==b)postMessage({cmd:"processQueuedMainThreadWork"});else if(B)postMessage({targetThread:a, +cmd:"processThreadQueue"});else{a=(a=M.Ya[a])&&a.worker;if(!a)return;a.postMessage({cmd:"processThreadQueue"})}return 1},w:Bb,$:function(a){if(0===a)return Cb(Rb());var b=Qb[a];a=void 0===b?V(a):b;return Cb(Rb()[a])},J:function(a){4>> 2) + "+g+'], "parameter '+g+'");\nvar arg'+g+" = argType"+g+".readValueFromPointer(args);\nargs += argType"+g+"['argPackAdvance'];\n";f=(new Function("requireRegisteredType","Module","__emval_register",h+("var obj = new constructor("+f+");\nreturn __emval_register(obj);\n}\n")))(Sb,z,Cb);Tb[b]=f}return f(a,c,d)},p:function(){E()},t:function(a,b,c){Yb.length=0;var d;for(c>>=2;d=r()[b++];)(d=105>d)&&c&1&&c++,Yb.push(d?ma()[c++>>1]:w()[c]),++c; +return Va[a].apply(null,Yb)},X:function(){},B:function(){},i:Ub,j:ab,f:hb,v:function(){return Za|0},u:function(){return Ya|0},h:function(a,b){Z(a,b||1);throw"longjmp";},Q:function(a,b,c){r().copyWithin(a,b,b+c)},fa:function(){return navigator.hardwareConcurrency},R:function(a,b,c){Xb.length=b;c>>=3;for(var d=0;da?Va[-a-1]:sc[a]).apply(null,Xb)},q:function(a){a>>>=0;var b=r().length;if(a<=b||2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d, +a+100663296);d=Math.max(16777216,a,d);0>>16);n(e.buffer);var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},S:function(a,b,c){return $b(a)?ac(a,b,c):cc(a,b,c)},g:function(){},T:function(a,b){var c={};b>>=2;c.alpha=!!w()[b];c.depth=!!w()[b+1];c.stencil=!!w()[b+2];c.antialias=!!w()[b+3];c.premultipliedAlpha=!!w()[b+4];c.preserveDrawingBuffer=!!w()[b+5];var d=w()[b+6];c.powerPreference=ic[d];c.failIfMajorPerformanceCaveat= +!!w()[b+7];c.Ob=w()[b+8];c.lc=w()[b+9];c.rb=w()[b+10];c.Cb=w()[b+11];c.oc=w()[b+12];c.pc=w()[b+13];a=$b(a);!a||c.Cb?c=0:(a=a.getContext("webgl",c))?(b=N(8),w()[b+4>>2]=L|0,d={ic:b,attributes:c,version:c.Ob,gb:a},a.canvas&&(a.canvas.hb=d),("undefined"===typeof c.rb||c.rb)&&gc(d),c=b):c=0;return c},F:jc,Y:kc,M:lc,E:mc,c:function(){return va|0},P:function(){M.Mb()},x:uc,A:vc,N:wc,z:xc,s:yc,r:zc,k:Ac,d:Bc,a:e||z.wasmMemory,W:function(a){var b=M.kb.pop();a&&b()},C:ib,I:function(a,b,c,d){if("undefined"=== +typeof SharedArrayBuffer)return D("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;if(!a)return D("pthread_create called with a null thread pointer!"),28;var f=[];if(B&&0===f.length)return Cc(687865856,a,b,c,d);var g=0,h=0,k=0,m=0;if(b){var q=w()[b>>2];q+=81920;g=w()[b+8>>2];h=0!==w()[b+12>>2];if(0===w()[b+16>>2]){var p=w()[b+20>>2],v=w()[b+24>>2];k=b+20;m=b+24;var x=M.mb?M.mb:L|0;if(k||m)if(x)if(w()[x+12>>2]!==x)D("pthread_getschedparam attempted on thread "+ +x+", which does not point to a valid thread, or does not exist anymore!");else{var F=Atomics.load(y(),x+108+20>>2);x=Atomics.load(y(),x+108+24>>2);k&&(w()[k>>2]=F);m&&(w()[m>>2]=x)}else D("pthread_getschedparam called with a null thread pointer!");k=w()[b+20>>2];m=w()[b+24>>2];w()[b+20>>2]=p;w()[b+24>>2]=v}else k=w()[b+20>>2],m=w()[b+24>>2]}else q=2097152;(b=0==g)?g=Dc(16,q):(g-=q,za(0v;++v)y()[(p>>2)+v]=0;w()[a>>2]=p;w()[p+12>>2]=p;a=p+156;w()[a>>2]=a;c={ab:g,cb:q,lb:b,yb:k, +zb:m,qb:h,Xb:c,bb:p,Pb:L|0,eb:d,$b:f};B?(c.cc="spawnThread",postMessage(c,f)):gb(c);return 0},da:function(a,b){return pc(a,b)},e:oc,b:function(a){va=a|0},ea:function(a){var b=Date.now()/1E3|0;a&&(w()[a>>2]=b);return b}}; +(function(){function a(f,g){z.asm=f.exports;H=z.asm.ha;xa=g;if(!B){var h=M.Wa.length;M.Wa.forEach(function(k){M.ub(k,function(){if(!--h&&(I--,z.monitorRunDependencies&&z.monitorRunDependencies(I),0==I&&(null!==Pa&&(clearInterval(Pa),Pa=null),Qa))){var m=Qa;Qa=null;m()}})})}}function b(f){a(f.instance,f.module)}function c(f){return Ta().then(function(g){return WebAssembly.instantiate(g,d)}).then(f,function(g){D("failed to asynchronously prepare wasm: "+g);E(g)})}var d={a:Ec};B||(za(!B,"addRunDependency cannot be used in a pthread worker"), +I++,z.monitorRunDependencies&&z.monitorRunDependencies(I));if(z.instantiateWasm)try{return z.instantiateWasm(d,a)}catch(f){return D("Module.instantiateWasm callback failed with error: "+f),!1}(function(){return wa||"function"!==typeof WebAssembly.instantiateStreaming||Ra()||"function"!==typeof fetch?c(b):fetch(K,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,d).then(b,function(g){D("wasm streaming compile failed: "+g);D("falling back to ArrayBuffer instantiation"); +return c(b)})})})().catch(pa);return{}})();var tc=z.___wasm_call_ctors=function(){return(tc=z.___wasm_call_ctors=z.asm.ia).apply(null,arguments)},N=z._malloc=function(){return(N=z._malloc=z.asm.ja).apply(null,arguments)},O=z._free=function(){return(O=z._free=z.asm.ka).apply(null,arguments)},Nb=z.___getTypeName=function(){return(Nb=z.___getTypeName=z.asm.la).apply(null,arguments)}; +z.___embind_register_native_and_builtin_types=function(){return(z.___embind_register_native_and_builtin_types=z.asm.ma).apply(null,arguments)};var nc=z._emscripten_get_global_libc=function(){return(nc=z._emscripten_get_global_libc=z.asm.na).apply(null,arguments)};z.___em_js__initPthreadsJS=function(){return(z.___em_js__initPthreadsJS=z.asm.oa).apply(null,arguments)}; +var Y=z.stackSave=function(){return(Y=z.stackSave=z.asm.pa).apply(null,arguments)},P=z.stackRestore=function(){return(P=z.stackRestore=z.asm.qa).apply(null,arguments)},Vb=z.stackAlloc=function(){return(Vb=z.stackAlloc=z.asm.ra).apply(null,arguments)},Z=z._setThrew=function(){return(Z=z._setThrew=z.asm.sa).apply(null,arguments)},Dc=z._memalign=function(){return(Dc=z._memalign=z.asm.ta).apply(null,arguments)}; +z._emscripten_main_browser_thread_id=function(){return(z._emscripten_main_browser_thread_id=z.asm.ua).apply(null,arguments)};var eb=z.___pthread_tsd_run_dtors=function(){return(eb=z.___pthread_tsd_run_dtors=z.asm.va).apply(null,arguments)},fb=z._emscripten_main_thread_process_queued_calls=function(){return(fb=z._emscripten_main_thread_process_queued_calls=z.asm.wa).apply(null,arguments)}; +z._emscripten_current_thread_process_queued_calls=function(){return(z._emscripten_current_thread_process_queued_calls=z.asm.xa).apply(null,arguments)};var cb=z._emscripten_register_main_browser_thread_id=function(){return(cb=z._emscripten_register_main_browser_thread_id=z.asm.ya).apply(null,arguments)},Ua=z._do_emscripten_dispatch_to_thread=function(){return(Ua=z._do_emscripten_dispatch_to_thread=z.asm.za).apply(null,arguments)}; +z._emscripten_async_run_in_main_thread=function(){return(z._emscripten_async_run_in_main_thread=z.asm.Aa).apply(null,arguments)};z._emscripten_sync_run_in_main_thread=function(){return(z._emscripten_sync_run_in_main_thread=z.asm.Ba).apply(null,arguments)};z._emscripten_sync_run_in_main_thread_0=function(){return(z._emscripten_sync_run_in_main_thread_0=z.asm.Ca).apply(null,arguments)}; +z._emscripten_sync_run_in_main_thread_1=function(){return(z._emscripten_sync_run_in_main_thread_1=z.asm.Da).apply(null,arguments)};z._emscripten_sync_run_in_main_thread_2=function(){return(z._emscripten_sync_run_in_main_thread_2=z.asm.Ea).apply(null,arguments)};z._emscripten_sync_run_in_main_thread_xprintf_varargs=function(){return(z._emscripten_sync_run_in_main_thread_xprintf_varargs=z.asm.Fa).apply(null,arguments)}; +z._emscripten_sync_run_in_main_thread_3=function(){return(z._emscripten_sync_run_in_main_thread_3=z.asm.Ga).apply(null,arguments)};var Cc=z._emscripten_sync_run_in_main_thread_4=function(){return(Cc=z._emscripten_sync_run_in_main_thread_4=z.asm.Ha).apply(null,arguments)};z._emscripten_sync_run_in_main_thread_5=function(){return(z._emscripten_sync_run_in_main_thread_5=z.asm.Ia).apply(null,arguments)}; +z._emscripten_sync_run_in_main_thread_6=function(){return(z._emscripten_sync_run_in_main_thread_6=z.asm.Ja).apply(null,arguments)};z._emscripten_sync_run_in_main_thread_7=function(){return(z._emscripten_sync_run_in_main_thread_7=z.asm.Ka).apply(null,arguments)}; +var Wb=z._emscripten_run_in_main_runtime_thread_js=function(){return(Wb=z._emscripten_run_in_main_runtime_thread_js=z.asm.La).apply(null,arguments)},bc=z.__emscripten_call_on_thread=function(){return(bc=z.__emscripten_call_on_thread=z.asm.Ma).apply(null,arguments)};z._emscripten_tls_init=function(){return(z._emscripten_tls_init=z.asm.Na).apply(null,arguments)};z.dynCall_jiiiiiiiii=function(){return(z.dynCall_jiiiiiiiii=z.asm.Oa).apply(null,arguments)}; +z.dynCall_jiji=function(){return(z.dynCall_jiji=z.asm.Pa).apply(null,arguments)};z.dynCall_jiiiiiiii=function(){return(z.dynCall_jiiiiiiii=z.asm.Qa).apply(null,arguments)};z.dynCall_jiiiiii=function(){return(z.dynCall_jiiiiii=z.asm.Ra).apply(null,arguments)};z.dynCall_jiiiii=function(){return(z.dynCall_jiiiii=z.asm.Sa).apply(null,arguments)};z.dynCall_iiijii=function(){return(z.dynCall_iiijii=z.asm.Ta).apply(null,arguments)};var db=z._main_thread_futex=898708; +function zc(a,b){var c=Y();try{H.get(a)(b)}catch(d){P(c);if(d!==d+0&&"longjmp"!==d)throw d;Z(1,0)}}function Bc(a,b,c,d,f){var g=Y();try{H.get(a)(b,c,d,f)}catch(h){P(g);if(h!==h+0&&"longjmp"!==h)throw h;Z(1,0)}}function Ac(a,b,c){var d=Y();try{H.get(a)(b,c)}catch(f){P(d);if(f!==f+0&&"longjmp"!==f)throw f;Z(1,0)}}function yc(a,b,c,d,f,g,h,k,m){var q=Y();try{return H.get(a)(b,c,d,f,g,h,k,m)}catch(p){P(q);if(p!==p+0&&"longjmp"!==p)throw p;Z(1,0)}} +function vc(a,b,c){var d=Y();try{return H.get(a)(b,c)}catch(f){P(d);if(f!==f+0&&"longjmp"!==f)throw f;Z(1,0)}}function xc(a,b,c,d,f){var g=Y();try{return H.get(a)(b,c,d,f)}catch(h){P(g);if(h!==h+0&&"longjmp"!==h)throw h;Z(1,0)}}function wc(a,b,c,d){var f=Y();try{return H.get(a)(b,c,d)}catch(g){P(f);if(g!==g+0&&"longjmp"!==g)throw g;Z(1,0)}}function uc(a,b){var c=Y();try{return H.get(a)(b)}catch(d){P(c);if(d!==d+0&&"longjmp"!==d)throw d;Z(1,0)}}z.PThread=M;z.PThread=M;z._pthread_self=oc; +z.wasmMemory=e;z.ExitStatus=Fc;var Gc;function Fc(a){this.name="ExitStatus";this.message="Program terminated with exit("+a+")";this.status=a}Qa=function Hc(){Gc||Ic();Gc||(Qa=Hc)}; +function Ic(){function a(){if(!Gc&&(Gc=!0,z.calledRun=!0,!ya)){Wa(La);B||Wa(Ma);oa(z);if(z.onRuntimeInitialized)z.onRuntimeInitialized();if(!B){if(z.postRun)for("function"==typeof z.postRun&&(z.postRun=[z.postRun]);z.postRun.length;){var b=z.postRun.shift();Na.unshift(b)}Wa(Na)}}}if(!(0>1]}:function(d){return C[d>>1]};case 2:return c?function(d){return E[d>>2]}:function(d){return G[d>>2]};default:throw new TypeError("Unknown integer type: "+a);}}var kb={};function lb(){return"object"===typeof globalThis?globalThis:Function("return this")()}function mb(a,b){var c=P[a];void 0===c&&S(b+" has unknown type "+gb(a));return c}var nb={}; Ra=f.InternalError=Qa("InternalError");for(var ob=Array(256),pb=0;256>pb;++pb)ob[pb]=String.fromCharCode(pb);Ua=ob;Va=f.BindingError=Qa("BindingError");f.count_emval_handles=function(){for(var a=0,b=5;b>g])},da:null})},I:function(a,b){b=R(b);Q(a,{name:b,fromWireType:function(c){var d=T[c].value;Xa(c);return d},toWireType:function(c,d){return Ya(d)},argPackAdvance:8,readValueFromPointer:Ma,da:null})},v:function(a,b,c){c=Ta(c);b=R(b);Q(a,{name:b,fromWireType:function(d){return d},toWireType:function(d,e){if("number"!==typeof e&&"boolean"!==typeof e)throw new TypeError('Cannot convert "'+Za(e)+'" to '+this.name); return e},argPackAdvance:8,readValueFromPointer:$a(b,c),da:null})},y:function(a,b,c,d,e,g){var h=db(b,c);a=R(a);e=U(d,e);cb(a,function(){ib("Cannot call "+a+" due to unbound types",h)},b-1);Sa([],h,function(k){var l=[k[0],null].concat(k.slice(1)),n=k=a,m=e,p=l.length;2>p&&S("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var r=null!==l[1]&&!1,z=!1,q=1;q>>k}}var l=-1!=b.indexOf("unsigned");Q(a,{name:b,fromWireType:g,toWireType:function(n,m){if("number"!==typeof m&&"boolean"!==typeof m)throw new TypeError('Cannot convert "'+Za(m)+'" to '+ +"}\n");l=ab(A).apply(null,m);q=b-1;if(!f.hasOwnProperty(k))throw new Ra("Replacing nonexistant public symbol");void 0!==f[k].ba&&void 0!==q?f[k].ba[q]=l:(f[k]=l,f[k].ha=q);return[]})},j:function(a,b,c,d,e){function g(n){return n}b=R(b);-1===e&&(e=4294967295);var h=Ta(c);if(0===d){var k=32-8*c;g=function(n){return n<>>k}}var l=-1!=b.indexOf("unsigned");Q(a,{name:b,fromWireType:g,toWireType:function(n,m){if("number"!==typeof m&&"boolean"!==typeof m)throw new TypeError('Cannot convert "'+Za(m)+'" to '+ this.name);if(me)throw new TypeError('Passing a number "'+Za(m)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+d+", "+e+"]!");return l?m>>>0:m|0},argPackAdvance:8,readValueFromPointer:jb(b,h,0!==d),da:null})},f:function(a,b,c){function d(g){g>>=2;var h=G;return new e(F,h[g+1],h[g])}var e=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=R(c);Q(a,{name:c,fromWireType:d,argPackAdvance:8,readValueFromPointer:d}, {na:!0})},w:function(a,b){b=R(b);var c="std::string"===b;Q(a,{name:b,fromWireType:function(d){var e=G[d>>2];if(c)for(var g=d+4,h=0;h<=e;++h){var k=d+4+h;if(h==e||0==B[k]){if(g){for(var l=g+(k-g),n=g;!(n>=l)&&B[n];)++n;g=ma.decode(B.subarray(g,n))}else g="";if(void 0===m)var m=g;else m+=String.fromCharCode(0),m+=g;g=k+1}}else{m=Array(e);for(h=0;h=p&&(p=65536+((p&1023)<<10)|e.charCodeAt(++m)&1023);127>=p?++n:n=2047>=p?n+2:65535>=p?n+3:n+4}return n}:function(){return e.length})(),k=rb(4+h+1);G[k>>2]=h;if(c&&g)na(e,k+4,h+1);else if(g)for(g=0;g>2],m=h(),p,r=l+4,z=0;z<=n;++z){var q=l+4+z*b;if(z==n||0==m[q>>k])r=d(r,q-r),void 0===p?p=r:(p+=String.fromCharCode(0),p+=r),r=q+b}W(l);return p},toWireType:function(l, -n){"string"!==typeof n&&S("Cannot pass non-string to C++ string type "+c);var m=g(n),p=rb(4+m+b);G[p>>2]=m>>k;e(n,p+4,m+b);null!==l&&l.push(W,p);return p},argPackAdvance:8,readValueFromPointer:Ma,da:function(l){W(l)}})},A:function(a,b,c,d,e,g){N[a]={name:R(b),oa:U(c,d),pa:U(e,g),ga:[]}},j:function(a,b,c,d,e,g,h,k,l,n){N[a].ga.push({ia:R(b),ma:c,ka:U(d,e),la:g,ra:h,qa:U(k,l),sa:n})},K:function(a,b){b=R(b);Q(a,{va:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},m:Xa, +n){"string"!==typeof n&&S("Cannot pass non-string to C++ string type "+c);var m=g(n),p=rb(4+m+b);G[p>>2]=m>>k;e(n,p+4,m+b);null!==l&&l.push(W,p);return p},argPackAdvance:8,readValueFromPointer:Ma,da:function(l){W(l)}})},A:function(a,b,c,d,e,g){N[a]={name:R(b),oa:U(c,d),pa:U(e,g),ga:[]}},i:function(a,b,c,d,e,g,h,k,l,n){N[a].ga.push({ia:R(b),ma:c,ka:U(d,e),la:g,ra:h,qa:U(k,l),sa:n})},K:function(a,b){b=R(b);Q(a,{va:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},m:Xa, M:function(a){if(0===a)return Ya(lb());var b=kb[a];a=void 0===b?R(a):b;return Ya(lb()[a])},x:function(a){4>> 2) + "+g+'], "parameter '+g+'");\nvar arg'+g+" = argType"+ g+".readValueFromPointer(args);\nargs += argType"+g+"['argPackAdvance'];\n";e=(new Function("requireRegisteredType","Module","__emval_register",h+("var obj = new constructor("+e+");\nreturn __emval_register(obj);\n}\n")))(mb,f,Ya);nb[b]=e}return e(a,c,d)},h:function(){v()},e:function(a,b){X(a,b||1);throw"longjmp";},E:function(a,b,c){B.copyWithin(a,b,b+c)},k:function(a){a>>>=0;var b=B.length;if(2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);d=Math.max(16777216, -a,d);0>>16);ya(y.buffer);var e=1;break a}catch(g){}e=void 0}if(e)return!0}return!1},u:function(){return 0},F:function(a,b,c,d){a=Ka.ua(a);b=Ka.ta(a,b,c);E[d>>2]=b;return 0},B:function(){},s:function(a,b,c,d){for(var e=0,g=0;g>2],k=E[b+(8*g+4)>>2],l=0;l>>16);ya(y.buffer);var e=1;break a}catch(g){}e=void 0}if(e)return!0}return!1},u:function(){return 0},F:function(a,b,c,d){a=Ka.ua(a);b=Ka.ta(a,b,c);E[d>>2]=b;return 0},B:function(){},t:function(a,b,c,d){for(var e=0,g=0;g>2],k=E[b+(8*g+4)>>2],l=0;l>2]=e;return 0},c:function(){return ka|0},r:sb,C:tb,q:ub,l:vb,o:wb,g:xb,d:yb,n:zb,a:y,b:function(a){ka=a|0},L:function(a){var b=Date.now()/1E3|0;a&&(E[a>>2]=b);return b}}; (function(){function a(e){f.asm=e.exports;H=f.asm.O;J--;f.monitorRunDependencies&&f.monitorRunDependencies(J);0==J&&(null!==Fa&&(clearInterval(Fa),Fa=null),K&&(e=K,K=null,e()))}function b(e){a(e.instance)}function c(e){return Promise.resolve().then(Ia).then(function(g){return WebAssembly.instantiate(g,d)}).then(e,function(g){w("failed to asynchronously prepare wasm: "+g);v(g)})}var d={a:Ab};J++;f.monitorRunDependencies&&f.monitorRunDependencies(J);if(f.instantiateWasm)try{return f.instantiateWasm(d, a)}catch(e){return w("Module.instantiateWasm callback failed with error: "+e),!1}(function(){return x||"function"!==typeof WebAssembly.instantiateStreaming||Ga()||"function"!==typeof fetch?c(b):fetch(L,{credentials:"same-origin"}).then(function(e){return WebAssembly.instantiateStreaming(e,d).then(b,function(g){w("wasm streaming compile failed: "+g);w("falling back to ArrayBuffer instantiation");return c(b)})})})().catch(ba);return{}})(); diff --git a/codecs/avif/enc/avif_node_enc.wasm b/codecs/avif/enc/avif_node_enc.wasm index a4c20cac..0733af68 100755 Binary files a/codecs/avif/enc/avif_node_enc.wasm and b/codecs/avif/enc/avif_node_enc.wasm differ diff --git a/src/features/encoders/avif/client/index.tsx b/src/features/encoders/avif/client/index.tsx index f7d0316b..91f14737 100644 --- a/src/features/encoders/avif/client/index.tsx +++ b/src/features/encoders/avif/client/index.tsx @@ -25,18 +25,18 @@ interface Props { interface State { options: EncodeOptions; lossless: boolean; - maxQuality: number; - minQuality: number; - separateAlpha: boolean; - losslessAlpha: boolean; - maxAlphaQuality: number; - minAlphaQuality: number; + quality: number; showAdvanced: boolean; + maxAlphaQuality: number; + chromaDeltaQ: boolean; grayscale: boolean; subsample: number; tileRows: number; tileCols: number; effort: number; + sharpness: number; + aqMode: number; + tune: 'ssim' | 'psnr'; } const maxQuant = 63; @@ -53,34 +53,15 @@ export class Options extends Component { const { options } = props; - const lossless = options.maxQuantizer === 0 && options.minQuantizer === 0; - const minQuantizerValue = lossless - ? defaultOptions.minQuantizer - : options.minQuantizer; - const maxQuantizerValue = lossless - ? defaultOptions.maxQuantizer - : options.maxQuantizer; - const losslessAlpha = - options.maxQuantizerAlpha === 0 && options.minQuantizerAlpha === 0; - const minQuantizerAlphaValue = losslessAlpha - ? defaultOptions.minQuantizerAlpha - : options.minQuantizerAlpha; - const maxQuantizerAlphaValue = losslessAlpha - ? defaultOptions.maxQuantizerAlpha - : options.maxQuantizerAlpha; + const lossless = options.cqLevel === 0 && options.minQuantizerAlpha === 0; + const cqLevel = lossless ? defaultOptions.cqLevel : options.cqLevel; // Create default form state from options return { options, lossless, - losslessAlpha, - maxQuality: maxQuant - minQuantizerValue, - minQuality: maxQuant - maxQuantizerValue, - separateAlpha: - options.maxQuantizer !== options.maxQuantizerAlpha || - options.minQuantizer !== options.minQuantizerAlpha, - maxAlphaQuality: maxQuant - minQuantizerAlphaValue, - minAlphaQuality: maxQuant - maxQuantizerAlphaValue, + quality: maxQuant - cqLevel, + maxAlphaQuality: maxQuant - options.minQuantizerAlpha, grayscale: options.subsample === 0, subsample: options.subsample === 0 || lossless @@ -89,6 +70,9 @@ export class Options extends Component { tileRows: options.tileRowsLog2, tileCols: options.tileColsLog2, effort: maxSpeed - options.speed, + chromaDeltaQ: options.chromaDeltaQ, + sharpness: options.sharpness, + tune: options.targetSsim ? 'ssim' : 'psnr', }; } @@ -99,7 +83,10 @@ export class Options extends Component { private _inputChangeCallbacks = new Map void>(); - private _inputChange = (prop: keyof State, type: 'number' | 'boolean') => { + private _inputChange = ( + prop: keyof State, + type: 'number' | 'boolean' | 'string', + ) => { // Cache the callback for performance if (!this._inputChangeCallbacks.has(prop)) { this._inputChangeCallbacks.set(prop, (event: Event) => { @@ -109,61 +96,24 @@ export class Options extends Component { ? 'checked' in formEl ? formEl.checked : !!formEl.value - : Number(formEl.value); + : type === 'number' + ? Number(formEl.value) + : formEl.value; const newState: Partial = { [prop]: newVal, }; - // Ensure that min cannot be greater than max - switch (prop) { - case 'maxQuality': - if (newVal < this.state.minQuality) { - newState.minQuality = newVal as number; - } - break; - case 'minQuality': - if (newVal > this.state.maxQuality) { - newState.maxQuality = newVal as number; - } - break; - case 'maxAlphaQuality': - if (newVal < this.state.minAlphaQuality) { - newState.minAlphaQuality = newVal as number; - } - break; - case 'minAlphaQuality': - if (newVal > this.state.maxAlphaQuality) { - newState.maxAlphaQuality = newVal as number; - } - break; - } - const optionState = { ...this.state, ...newState, }; - const maxQuantizer = optionState.lossless - ? 0 - : maxQuant - optionState.minQuality; - const minQuantizer = optionState.lossless - ? 0 - : maxQuant - optionState.maxQuality; - const newOptions: EncodeOptions = { - maxQuantizer, - minQuantizer, - maxQuantizerAlpha: optionState.separateAlpha - ? optionState.losslessAlpha - ? 0 - : maxQuant - optionState.minAlphaQuality - : maxQuantizer, - minQuantizerAlpha: optionState.separateAlpha - ? optionState.losslessAlpha - ? 0 - : maxQuant - optionState.maxAlphaQuality - : minQuantizer, + cqLevel: optionState.lossless ? 0 : maxQuant - optionState.quality, + minQuantizerAlpha: optionState.lossless + ? 0 + : maxQuant - optionState.maxAlphaQuality, // Always set to 4:4:4 if lossless subsample: optionState.grayscale ? 0 @@ -173,6 +123,9 @@ export class Options extends Component { tileColsLog2: optionState.tileCols, tileRowsLog2: optionState.tileRows, speed: maxSpeed - optionState.effort, + chromaDeltaQ: optionState.chromaDeltaQ, + sharpness: optionState.sharpness, + targetSsim: optionState.tune === 'ssim', }; // Updating options, so we don't recalculate in getDerivedStateFromProps. @@ -196,16 +149,15 @@ export class Options extends Component { effort, grayscale, lossless, - losslessAlpha, maxAlphaQuality, - maxQuality, - minAlphaQuality, - minQuality, - separateAlpha, + quality, showAdvanced, subsample, tileCols, tileRows, + chromaDeltaQ, + sharpness, + tune, }: State, ) { return ( @@ -219,73 +171,15 @@ export class Options extends Component { {!lossless && ( -
-
- - Max quality: - -
-
- - Min quality: - -
-
- )} -
- - - {separateAlpha && ( -
- - - {!losslessAlpha && ( -
-
- - Max alpha quality: - -
-
- - Min alpha quality: - -
-
- )} -
+
+ + Quality: +
)} @@ -302,25 +196,62 @@ export class Options extends Component { {/**/} {!grayscale && !lossless && ( - +
+ +
+ + Max alpha quality: + +
+ +
+ + Sharpness: + +
+ +
)}
diff --git a/src/features/encoders/avif/shared/meta.ts b/src/features/encoders/avif/shared/meta.ts index 28073396..89ca3e29 100644 --- a/src/features/encoders/avif/shared/meta.ts +++ b/src/features/encoders/avif/shared/meta.ts @@ -18,12 +18,13 @@ export const label = 'AVIF'; export const mimeType = 'image/avif'; export const extension = 'avif'; export const defaultOptions: EncodeOptions = { - minQuantizer: 33, - maxQuantizer: 63, - minQuantizerAlpha: 33, - maxQuantizerAlpha: 63, + cqLevel: 33, + minQuantizerAlpha: 0, tileColsLog2: 0, tileRowsLog2: 0, speed: 8, subsample: 1, + chromaDeltaQ: false, + sharpness: 0, + targetSsim: false, };