Use jpeg_calc_output_dimensions()

To avoid fuzz timeouts.
Also reduce WP2::testutil::kMaxNumPixels.

Change-Id: If8d9b21f63798dcbc23ec2c8805634c81761396d
Reviewed-on: https://chromium-review.googlesource.com/c/codecs/libwebp2/+/4228005
Tested-by: WebM Builds <builds@webmproject.org>
Reviewed-by: Maryla Ustarroz-Calonge <maryla@google.com>
diff --git a/imageio/jpegdec.cc b/imageio/jpegdec.cc
index 9aff254..4ff799f 100644
--- a/imageio/jpegdec.cc
+++ b/imageio/jpegdec.cc
@@ -419,7 +419,9 @@
   // setjmp() and longjmp() and needs to be freed afterwards.
   WP2Status ReadCanvas(volatile jpeg_decompress_struct* const dinfo,
                        uint8_t* volatile* const tmp_rgb) {
-    jpeg_start_decompress((j_decompress_ptr)dinfo);
+    // Use jpeg_calc_output_dimensions() to obtain the image dimensions before
+    // calling jpeg_start_decompress() which can be slow.
+    jpeg_calc_output_dimensions((j_decompress_ptr)dinfo);
 
     WP2_CHECK_OK(dinfo->output_components == kNumOutputComponents,
                  WP2_STATUS_UNSUPPORTED_FEATURE);
@@ -441,6 +443,8 @@
     JSAMPROW buffer[1];
     buffer[0] = (JSAMPLE*)*tmp_rgb;
 
+    jpeg_start_decompress((j_decompress_ptr)dinfo);
+
     while (dinfo->output_scanline < dinfo->output_height) {
       const uint32_t row = dinfo->output_scanline;
       WP2_CHECK_OK(jpeg_read_scanlines((j_decompress_ptr)dinfo, buffer, 1) == 1,
diff --git a/tests/fuzz/fuzz_utils.h b/tests/fuzz/fuzz_utils.h
index 54da2f5..3ad6c87 100644
--- a/tests/fuzz/fuzz_utils.h
+++ b/tests/fuzz/fuzz_utils.h
@@ -34,10 +34,12 @@
 namespace WP2 {
 namespace testutil {
 
-// Limit read image size to avoid out-of-memory issues.
+// Limit read image size to avoid out-of-memory and timeout issues.
 // Hint:  kMaxNumPixels * kMaxBytesPerPixel (4) * kMaxNumFullCanvasAlloc (3)
 //        should be below kMaxFuzzMemory (2 GB).
-constexpr size_t kMaxNumPixels = 1u << 26;
+// Hint:  Fuzzed inputs of a few megapixels tend to take longer than
+//        kEncodingMaxNumSeconds to decode when sanitizers are enabled.
+constexpr size_t kMaxNumPixels = 1u << 22;
 
 // Limit encoding duration to avoid timeout issues (< 90 seconds).
 constexpr double kEncodingMaxNumSeconds = 60.;