blob: e4b5a96d83a7698294f1231421c8f6951b8062f1 [file] [log] [blame]
// Copyright 2023 Google LLC
// SPDX-License-Identifier: BSD-2-Clause
#include <iostream>
#include <string>
#include "avif/avif.h"
#include "aviftest_helpers.h"
#include "gtest/gtest.h"
namespace avif {
namespace {
// Used to pass the data folder path to the GoogleTest suites.
const char* data_path = nullptr;
TEST(AvifDecodeTest, ColorGridAlphaNoGrid) {
if (!testutil::Av1DecoderAvailable()) {
GTEST_SKIP() << "AV1 Codec unavailable, skip test.";
}
// Test case from https://github.com/AOMediaCodec/libavif/issues/1203.
const char* file_name = "color_grid_alpha_nogrid.avif";
DecoderPtr decoder(avifDecoderCreate());
ASSERT_NE(decoder, nullptr);
ASSERT_EQ(avifDecoderSetIOFile(decoder.get(),
(std::string(data_path) + file_name).c_str()),
AVIF_RESULT_OK);
ASSERT_EQ(avifDecoderParse(decoder.get()), AVIF_RESULT_OK);
EXPECT_EQ(decoder->alphaPresent, AVIF_TRUE);
EXPECT_EQ(decoder->imageSequenceTrackPresent, AVIF_FALSE);
EXPECT_EQ(avifDecoderNextImage(decoder.get()), AVIF_RESULT_OK);
EXPECT_NE(decoder->image->alphaPlane, nullptr);
EXPECT_GT(decoder->image->alphaRowBytes, 0u);
}
TEST(AvifDecodeTest, ParseEmptyData) {
DecoderPtr decoder(avifDecoderCreate());
ASSERT_NE(decoder, nullptr);
ASSERT_EQ(avifDecoderSetIOMemory(decoder.get(), nullptr, 0), AVIF_RESULT_OK);
// No ftyp box was seen.
ASSERT_EQ(avifDecoderParse(decoder.get()), AVIF_RESULT_INVALID_FTYP);
}
TEST(AvifDecodeTest, Idat) {
if (!testutil::Av1DecoderAvailable()) {
GTEST_SKIP() << "AV1 Codec unavailable, skip test.";
}
const ImagePtr original = testutil::ReadImage(data_path, "draw_points.png");
for (const std::string file_name :
{"draw_points_idat.avif", "draw_points_idat_metasize0.avif",
"draw_points_idat_progressive.avif",
"draw_points_idat_progressive_metasize0.avif"}) {
SCOPED_TRACE(file_name);
DecoderPtr decoder(avifDecoderCreate());
ASSERT_NE(decoder, nullptr);
ASSERT_EQ(avifDecoderSetIOFile(
decoder.get(), (std::string(data_path) + file_name).c_str()),
AVIF_RESULT_OK);
ASSERT_EQ(avifDecoderParse(decoder.get()), AVIF_RESULT_OK);
EXPECT_EQ(decoder->alphaPresent, AVIF_TRUE);
EXPECT_EQ(decoder->imageSequenceTrackPresent, AVIF_FALSE);
ASSERT_EQ(avifDecoderNextImage(decoder.get()), AVIF_RESULT_OK);
EXPECT_NE(decoder->image->alphaPlane, nullptr);
EXPECT_GT(decoder->image->alphaRowBytes, 0u);
EXPECT_EQ(testutil::GetPsnr(*original, *decoder->image), 99.0);
}
}
// From https://crbug.com/334281983.
TEST(AvifDecodeTest, PeekCompatibleFileTypeBad1) {
constexpr uint8_t kData[] = {0x00, 0x00, 0x00, 0x1c, 0x66,
0x74, 0x79, 0x70, 0x84, 0xca};
avifROData input = {kData, sizeof(kData)};
EXPECT_FALSE(avifPeekCompatibleFileType(&input));
}
// From https://crbug.com/334682511.
TEST(AvifDecodeTest, PeekCompatibleFileTypeBad2) {
constexpr uint8_t kData[] = {0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79,
0x70, 0x61, 0x73, 0x31, 0x6d, 0x00, 0x00,
0x08, 0x00, 0xd7, 0x89, 0xdb, 0x7f};
avifROData input = {kData, sizeof(kData)};
EXPECT_FALSE(avifPeekCompatibleFileType(&input));
}
} // namespace
} // namespace avif
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
if (argc != 2) {
std::cerr << "There must be exactly one argument containing the path to "
"the test data folder"
<< std::endl;
return 1;
}
avif::data_path = argv[1];
return RUN_ALL_TESTS();
}