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;
}