Author: toad
Date: 2006-12-09 20:37:22 +0000 (Sat, 09 Dec 2006)
New Revision: 11321

Modified:
   trunk/freenet/src/freenet/clients/http/filter/JPEGFilter.java
Log:
Recognize and pass through restart markers.

Modified: trunk/freenet/src/freenet/clients/http/filter/JPEGFilter.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/filter/JPEGFilter.java       
2006-12-09 19:16:21 UTC (rev 11320)
+++ trunk/freenet/src/freenet/clients/http/filter/JPEGFilter.java       
2006-12-09 20:37:22 UTC (rev 11321)
@@ -28,11 +28,18 @@
  * http://www.obrador.com/essentialjpeg/headerinfo.htm
  * Also the JFIF spec.
  * Also http://cs.haifa.ac.il/~nimrod/Compression/JPEG/J6sntx2005.pdf
+ * http://svn.xiph.org/experimental/giles/jpegdump.c
+ * 
  */
 public class JPEGFilter implements ContentDataFilter {

        private final boolean deleteComments;
        private final boolean deleteExif;
+
+       private static final int MARKER_EOI = 0xD9; // End of image
+       private static final int MARKER_SOI = 0xD8; // Start of image
+       private static final int MARKER_RST0 = 0xD0; // First reset marker
+       private static final int MARKER_RST7 = 0xD7; // Last reset marker

        JPEGFilter(boolean deleteComments, boolean deleteExif) {
                this.deleteComments = deleteComments;
@@ -113,12 +120,14 @@
                                        markerType = dis.readUnsignedByte();
                                        if(baos != null) baos.write(markerType);
                                }
+                               if(logMINOR)
+                                       Logger.minor(this, "Marker type: 
"+Integer.toHexString(markerType));
                                long countAtStart = cis.count(); // After 
marker but before type
                                int blockLength;
-                               if(markerType != 0xD9)
+                               if(markerType == MARKER_EOI || markerType >= 
MARKER_RST0 && markerType <= MARKER_RST7)
+                                       blockLength = 0;
+                               else
                                        blockLength = dis.readUnsignedShort();
-                               else
-                                       blockLength = 0;
                                if(markerType == 0xDB // quantisation table
                                                || markerType == 0xC4 // 
huffman table
                                                || markerType == 0xC0) { // 
start of frame
@@ -161,7 +170,9 @@
                                                        // Termination inside a 
scan; valid I suppose
                                                        break;
                                                }
-                                               if(prevChar == 0xFF && x != 0) {
+                                               if(prevChar == 0xFF && x != 0 &&
+                                                               !(x >= 
MARKER_RST0 && x <= MARKER_RST7)) { // reset markers can occur in the scan
+                                                       
                                                        forceMarkerType = x;
                                                        if(logMINOR)
                                                                
Logger.minor(this, "Moved scan at "+cis.count()+", found a marker type 
"+Integer.toHexString(x));
@@ -254,10 +265,16 @@
                                        if(logMINOR)
                                                Logger.minor(this, "End of 
image");
                                } else {
+                                       if(markerType >= 0xE0 && markerType <= 
0xEF) {
+                                               // APP marker. Can be safely 
deleted.
+                                               if(logMINOR)
+                                                       Logger.minor(this, 
"Dropping application marker type "+Integer.toHexString(markerType)+" length 
"+blockLength);
+                                       } else {
+                                               if(logMINOR)
+                                                       Logger.minor(this, 
"Dropping unknown frame type "+Integer.toHexString(markerType)+" blockLength");
+                                       }
                                        // Delete frame
                                        skipBytes(dis, blockLength - 2);
-                                       if(logMINOR)
-                                               Logger.minor(this, "Dropping 
unknown frame "+Integer.toHexString(markerType));
                                        continue;
                                }



Reply via email to