]> granicus.if.org Git - libjpeg-turbo/commitdiff
TurboJPEG: Decompress 4:4:4 JPEGs with unusual SFs
authorDRC <information@libjpeg-turbo.org>
Mon, 21 Jan 2019 19:57:55 +0000 (13:57 -0600)
committerDRC <information@libjpeg-turbo.org>
Mon, 21 Jan 2019 20:26:00 +0000 (14:26 -0600)
Normally, 4:4:4 JPEGs have horizontal x vertical luminance & chrominance
sampling factors of 1x1.  However, it is technically legal to create
4:4:4 JPEGs with sampling factors of 2x1, 1x2, 3x1, or 1x3, since the
sums of the products of those sampling factors are still <= 10.  The
libjpeg API correctly decodes such images, so the TurboJPEG API should
as well.

Fixes #323

ChangeLog.md
turbojpeg.c

index ebe26b66451ebf5bf547fcf6a53b246c72694037..461931bc461254dec8e094303267e52bc4c6d1b8 100644 (file)
@@ -22,6 +22,12 @@ djpeg.
 decompress a specially-crafted malformed JPEG image with a specified image
 width or height of 0 using the C version of TJBench.
 
+5. The TurboJPEG API will now decompress 4:4:4 JPEG images with 2x1, 1x2, 3x1,
+or 1x3 luminance and chrominance sampling factors.  This is a non-standard way
+of specifying 1x subsampling (normally 4:4:4 JPEGs have 1x1 luminance and
+chrominance sampling factors), but the JPEG format and the libjpeg API both
+allow it.
+
 
 2.0.1
 =====
index 3f7cd640677f68f1a61152a3efb1324ba5ca7b98..b3caa0d450bef4364326674659a620f60116ccdf 100644 (file)
@@ -359,6 +359,23 @@ static int getSubsamp(j_decompress_ptr dinfo)
           retval = i;  break;
         }
       }
+      /* Handle 4:4:4 images whose sampling factors are specified in
+         non-standard ways. */
+      if (dinfo->comp_info[0].h_samp_factor *
+          dinfo->comp_info[0].v_samp_factor <=
+          D_MAX_BLOCKS_IN_MCU / pixelsize[i] && i == TJSAMP_444) {
+        int match = 0;
+        for (k = 1; k < dinfo->num_components; k++) {
+          if (dinfo->comp_info[i].h_samp_factor ==
+              dinfo->comp_info[0].h_samp_factor &&
+              dinfo->comp_info[i].v_samp_factor ==
+              dinfo->comp_info[0].v_samp_factor)
+            match++;
+          if (match == dinfo->num_components - 1) {
+            retval = i;  break;
+          }
+        }
+      }
     }
   }
   return retval;