Handle unpremul in TestAnimEncConfig

Change-Id: I2e084acd2630feee8b328d428f411543800beab9
Reviewed-on: https://chromium-review.googlesource.com/c/codecs/libwebp2/+/5782856
Reviewed-by: Maryla Ustarroz-Calonge <maryla@google.com>
Tested-by: WebM Builds <builds@webmproject.org>
diff --git a/src/wp2/encode.h b/src/wp2/encode.h
index 00acf18..c9788da 100644
--- a/src/wp2/encode.h
+++ b/src/wp2/encode.h
@@ -58,6 +58,8 @@
                                 // Range: [0=faster-bigger .. 9=slower-better]
   bool use_av1 = false;  // Use lossy AV1 internally instead of lossy WP2.
   bool exact = false;    // Do not pre-multiply the input (for lossless only).
+                         // TODO: b/359162718 - Rename this field and signal
+                         //                     premul status in encoded files.
 
   // Side parameters:
   // Set whether the image will be rotated or mirrored during decoding.
diff --git a/tests/fuzz/fuzz_anim.cc b/tests/fuzz/fuzz_anim.cc
index 8d78625..aefd24c 100644
--- a/tests/fuzz/fuzz_anim.cc
+++ b/tests/fuzz/fuzz_anim.cc
@@ -35,10 +35,10 @@
 
 int TestAnimEncConfig(const std::vector<ArgbBuffer>& original_frames,
                       const std::vector<uint32_t>& durations_ms,
-                      bool loop_forever, const EncoderConfig& config,
+                      bool loop_forever, const EncoderConfig& encoder_config,
                       float expected_distortion) {
-  // std::cerr << config << std::endl;  // Uncomment to print config
-  if (!config.IsValid()) abort();
+  // std::cerr << encoder_config << std::endl;  // Uncomment to print config
+  if (!encoder_config.IsValid()) abort();
   if (original_frames.empty()) return 0;
 
   // Add frames to the encoder.
@@ -53,9 +53,9 @@
   // Encode with a reasonable config, without diving into detailed settings.
   MemoryWriter memory_writer;
   const WP2Status encoder_status =
-      animation_encoder.Encode(&memory_writer, config, loop_forever);
+      animation_encoder.Encode(&memory_writer, encoder_config, loop_forever);
   if (encoder_status != WP2_STATUS_OK) {
-    if (config.progress_hook != nullptr &&
+    if (encoder_config.progress_hook != nullptr &&
         encoder_status == WP2_STATUS_USER_ABORT) {
       return 0;
     }
@@ -65,8 +65,13 @@
   // Verify that it decodes fine and that the result is close enough.
   ArgbBuffer decoded(original_frames.front().format());
   ArgbBuffer decoded_unoriented(original_frames.front().format());
-  ArrayDecoder decoder(memory_writer.mem_, memory_writer.size_,
-                       DecoderConfig::kDefault, &decoded);
+  DecoderConfig decoder_config = DecoderConfig::kDefault;
+  // AnimationEncoder does not take EncoderConfig::exact into account.
+  // It encodes the input frames in their original premul/unpremul state.
+  // The decoder has no way to know that, so it must be told.
+  decoder_config.exact = !WP2IsPremultiplied(original_frames.front().format());
+  ArrayDecoder decoder(memory_writer.mem_, memory_writer.size_, decoder_config,
+                       &decoded);
   for (size_t i = 0; i < original_frames.size(); ++i) {
     uint32_t duration_ms;
     if (!decoder.ReadFrame(&duration_ms)) abort();
@@ -76,12 +81,12 @@
     if (expected_distortion > 0.f) {
       // 'decoded' can't be modified as long as 'decoder' is used, so
       // 'decoded_unoriented' is compared instead.
-      if (config.decoding_orientation == Orientation::kOriginal) {
+      if (encoder_config.decoding_orientation == Orientation::kOriginal) {
         if (decoded_unoriented.SetView(decoded) != WP2_STATUS_OK) {
           abort();
         }
       } else if (OrientateBuffer(
-                     GetInverseOrientation(config.decoding_orientation),
+                     GetInverseOrientation(encoder_config.decoding_orientation),
                      decoded, &decoded_unoriented) != WP2_STATUS_OK) {
         abort();
       }
diff --git a/tests/fuzz/fuzztest_anim_and_enc_config.cc b/tests/fuzz/fuzztest_anim_and_enc_config.cc
index a8b14d1..c0cbd1e 100644
--- a/tests/fuzz/fuzztest_anim_and_enc_config.cc
+++ b/tests/fuzz/fuzztest_anim_and_enc_config.cc
@@ -83,26 +83,11 @@
 
   original_frames.reserve(num_frames);
   for (size_t i = 0; i < num_frames; ++i) {
-    if (config.quality == 100 &&
-        !WP2IsPremultiplied(frames_and_durations.format)) {
-      // TODO: b/329621116 - Support exact non-alpha-premultiplied samples in
-      //                     AnimationEncoder::AddFrame().
-      ArgbBuffer original_frame(frames_and_durations.format);
-      ASSERT_EQ(original_frame.SetExternal(frames_and_durations.width,
-                                           frames_and_durations.height, samples,
-                                           stride),
-                WP2_STATUS_OK);
-      original_frames.emplace_back(
-          GetPremulFormat(frames_and_durations.format));
-      ASSERT_EQ(original_frames.back().ConvertFrom(original_frame),
-                WP2_STATUS_OK);
-    } else {
-      original_frames.emplace_back(frames_and_durations.format);
-      ASSERT_EQ(original_frames.back().SetExternal(frames_and_durations.width,
-                                                   frames_and_durations.height,
-                                                   samples, stride),
-                WP2_STATUS_OK);
-    }
+    original_frames.emplace_back(frames_and_durations.format);
+    ASSERT_EQ(original_frames.back().SetExternal(frames_and_durations.width,
+                                                 frames_and_durations.height,
+                                                 samples, stride),
+              WP2_STATUS_OK);
     samples += stride * frames_and_durations.height;
   }