]> granicus.if.org Git - libjpeg-turbo/commitdiff
Sometimes the sampling factors in grayscale images can be > 1 (for instance, if compr...
authorDRC <dcommander@users.sourceforge.net>
Fri, 21 Nov 2014 15:33:19 +0000 (15:33 +0000)
committerDRC <dcommander@users.sourceforge.net>
Fri, 21 Nov 2014 15:33:19 +0000 (15:33 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/libjpeg-turbo/code/branches/1.3.x@1419 632fc199-4ca6-4c93-a231-07263d6284db

ChangeLog.txt
turbojpeg.c

index 927286a55a1bdeff3978487d4cfa8a2423b910bc..326ba5d924fd9b104244b79ecc58ef79267d79f4 100644 (file)
@@ -28,6 +28,15 @@ about every 25 million iterations.
 [6] Fixed a build issue on OS X PowerPC platforms (md5cmp failed to build
 because OS X does not provide the le32toh() and htole32() functions.)
 
+[7] The TurboJPEG API previously generated an error ("Could not determine
+subsampling type for JPEG image") when attempting to decompress grayscale JPEG
+images that were compressed with a sampling factor other than 1 (for instance,
+with 'cjpeg -grayscale -sample 2x2').  Subsampling technically has no meaning
+with grayscale JPEGs, and thus the horizontal and vertical sampling factors
+for such images are ignored by the decompressor.  However, the TurboJPEG API
+was being too rigid and was expecting the sampling factors to be equal to 1
+before it treated the image as a grayscale JPEG.
+
 
 1.3.1
 =====
index 7b9811d5d9fd78257e29c1fe16c45e25b70803c3..33ae875bc0149b8bbe4c875e058f7b79217af59b 100644 (file)
@@ -279,6 +279,14 @@ static int setDecompDefaults(struct jpeg_decompress_struct *dinfo,
 static int getSubsamp(j_decompress_ptr dinfo)
 {
        int retval=-1, i, k;
+
+       /* The sampling factors actually have no meaning with grayscale JPEG files,
+          and in fact it's possible to generate grayscale JPEGs with sampling
+          factors > 1 (even though those sampling factors are ignored by the
+          decompressor.)  Thus, we need to treat grayscale as a special case. */
+       if(dinfo->num_components==1 && dinfo->jpeg_color_space==JCS_GRAYSCALE)
+               return TJSAMP_GRAY;
+
        for(i=0; i<NUMSUBOPT; i++)
        {
                if(dinfo->num_components==pixelsize[i])