X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Fimage_test.cc;h=56e6819436886b187f39861f2207ea198994bda0;hb=4f81cdeb7802d2087244590a801ecc1a64eff0aa;hp=7369bd24feac9ec03e4a21d2fb86aaa8bef7389d;hpb=81b9ea804cb9953bb1a4074f208f63374adbf09b;p=dcpomatic.git diff --git a/test/image_test.cc b/test/image_test.cc index 7369bd24f..56e681943 100644 --- a/test/image_test.cc +++ b/test/image_test.cc @@ -30,6 +30,8 @@ #include "lib/image.h" #include "lib/image_content.h" #include "lib/image_decoder.h" +#include "lib/image_jpeg.h" +#include "lib/image_png.h" #include "lib/ffmpeg_image_proxy.h" #include "test.h" #include @@ -199,6 +201,43 @@ BOOST_AUTO_TEST_CASE (alpha_blend_test) } +/** Test Image::alpha_blend when the "base" image is XYZ12LE */ +BOOST_AUTO_TEST_CASE (alpha_blend_test_onto_xyz) +{ + Image xyz(AV_PIX_FMT_XYZ12LE, dcp::Size(50, 50), Image::Alignment::PADDED); + xyz.make_black(); + + auto overlay = make_shared(AV_PIX_FMT_RGBA, dcp::Size(8, 8), Image::Alignment::PADDED); + for (int y = 0; y < 8; ++y) { + uint8_t* p = overlay->data()[0] + (y * overlay->stride()[0]); + for (int x = 0; x < 8; ++x) { + *p++ = 255; + *p++ = 0; + *p++ = 0; + *p++ = 255; + } + } + + xyz.alpha_blend(overlay, Position(4, 4)); + + for (int y = 0; y < 50; ++y) { + uint16_t* p = reinterpret_cast(xyz.data()[0]) + (y * xyz.stride()[0] / 2); + for (int x = 0; x < 50; ++x) { + if (4 <= x && x < 12 && 4 <= y && y < 12) { + BOOST_REQUIRE_EQUAL(p[0], 45078U); + BOOST_REQUIRE_EQUAL(p[1], 34939U); + BOOST_REQUIRE_EQUAL(p[2], 13892U); + } else { + BOOST_REQUIRE_EQUAL(p[0], 0U); + BOOST_REQUIRE_EQUAL(p[1], 0U); + BOOST_REQUIRE_EQUAL(p[2], 0U); + } + p += 3; + } + } +} + + /** Test merge (list) with a single image */ BOOST_AUTO_TEST_CASE (merge_test1) { @@ -316,7 +355,7 @@ BOOST_AUTO_TEST_CASE (crop_scale_window_test4) Crop(512, 0, 0, 0), dcp::Size(1486, 1080), dcp::Size(1998, 1080), dcp::YUVToRGB::REC709, VideoRange::FULL, AV_PIX_FMT_XYZ12LE, VideoRange::FULL, Image::Alignment::COMPACT, false ); write_image(cropped, "build/test/crop_scale_window_test4.png"); - check_image("test/data/crop_scale_window_test4.png", "build/test/crop_scale_window_test4.png", 35000); + check_image("test/data/crop_scale_window_test4.png", "build/test/crop_scale_window_test4.png"); } @@ -340,7 +379,7 @@ BOOST_AUTO_TEST_CASE (crop_scale_window_test6) Crop(512, 0, 0, 0), dcp::Size(1486, 1080), dcp::Size(1998, 1080), dcp::YUVToRGB::REC709, VideoRange::FULL, AV_PIX_FMT_XYZ12LE, VideoRange::FULL, Image::Alignment::COMPACT, false ); write_image(cropped, "build/test/crop_scale_window_test6.png"); - check_image("test/data/crop_scale_window_test6.png", "build/test/crop_scale_window_test6.png", 35000); + check_image("test/data/crop_scale_window_test6.png", "build/test/crop_scale_window_test6.png"); } @@ -370,19 +409,49 @@ BOOST_AUTO_TEST_CASE (crop_scale_window_test7) } +BOOST_AUTO_TEST_CASE (crop_scale_window_test8) +{ + using namespace boost::filesystem; + + auto image = make_shared(AV_PIX_FMT_YUV420P, dcp::Size(800, 600), Image::Alignment::PADDED); + memset(image->data()[0], 41, image->stride()[0] * 600); + memset(image->data()[1], 240, image->stride()[1] * 300); + memset(image->data()[2], 41, image->stride()[2] * 300); + auto scaled = image->crop_scale_window( + Crop(), dcp::Size(1435, 1080), dcp::Size(1998, 1080), dcp::YUVToRGB::REC709, VideoRange::FULL, AV_PIX_FMT_YUV420P, VideoRange::FULL, Image::Alignment::PADDED, false + ); + auto file = "crop_scale_window_test8.png"; + write_image(scaled->convert_pixel_format(dcp::YUVToRGB::REC709, AV_PIX_FMT_RGB24, Image::Alignment::COMPACT, false), path("build") / "test" / file); + check_image(path("test") / "data" / file, path("build") / "test" / file, 10); +} + + BOOST_AUTO_TEST_CASE (as_png_test) { auto proxy = make_shared("test/data/3d_test/000001.png"); auto image_rgb = proxy->image(Image::Alignment::PADDED).image; auto image_bgr = image_rgb->convert_pixel_format(dcp::YUVToRGB::REC709, AV_PIX_FMT_BGRA, Image::Alignment::PADDED, false); - image_rgb->as_png().write ("build/test/as_png_rgb.png"); - image_bgr->as_png().write ("build/test/as_png_bgr.png"); + image_as_png(image_rgb).write ("build/test/as_png_rgb.png"); + image_as_png(image_bgr).write ("build/test/as_png_bgr.png"); check_image ("test/data/3d_test/000001.png", "build/test/as_png_rgb.png"); check_image ("test/data/3d_test/000001.png", "build/test/as_png_bgr.png"); } +BOOST_AUTO_TEST_CASE (as_jpeg_test) +{ + auto proxy = make_shared("test/data/3d_test/000001.png"); + auto image_rgb = proxy->image(Image::Alignment::PADDED).image; + auto image_bgr = image_rgb->convert_pixel_format(dcp::YUVToRGB::REC709, AV_PIX_FMT_BGRA, Image::Alignment::PADDED, false); + image_as_jpeg(image_rgb, 60).write("build/test/as_jpeg_rgb.jpeg"); + image_as_jpeg(image_bgr, 60).write("build/test/as_jpeg_bgr.jpeg"); + + check_image ("test/data/as_jpeg_rgb.jpeg", "build/test/as_jpeg_rgb.jpeg"); + check_image ("test/data/as_jpeg_bgr.jpeg", "build/test/as_jpeg_bgr.jpeg"); +} + + /* Very dumb test to fade black to make sure it stays black */ static void fade_test_format_black (AVPixelFormat f, string name) @@ -391,7 +460,7 @@ fade_test_format_black (AVPixelFormat f, string name) yuv.make_black (); yuv.fade (0); string const filename = "fade_test_black_" + name + ".png"; - yuv.convert_pixel_format(dcp::YUVToRGB::REC709, AV_PIX_FMT_RGBA, Image::Alignment::PADDED, false)->as_png().write("build/test/" + filename); + image_as_png(yuv.convert_pixel_format(dcp::YUVToRGB::REC709, AV_PIX_FMT_RGBA, Image::Alignment::PADDED, false)).write("build/test/" + filename); check_image ("test/data/" + filename, "build/test/" + filename); } @@ -404,7 +473,7 @@ fade_test_format_red (AVPixelFormat f, float amount, string name) auto red = proxy->image(Image::Alignment::PADDED).image->convert_pixel_format(dcp::YUVToRGB::REC709, f, Image::Alignment::PADDED, false); red->fade (amount); string const filename = "fade_test_red_" + name + ".png"; - red->convert_pixel_format(dcp::YUVToRGB::REC709, AV_PIX_FMT_RGBA, Image::Alignment::PADDED, false)->as_png().write("build/test/" + filename); + image_as_png(red->convert_pixel_format(dcp::YUVToRGB::REC709, AV_PIX_FMT_RGBA, Image::Alignment::PADDED, false)).write("build/test/" + filename); check_image ("test/data/" + filename, "build/test/" + filename); } @@ -515,6 +584,7 @@ BOOST_AUTO_TEST_CASE (make_part_black_test) AV_PIX_FMT_BGRA, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P10LE, + AV_PIX_FMT_YUV444P10LE }; list> positions = {