Reject avifRGBImage dimensions mismatch (#3394)
Make the implementation match the documentation.
Add tests.
---------
Co-authored-by: krishna28238-arch <krishna28238-arch@users.noreply.github.com>
Co-authored-by: Yannis Guyon <yguyon@google.com>
diff --git a/src/reformat.c b/src/reformat.c
index d1a511b..8ac4945 100644
--- a/src/reformat.c
+++ b/src/reformat.c
@@ -160,6 +160,10 @@
static avifBool avifPrepareReformatState(const avifImage * image, const avifRGBImage * rgb, avifReformatState * state)
{
+ if (rgb->width != image->width || rgb->height != image->height) {
+ return AVIF_FALSE;
+ }
+
const avifBool useYCgCoRe = (image->matrixCoefficients == AVIF_MATRIX_COEFFICIENTS_YCGCO_RE);
const avifBool useYCgCoRo = (image->matrixCoefficients == AVIF_MATRIX_COEFFICIENTS_YCGCO_RO);
if (useYCgCoRe || useYCgCoRo) {
diff --git a/tests/gtest/avifrgbtoyuvtest.cc b/tests/gtest/avifrgbtoyuvtest.cc
index 54dc993..99301c9 100644
--- a/tests/gtest/avifrgbtoyuvtest.cc
+++ b/tests/gtest/avifrgbtoyuvtest.cc
@@ -520,6 +520,35 @@
avifRGBImageFreePixels(&rgb);
}
+TEST(YUVToRGBTest, DimensionMismatchIsRejected) {
+ ImagePtr image =
+ testutil::CreateImage(/*width=*/4, /*height=*/4, /*depth=*/8,
+ AVIF_PIXEL_FORMAT_YUV444, AVIF_PLANES_ALL);
+ ASSERT_NE(image, nullptr);
+ testutil::FillImageGradient(image.get());
+
+ testutil::AvifRgbImage rgb(image.get(), /*rgbDepth=*/8, AVIF_RGB_FORMAT_RGBA);
+ rgb.width = image->width - 1;
+ ASSERT_EQ(avifRGBImageAllocatePixels(&rgb), AVIF_RESULT_OK);
+ EXPECT_EQ(avifImageYUVToRGB(image.get(), &rgb), AVIF_RESULT_REFORMAT_FAILED);
+}
+
+TEST(RGBToYUVTest, DimensionMismatchIsRejected) {
+ ImagePtr image =
+ testutil::CreateImage(/*width=*/4, /*height=*/4, /*depth=*/8,
+ AVIF_PIXEL_FORMAT_YUV444, AVIF_PLANES_ALL);
+ ASSERT_NE(image, nullptr);
+
+ testutil::AvifRgbImage rgb(image.get(), /*rgbDepth=*/8, AVIF_RGB_FORMAT_RGBA);
+ rgb.height = image->height + 1;
+ ASSERT_EQ(avifRGBImageAllocatePixels(&rgb), AVIF_RESULT_OK);
+ for (uint32_t channel_offset : {0, 1, 2, 3}) {
+ testutil::FillImageChannel(&rgb, channel_offset, 123);
+ }
+
+ EXPECT_EQ(avifImageRGBToYUV(image.get(), &rgb), AVIF_RESULT_REFORMAT_FAILED);
+}
+
//------------------------------------------------------------------------------
// Selected configurations