From d96c9c5c6188b89f1d2a3ef14675b2776ae3af80 Mon Sep 17 00:00:00 2001 From: Jake Archibald Date: Wed, 5 May 2021 10:15:44 +0100 Subject: [PATCH] Custom progressive steps --- codecs/mozjpeg/dec/mozjpeg_node_dec.wasm | Bin 154070 -> 154053 bytes codecs/mozjpeg/enc/mozjpeg_enc.cpp | 62 ++++++++++++++++++++++- codecs/mozjpeg/enc/mozjpeg_enc.wasm | Bin 236147 -> 236447 bytes codecs/mozjpeg/enc/mozjpeg_node_enc.wasm | Bin 236147 -> 236447 bytes 4 files changed, 61 insertions(+), 1 deletion(-) diff --git a/codecs/mozjpeg/dec/mozjpeg_node_dec.wasm b/codecs/mozjpeg/dec/mozjpeg_node_dec.wasm index 0f08ea8deea3a4dfd11cbbe53e8a40c2609bd1ef..f624b442fb935652bb15213445a16a769e01476a 100755 GIT binary patch delta 1786 zcmXw(e@xVM7{@>F=kVh0d!7f05)gjxKqUkr6opyAR|FNL6cFTxxPn9uQYf3XSz4{u znx=KN$5N+j=4xtkUiGCQMZ?Vo+D)lktLe;D6Wjd5R;@OBzQ@2!q#ur|pP=enQBNrZ%iWS7%PE*}udrHyb!@EO85jls|% zhmKQ`vyT11P^4|r=^9jpX0ACY_WGJqIxrfV)mV?p&+iui}uFu=Za%*IKxC>^gS;!*Q-J_g(g{okntyTZ@}m#;JAq-g|CL1+z%`ojMtVV|=F$Ok-obXEi>ipU1eY9*1#^Z`7j*N6m}| zloN$7aROh!~eUiOoz#)rj+TD^PEhw}Wy4HeL?kT}ex*Fv>B?y`uJFpdI zlXD)BYK1%x(+A7dC>yopmE`Zn;+bI}u z_^KHlD0aEz^|I(8UlPyh#3)6h{7)y+@D)!B;#HLLz942Gg$IJDbf)NW<&za_U6|!x ztQI72xcmC-6KcJ!AHCCmSZc3cm0FujBd0|m-n_>d|d%#Dr1|Us8m6$NPFPgX=9mWa+us zV@ZYB!54dwN82y6qZj%3o#*#rE^c#MFY@q{8S2F=Ll`ut7f@~r{pjV26|~irDGzSV zb{<(lsm^x6)jK2)hfIGkga!4=zH(#w{88I34Q#oz9e&E{WeSA!Ha6BdD0F!-eoSSp=>@|L%B{X zof!smIsmS(xf&r6v{ z8GoIZUmB&jKfEBZR~g|8Tw=vntk|cF@eABmM;R3#e5*8XqEaeR{#aterHo4=LQ}>S z@kwq=jTx5~D-bKWozaPn-V;BY)9Yv&U#p{gr$r^+9hd)L!Myo}3lat3*q-2<{G|*#mV|i<6dQ9CTYCk`=hVr&OCpaYY3F)(VRA!sa zmxVXjd|mi)n{Np}WAlH)n{AGlvvt}$RXAv~F5GQ%j_^}97v-pQwcZYvNTS{5mBQ8- Y=F~=-jiX%FNExw{_e*A&H#Jhn|Mn>2sQ>@~ delta 1788 zcmXw%drVYE6vpQ}3oE-9@IrhbD&AdC5J8Y4iW=pj_yiw-!h#BlMOhF*X__V~*0zQw zwc4&aNvn-iW3;}z)T`C#T5Hor1R_>#wT&buCJjm3#6L`G)1HCrBy-MhzVpr8vom`; z=z0)zT?is#Xw(>&(*WbA?7ZMD+%t52dZ_|}@WS-~$p zc^kpreRq(c34`qh>DQpeG8ga{#ZXO&`e_7*1$H2C{J^zf!@=+14m}j+^*MU9*%_QJ zAMU{osV5*AA!~X9+G4TTx|xZq?wF3BMGonFDyK*TW=QUx2@l)O&%{Nty6T`qPOHRT z>gkm~RKjmn&qh9Bk##H&KM{p`W#e3YMlbJ4_dFcowRLJ9Oep9tz!<_p%e4^G99UqP zOYq#mJ0~u~Kfppceg*omK*kp1!HAdlgg=FZ$7zt+Z}Sj`%v_0yGPwk`^nS10SAtWt zw^z<6#R;63eWjR=b5{IH6cF|G$aQ7NTS*xfDHwYK3sP$@nQJ$~i-+ab8y#a@5%s0?hfLhh9r%|E=V`#0eOw8{~67$fW&wUJwH-uUY zGlj;eS`$Y2)*Oz+cFk~@J@6+9Z8rux+K+m#BS|Q|TQ=6C5R2v2dL+s%4cH-n_aiqd z2oLWz_p5z|d{U2qHF+~y2tD%H7Np{P*`?BDS=EG*Qs;m(a&Hs&xj^wzrKjV7lBS|f z-fBVyy?Q8LG$9kuu;S}(QrhCzMS z3fq6&*6RlKk6!C9Y<=6H{^YejFKO`n8l|_%v|_3ZZ{zMB$;@I(m6wVs-Ko~uiM zN|7-ol*(5ytAtjC3pM1K5}Hfxo$~Jzn&5uiDKtb1^LeNAlv4cUgLioyEzEY#!=u<9 zrh;%qt0*{fty_6?VLrYq>q;qc+^1bai;m@TY^;hrT*AD?A~ZI4$zLfq%MXp#_TY<|JHgQpsCa%UMW za4Aa?TSBs{jF#~&C6v?10rdc@9ddR#Wwf?1UgNo*_bL97XN}GGnK#+|lzE-a{mk2J ze#zWoa~StlXS2@iw|NY6gUu<-n{Ccc6A7Z$UgU9MgUyA^YJ{ZQN69!TvwV~|(0K<} KLUOH-HvSLFk=u;` diff --git a/codecs/mozjpeg/enc/mozjpeg_enc.cpp b/codecs/mozjpeg/enc/mozjpeg_enc.cpp index 27388587..7f9a9a72 100644 --- a/codecs/mozjpeg/enc/mozjpeg_enc.cpp +++ b/codecs/mozjpeg/enc/mozjpeg_enc.cpp @@ -141,6 +141,7 @@ val encode(std::string image_in, int image_width, int image_height, MozJpegOptio jpeg_c_set_bool_param(&cinfo, JBOOLEAN_TRELLIS_EOB_OPT, opts.trellis_opt_zero); jpeg_c_set_bool_param(&cinfo, JBOOLEAN_TRELLIS_Q_OPT, opts.trellis_opt_table); jpeg_c_set_int_param(&cinfo, JINT_TRELLIS_NUM_LOOPS, opts.trellis_loops); + jpeg_c_set_int_param(&cinfo, JINT_DC_SCAN_OPT_MODE, 0); // A little hacky to build a string for this, but it means we can use // set_quality_ratings which does some useful heuristic stuff. @@ -160,7 +161,66 @@ val encode(std::string image_in, int image_width, int image_height, MozJpegOptio } if (!opts.baseline && opts.progressive) { - jpeg_simple_progression(&cinfo); + if (cinfo.jpeg_color_space != JCS_YCbCr) { + jpeg_simple_progression(&cinfo); + } else { + jpeg_c_set_bool_param(&cinfo, JBOOLEAN_OPTIMIZE_SCANS, FALSE); + int num_scans = 6; + if (cinfo.script_space == NULL || cinfo.script_space_size < num_scans) { + cinfo.script_space_size = ((num_scans) > (10) ? (num_scans) : (10)); + cinfo.script_space = (jpeg_scan_info*)(*cinfo.mem->alloc_small)( + (j_common_ptr)&cinfo, JPOOL_PERMANENT, + cinfo.script_space_size * sizeof(jpeg_scan_info)); + } + jpeg_scan_info* scanptr = cinfo.script_space; + cinfo.scan_info = scanptr; + cinfo.num_scans = num_scans; + + // DC scan + scanptr->comps_in_scan = 3; + for (int ci = 0; ci < 3; ci++) { + scanptr->component_index[ci] = ci; + } + scanptr->Ss = scanptr->Se = scanptr->Ah = scanptr->Al = 0; + scanptr++; + // Luma progression + scanptr->comps_in_scan = 1; + scanptr->component_index[0] = 0; + scanptr->Ss = 1; + scanptr->Se = 63; + scanptr->Ah = 0; + scanptr->Al = 2; + scanptr++; + scanptr->comps_in_scan = 1; + scanptr->component_index[0] = 0; + scanptr->Ss = 1; + scanptr->Se = 63; + scanptr->Ah = 2; + scanptr->Al = 1; + scanptr++; + scanptr->comps_in_scan = 1; + scanptr->component_index[0] = 0; + scanptr->Ss = 1; + scanptr->Se = 63; + scanptr->Ah = 1; + scanptr->Al = 0; + scanptr++; + // Chroma full + scanptr->comps_in_scan = 1; + scanptr->component_index[0] = 2; + scanptr->Ss = 1; + scanptr->Se = 63; + scanptr->Ah = 0; + scanptr->Al = 0; + scanptr++; + scanptr->comps_in_scan = 1; + scanptr->component_index[0] = 1; + scanptr->Ss = 1; + scanptr->Se = 63; + scanptr->Ah = 0; + scanptr->Al = 0; + scanptr++; + } } else { cinfo.num_scans = 0; cinfo.scan_info = NULL; diff --git a/codecs/mozjpeg/enc/mozjpeg_enc.wasm b/codecs/mozjpeg/enc/mozjpeg_enc.wasm index 6dc8b5b6f0fb01905cc7748fefe6e551c322aa8c..e1fea38efbf670851ad1a0ca5fae042ceea3cb5b 100755 GIT binary patch delta 1442 zcmXw&U2IfE6vyX(=H9luce^aLMW9t@m&Poi@}bf#h+(ItC|_a&LfsZ91%+-gT0{5> zy1O-kL4?BHc2-&xBM&}+kSy^MLE!=U(1M^?glJSA{76kCDA9xmoV(l3!#Q*Q|KFUM z%-s9;G5`CH|0t2?p^?Q87%)x4wy3qtTVM!s2TDrH4U@?51KCar!qbmS_!2kpoqdQ4 za`t5}@jl>sw%xoo4Og>uGY1RMnw>PebR<^TvzC6YBX5k-U%T!4#wA#8_cczUWZJ&i zxXVq;o! z?fcBKv@9Sf@D1$b{!!VN_W!T}*POYfxDs(HpFuq#=ER?czUH4Zs$vl`l*y=17NJ+y z&Z5PTa3?*_VLYMPIlUAEgk?&_(1s=lO&DY72IVUdgqELd!A&$Pu@ZlxNfo!^V}B-N z#>2#dg@WYHjJnW@ZaSDzEvxV*9nPrVRw0YCs&_SN@P%`AHD-`6)nmpVVN3?*6muok zp-fF#gOGPfo>$CrqVwt+i~^;4)Q+{7=jLl`5qEQ48>%RkQ5|h4b?fbIdH-q~UMw5x z65_g#Ww}=)HL@^{sV=%LjyY<=0=z><)9TX&h&y-JV=J8Nal8kdaW<{PDZ)9Y=4E^U zoL4tq!ChQ%20GA36&GPOfD*bV3)A8da?O(z5AncCwQD`5c|7_x!ZagLrjBnwKOIOr z+cxSubjs%=0CjUSp74K#AQN16AzrCrb#^_bs$VwYKI~R^Heo(mRqbYsQ&n4Fs~0xo zwfpr0CC2H?Y7e23$wZJSDp=rqwQB<=IH$JYU4u^goLBM#PDxD>7AkmNR?E?$R8Cb|`XJDT*W+$&G94pW4HZ8O;IjFOF z&mBx2?J_N?rrW%ZQhQXw<_~*M?9rHy$#Z+u5u1;lc*m{%Os4jlR#`D)%y0wq_}$2K z)ZP*8A;9E`z3N|^kE^?_Yk!HhOZ4BL8y+SoBv^} zWoceD>Ok7Gx{S$F9)0ZbsnwC1X|lF%R{d-h>fx7_?B-LP!88X7PG?N(Kd9T?e6n-9 Hho|`e?F)t? delta 1106 zcmXw1ZERCj7{1Rryg#^AXnzCYgQJn!?o z&rROkY2p6!L-#Bp&h>d)Z4aq7sHR4`3W(~m+YAt^;PDjMY#{FRDDlF%ghgDzEqrah zM-6gvBE3wffUD_}X5xY|3AcPIKSEPh_WodUAW*Yz#b$4s$B7ldQ(g zrNFoaZO_f%x~TDNquux^hObD{r5Z};_-w@=s4!rNq zq||T;QM@?@VHZ;T(+(ub^%OtYiIe2V6#uCcX=Hf33sv}1EOw!mkhuhR9s!dmT92R{ z)?lO?Efy|!BWz(!4@wK?WOk{d_;O}^&Qm@YIbq#~N%cg}efMGyx(ntKYWPvcws=Xs8!YI-T;4C8Sm_5H%4@0}JBT^Oz^(EAYC0JSgT~#A)CXukFV__(D{@ zgekIl8JZs?Dg)*2Gd^UKhe_B+^)9~pGOGDU1E>)5eRvfc^BLjFm?=rlW z979;zc;q;eVtx>B*~n>^2u5+2*r{PFA%$Z9C|t0!48po!oO%t>%b0xK;U~i3r+aJh zvuGKkn{!mfDn62+4P@<2zL1~~?>HY*HRLKxNG!;;^lWoxyY-gZFP6uxu(cT9l%$(n z(`O{t6?Xm%eT6b0<7DOJl*{yV3; O_}wJEBDPG>5&9nyW< zy1O-kL4?BHc2-&xBM&}+kSy^MLE!=U(1M^?glJSA{76kCDA9xmoV(l3!#Q*Q|KFUM z%-s9;G5`CH|0t2?p^?Q87%)x4wy3qtTVM!s2TDrH4U@?51KCar!qbmS_!2kpoqdQ4 za`t5}@jl>sw%xoo4Og>uGY1RMnw>PebR<^TvzC6YBX5k-U%T!4#wA#8_cczUWZJ&i zxXVq;o! z?fcBKv@9Sf@D1$b{!!VN_W!T}*POYfxDs(HpFuq#=ER?czUH4Zs$vl`l*y=17NJ+y z&Z5PTa3?*_VLYMPIlUAEgk?&_(1s=lO&DY72IVUdgqELd!A&$Pu@ZlxNfo!^V}B-N z#>2#dg@WYHjJnW@ZaSDzEvxV*9nPrVRw0YCs&_SN@P%`AHD-`6)nmpVVN3?*6muok zp-fF#gOGPfo>$CrqVwt+i~^;4)Q+{7=jLl`5qEQ48>%RkQ5|h4b?fbIdH-q~UMw5x z65_g#Ww}=)HL@^{sV=%LjyY<=0=z><)9TX&h&y-JV=J8Nal8kdaW<{PDZ)9Y=4E^U zoL4tq!ChQ%20GA36&GPOfD*bV3)A8da?O(z5AncCwQD`5c|7_x!ZagLrjBnwKOIOr z+cxSubjs%=0CjUSp74K#AQN16AzrCrb#^_bs$VwYKI~R^Heo(mRqbYsQ&n4Fs~0xo zwfpr0CC2H?Y7e23$wZJSDp=rqwQB<=IH$JYU4u^goLBM#PDxD>7AkmNR?E?$R8Cb|`XJDT*W+$&G94pW4HZ8O;IjFOF z&mBx2?J_N?rrW%ZQhQXw<_~*M?9rHy$#Z+u5u1;lc*m{%Os4jlR#`D)%y0wq_}$2K z)ZP*8A;9E`z3N|^kE^?_Yk!HhOZ4BL8y+SoBv^} zWoceD>Ok7Gx{S$F9)0ZbsnwC1X|lF%R{d-h>fx7_?B-LP!88X7PG?N(Kd9T?e6n-9 Hho|`e?F)t? delta 1106 zcmXw1ZERCj7{1Rryg#^AXnzCYgQJn!?o z&rROkY2p6!L-#Bp&h>d)Z4aq7sHR4`3W(~m+YAt^;PDjMY#{FRDDlF%ghgDzEqrah zM-6gvBE3wffUD_}X5xY|3AcPIKSEPh_WodUAW*Yz#b$4s$B7ldQ(g zrNFoaZO_f%x~TDNquux^hObD{r5Z};_-w@=s4!rNq zq||T;QM@?@VHZ;T(+(ub^%OtYiIe2V6#uCcX=Hf33sv}1EOw!mkhuhR9s!dmT92R{ z)?lO?Efy|!BWz(!4@wK?WOk{d_;O}^&Qm@YIbq#~N%cg}efMGyx(ntKYWPvcws=Xs8!YI-T;4C8Sm_5H%4@0}JBT^Oz^(EAYC0JSgT~#A)CXukFV__(D{@ zgekIl8JZs?Dg)*2Gd^UKhe_B+^)9~pGOGDU1E>)5eRvfc^BLjFm?=rlW z979;zc;q;eVtx>B*~n>^2u5+2*r{PFA%$Z9C|t0!48po!oO%t>%b0xK;U~i3r+aJh zvuGKkn{!mfDn62+4P@<2zL1~~?>HY*HRLKxNG!;;^lWoxyY-gZFP6uxu(cT9l%$(n z(`O{t6?Xm%eT6b0<7DOJl*{yV3; O_}wJEBDPG>5&9nyW<