From 73a880a35844f4f1ebb2dcceefca370e4c1e641f Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Thu, 21 Jun 2012 16:08:03 +0200 Subject: [PATCH] TMI-23: Better handling of SOS segment (variable length). Now treats the rest of the stream after SOS as single segment. Not really ideal, but gives better performance than scanning for EOI... --- .../jpeg/JPEGSegmentImageInputStream.java | 14 ++++++++++++-- .../plugins/jpeg/JPEGImageReaderTest.java | 16 ++++++++++++++++ .../jpeg/JPEGSegmentImageInputStreamTest.java | 12 ++++++++++++ .../test/resources/jpeg/eof-sos-segment-bug.jpg | Bin 0 -> 9299 bytes 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 imageio/imageio-jpeg/src/test/resources/jpeg/eof-sos-segment-bug.jpg diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java index 9ee10865..87dd6004 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java @@ -101,8 +101,18 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { segments.add(segment); } else { - int length = stream.readUnsignedShort(); // Length including length field itself - segment = new Segment(marker, realPosition, segment.end(), 2 + length); + long length; + + if (marker == JPEG.SOS) { + // Treat rest of stream as a single segment (scanning for EOI is too much work) + length = Long.MAX_VALUE - realPosition; + } + else { + // Length including length field itself + length = stream.readUnsignedShort() + 2; + } + + segment = new Segment(marker, realPosition, segment.end(), length); segments.add(segment); } diff --git a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java index f9c1a61d..6fa34246 100644 --- a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java +++ b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java @@ -276,6 +276,22 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCaseAgr(8Q=GQ-<{j$yEAKM)~q$>kG-C~_CCK|p0l2Fp5M8iyj}!QX{e~H0PubfK0H1E z;Ccq22)IQ|OhQa_i-d%P^wup>3VJFEa&ihL+B-mc4i+v>b{2NFd%O|?_jp8k*w_W3 zLZVU-IXO8lekFB988r!6ImjO%c(+JNDaa{6R8%0yefIm1|K)Mr0sxZWCE(q{$72WF z0OH{T@vgrBKma@d9w8nc;J*(dyc_t0!~`V2tqN2CJbe5c_(X*GH*Va-Cj|WVzJX6b z2qa>=O)W%B1J%<{WH+#ML(&R|a46h)#wjAM=pLF=)k^1C?e%VWWa&4?-QTSM;Qw8O zKLQXD{I)Ry|H%l%yYU;E{dyWehW|Sl5FZGT2ZXY-pQ1@3BS|8I{|}1-*2pL|c6NP| z$akUaT>p~_$L9P#Wv|ULbwm46>Umfq-COhtV(;Jw>IEC5QJyC&(gesufA!~+_MeV- zlr&W2{%*?c#P~lazy8ZKE2ZLpoKW=-4*CDP5&rK3Bq%BA0jYpMy#LoiH{HuP)kud8 z@9mf6rNoF=?-&v-H}5;NsZJKt_OV`v5~t?nO*8(%Qc z6Ye`eB|)kT_XU*Wq?X@dRC$@raAGY>Ru7eo1Lox12HzZ$h_JWMZ}xP_@m&KtX?YxY zN{u&p?AbG7{16$8?ZK{F!ZHeE8~<{(hQ7Aqhr8q!4F9a@)8JW-i@SRC^pWC2U=Oaw z?}lRCH9!!quF#-4T00Q{W9sZ@2$~+#@7WCAT1rg31|WX0#_HG2pdfA@JjE+cTmvE` zt}#UIx)0qPbVB4Q9$tjF>?yQsl{%bi^=6W6?hI9DW%N*ZCQ-6|*%3A$G9Es4GZyoX zD$7zbI0Ftg=^EZz;vhO2fTs$baa;bW!sKfu(R zn{&~Z%#U?O&;BaNx~*i|qO1^I@TyTd*_cx3@S^61B6bC^&TE7UP(U^5!i;dkIK7c} z&aNy@C1uc~PRWJQ$P2P^E##bM;qJZ6Loj-0OZtrkYJIG}!uKT=XQNvnzVoYdQWN`8 zA8gzJ`cgp?4hK7|BOmLq+J>Ebm;=0hmOI5sxN%tQf*xE;l@Df!99Oa~pcOpu2@iSO zJ`w2B=KA7|;Q+1%m-IZfqD+8Rt3ZCE;{1vCtQS7SStRq7_0q_RW5x+(*{~Q*$^${E zS{OeF(@oDGb9j5%trEYhr1|3(V=Q6k4}S5qlE)JhO=#lY@#N&p;Kg*vMyRr8NfEET zg|&>=ZKwfcF}l3!6=~+zRU0Xmnqalo&c2DDJQVsPOwmY(=I|(UkAWV9M=l9D|7j#Y zI&I$+p>MV)jx~!dIDT{nFS3%#CvWYs9H7t^BvKm;r&DN@J)GK#an;mgi|TjOBdh-s z0}wfb4mR+jvn#)wJD&>Osnp^vMBdk&e+Z!tK?069^2v4|e0lb1kPmjCKTB#xYgmH@ z60_{`Z)Vl0PCU!=e=-$N_ub56G|5|fa(j+!Hxe*1CG~+!5`s^#p9LsyG}(v!M9w(s znefW%p*;Bll|&J*+!y!w5KIzKoDJezAyQmEWY3P=Tck~GtKP=;QlYP~LC81n(`X%v zSYgzV{f25LD`aBz_wvMtxA+>?s$YPM)@VmYjL7rvsz~@{6Z%s5=ko889^X82i+56rMSf zc3vtayQT+LG8_ohMgGKO483G9xDvBgO0x^koiftW)6u5C^rM$dU+iypbzRDgctC7l zHNSbqg0bt_sdd6gVpM_TY(HGOS=Sj6fhW+R?TQma=ls}$Q;~@qb~%M0?WAlgj5ENN zz*&tkUd$`)LOCeZga>qR&LucVR?df{i!1lgQK%maLLN-jbZm}4DA{m2VGqYf$cRYb zgPiad=$_&)%13o3=M@x&=lW~OZOeGn7luCp^5x?Wi z@yT>ip2oU@J14z`VjN#(?|iuLo!Kb9JN4Sg^h2!yGfxJWvVr+92lLkygrgTDnP*$O z4s&_-sJGv0W6Rdm7JE?Z1jU{3syT!Oz+#U$Rqp=1t9t-l-%@9-U8JUC%7du;FEz#Z z3f=Hx++1BA68Sr&XN>p3;r&GKG1&0EUfwVnqQ_!r%YaIeI651|$sEB4k{W6KMR+b) z?Ce(6mrKb7zR_j|PVydkSiKWmq`0Bao?Q_5g^Lm-c|54Z;7X0>w}Kgd1bS8)vQ$Rt zLl(T0Z$;g#AWiG&V-`3Vm1txjJ1QzIUiTPzxJKkdBC8%2j;c$J3OR)dJsfdm;tR>n z`u5nq*WOlX6sJt1nm2zip0%3Y_qyeYpR=fLOK+3|YaD}wRa{aI`UKedBe19|3nJX zN^0>MklGr14M^&HQ7K2%C~Q#%2^CnYYfja6~^=r;*R&x6Mw;Gai&gmO^A zk4O^N?tNQ4C0OwUg`GLW_(PDIuU$=3H4s5igmv`Y;I9;d-ULDZR!RG~5wG^yN12XskEn+OPWc*5BYUeWDU!3b$*!qBr zp&soa7HcqH@v(QWTk$H)%PIaOR(Bb-Y*qQW&?gvv5UTAS=t_)i2N#@_*XY~9)tR)k z2)u+1#6On{8mee2PIh@p9&}D}6Ih_Lz}2C?3_4=8G6`K*9D!P3mq}o7sVp|UL|j!* zRY!#5XDsp_Mq-C#ikLIb^eT+2ZXNMcZoy2`-Y;$VF|`yKOEzr;JGj7b&U9>vdUGKEHK2QP|HSME8s;3Dy{#4G zU27fHm>ycUpn|sA4gSz{nK~8E!_4fQUGA#$og9ree^A*7XV#3rxxAfz z{xf)r0DBRTGg_C5_PI&Q8cCieyiQ%|pc=*Hz~nmiRjR-=b-M>)RjK2zd97dPv&w8laGE+26`Bxx#Cc)NL&g4XPrW6*0ga8(C3fw;crA0mcgOS%dzHEG1zZ;x3^;>2jAL+eZ%d=bmh(X5lU5h(o^ zbSW-%tA1R|XpNsvQ)5<>Yd9!hMN7-FrxW+D4QVmGVwyqG*r?H!MMpH)PF^36V@jpw z2^u}-K1(*meCi= znR6)T8)J9|dZvK0c0^pIW1dBSy710XQ|uz~o6RJl-fuXXS}N~NQ8C!jSogO2uhRG9 zlK8O^B=}Z^pW%*YPRfM>5~fq7j}$bO8ZA+e--Z({BHl#SFxR&?CU}8R3TtNq6ZcQY zGb)+X%{T0eIYlr;H=c~AW0+Z3$kv%}^>Mfu@&3vm71=V248^TUXXb>3B06V-*H>I+ z>IQ#Oc{ZYq?n`H0nN6lo3Hk z`CQb3e${qMeVG^%vm}J(JtKKV~gv`Q`?ARW%t;xU%Dq z%`E*mEy>QRu6DtmnhEv+dS3%v6%N0@(Yy@*I9!7Zmaa`gA=<~PL~Afvs1AZ~IMmFj z_Im5zNLJsq0wdu8&_Wp&@yH5gYDy1eph~*uFe@J9+ zhQy}mLJj|NMuLV`N2e{Rg1M~7GBcka^nhNmwc6T=YJr>5M|9!NCp9l;w3wc@w62ao zJya))AFz%|Xw6twsw48FaPQm&tJ;X~U|wA{@#kkzPk5P;hrZR;y>*LtaL)8)Ax(8k zlq%@c~WO+Iqq!$S(D zPf*sfJQPM>Q{4!kJM@o~V*AYHa{f#Tn?7Q;_sL#Eeis#8v1oB*$6BAa^LU`I$jLN3 z<9K?TL3eVll@(As+|bj{3j7gP1ucD^Ue{`g>{F*M=Haw-cr5^S8{CsIL+V69%Dgj# zRINVt+2v%SrB!QcV@2rbp##1*XT5r7*(m}7hr$=^vg?dZT=&SzX>UjSS8R_if~1+* ziPXI>xHs--61{I$_RV-Zzb|6)Ek96Sd`VC^m1*=9!3sWP_eb#&>l=!JotN2+H@z(D z7zje&~c76Bk>seCKiBqE+15rZaX#L9}D3nK++ zp-9d_x$s1*;?bD8Y_)0kMOU=#g6@+kc=MOVK%axQgmT$F!|7e4Xhy9^$mrg)aD~pc z9f+KaaVK%y1#~$@!HlaJ`*YrztX^^#@<0vjl1+w)V5T>kn4Iw(AD@ZA0aWcn_N_G| zf91zdic(-~`>F%gx}xWCIPtX9<9eiQ83Q<4_>ASF%KEw9^pl~QQy)mZx*2S4fO~aj z-G}!VpM-P76mj)R{_Yv?H`y&a`zbSxd3qL_j$EN-z-E)Sdl_mNN8{r^Q!cCQ=mlGh zj)?mH_8HM+%hJH)M%|r&x!?c!O1xmN#4%{*?X{P7N3464LlyocH9?tE?3Mk`97+kX zegyG_`~0n}>lNnIp(=rQH0H=1FnYTBV}?fEeIA(NjCnOr=NV!ScNIb5{MSpqyD0%d zYpG-6)0mPRtGL*~m{nqm9HO#~nSifl$+^|0c3X@FVxq`bAmj~7ApM~3O+c{PM*gj$ zQ0br44%Q=P8CcT>I85aj8~uc+H*mI%RQ+-(z$wi?d;$h`@T;Z$C@QXjO(jE0<>h${ zmtO*IOy`o*HmmEJxr`Z=_-%E-5g+wB#LWZ}z@6d;op%mlf5Qano|t!Oz%M7n45E&tm6#f^6jfQ`nvx{WD_et*|Ibs98qA*R)&hOQv;W$1d}0&zu3NFH~- zh!lG#Y7{GQuVg~Zdom|TcTITK9>5kmTR&jS5qa8j3@OjZGP3^=OUgS}ptx!M=`50o z_8~CnXB+iLD{l*w22MEP|~Icdjn5VX0D-k z>mE+~+UG3Wg6X%ULm#rP$i95d?CrqYCq~M5dw8Y*U7Y8o1WF4v1I023sZS6;lZ>eD zvY+_G*p!sHNl3`SyM%UP%ML_SQ1FwJb2F(+ZN}iQR?VEqZiSyAu)+?HO@oc5ppnac8sdmNNVVf%LLI z5d7ujIj$nlxwXY@^0wd^e(KaYLMs>kko97hn+#XCr75xfZX**V8Bgt+mEr1abqddx zQsXGnF;qvs-Y)RUTQ>`YaL)_Fip{g%;Qrgs)Bq6()g?7?0&C*k`k>jA+nVs*y zybAiAtxJ4JdwMz*-PKzaN_~)a z-=mVO`WUF**)IF|!(;6JFUW9Ny{dZOK3b?pd)=$uofQ7VCF4hE8T|d6e4D;WKGr}u z_rcOrbr>~>)cTNuxV<~xdcR@>i#>dbz?kztPR5x&_Y77h2&;fNyZa2t2;R849&FzH z@UfO+z_>otxd?r4OO-#p64-EdK0Aciw>1v#(+#8|y@uxb(iri(-rM{|~eXMyuCLCq1%VN0`S3CIY?F(Va7;Sbr|^#;Z}9Xfd8V1$9|kP>267d)|kPt7L1A8 zFWl6mC-!QwYKr*v`u=y*0J%^3H5fmbu)cey64nFaQH)R+ZFPN$0FH-|l6tAo6+lF`nBazVl{je8 zzY;Zl&1`*ydYv#2q@{5t=f;_@WGz~_tSmBm{ynAhC&NQ%>tL1+5O#N4Mk~=M!xSr_ zHgfzgInoAPC|Lv|-CWlhx{_gA962^YdvV{2^4->E?enepxBEhcO&C=tBUp;L98Qvy z1Fkf1IGE3awC;`Ekc8uOIja50ogw0z`~<^lEdf6qO<9$zwoh2M4$zQ-Ihb$XsY_DxuSNF5;am4cHOSBBo9u3Bd~jK^q!tfTtzda z>S@RVze>I#9)d_-((?ai!)RdtqIdsEkr{HZ!Kjox$tXVRnTxKr)R{S%$Hn+BCU)%j zUVUrd8@W@e-Sw2%b~#JS zTbUn?!@Ad{Ef{GsRofWiv|xCVHBOPi5DZeHv&FZ#H!lq|G68_nvz}*1ZAyEK>@0^%7c#n?Yg)v2RNZ;@|0a^2J5{{ z;@b9b;RC1uN2@38Tm7Pcc^&e17kank(UVVe_F2_TqE#`8t3+zQ9&%jh6Xs0F?|{#) z0hSWifE%yYql?2HzT_$Av%{A$22Ya37e2i#Wp{|N9v)+U?q^vQzdNXy#Mxl?zFufT zS7=$~Q=HldHWv|A&!fYsr^@+Zut(Z~0s(!B7`r#7o$IbQy;l=%c3%T7Yr3z3&iA)p zc{B z-8=Ye1%>_BfR^&3Rx?!{*W9!?v=AS4Wf#Xyj;MT#*aUa|Cp_5*{Q3$9B@2Ayj$@-J zI;~`ZiH`;bZ0W(wD}LenA`vVC!I0U!!H2B$dxm>^6(Bs|OjZ3JYG825J1SM3Jwv7s zn?fVFmshDTeCBus3apmCXeB4J^R zB7DCjdT(M&LSHnSpiZ@{W%o8=a8)fwYp4egbm=RaaF5L8m8r15S6jmPR)ZF)RRAim zs-4uHI}n&kAO!hdKe<8DbKJt6OFnY{n=`g*$WVu-+EA*dKTaJLm$4Tou735zoJjIT zj!lG-**&M{ga%f*flf#|0~s~H2w=jjRfI1~AnQE)kci3Dw>S~dTREd9;|uc0W7Cc9 z+c)Ox3F1-*!;MmE7&C&hbcCB0%)p{C#nBS3Dieod`{WR*!a%0VQ2nAj@0mWH4#zRN zThozdy1mBFN>IRF>rU69yCaK=;leUEH)`v^PfT2~s@|E!{XvU*dUa}o#+r9c+e7MB z_xvxiKjg-Dl!I@#Jx7#iGI9>f(+qOOM_Mli3k!XpEzvA5!=1b})ZTg@L(5l?%x%#8 zzK0pl7L5Oe%HtaF?lvKe42SI$$#)j>_H$q_4S&}Q;?bcYSe1yaV4-jgly*5a`(XVm z8D(3(bfjh2J$cW=B%zDG{a{(z3UuM?HAS@f50|jC>61U5euR1;PCw1Ee*PQnh(tiy zMqJ)3sO@iUXE*!f#}`~fPjebKd(fX|tjAKQwYL%J8wje18|ISmFX~4#j+V|BRhKgt z1Z!Q}E~`|w{AoI;yh)vv6HUJ7nj+H6>jVH1U3>B?tz zx5Z-l9J&f-IpcvR`Y#+`)Lp&)0|f)6EgdpE?r<-R#;Wn4Xuq2`rf3OSZPn+dIks;;5|-9+yihPerCwg?vc{g*4*`KmD1D z_Md41OMY^}J-}%dx`sYQ_u}kTJ4lVYL9_d<&3B-!J)5JXEa$hSiug~)e5BUAM!a#@ z$DNaNWaXWpHfdlRP2mTY@}?!JKidTSm{Vj)hkzRBDRcD#SwPzJ_-**<3&#-ho-NnL zrQ$L`41|vTMMCm(ZUrrv44qoB*Y3*eIOcLL-%ZGt+n* z$)l_9e3^*2^Xauz{m(*1K3tmg-GE)Oc@4CavWTzgA*u11L^4C$I_2yfCYS@U68rAW zpD=%^j_yI}AIa_g0o}AjxKZ}k%6~!sLtFiiu>QRN1JA41bh#h@iunsl{MB6h6f!57 zvE_r!6)+KM#a2*%);`nb_RrWWiW2<)N{g>IRC*5w{`)=PzxtT|>-~e}dg{LcdqEam literal 0 HcmV?d00001