diff options
| author | Carl Hetherington <cth@carlh.net> | 2025-01-07 00:41:03 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2025-03-08 21:52:48 +0100 |
| commit | 636bca85fffa7e639954438d1053081c680967b3 (patch) | |
| tree | e8169b9d982aaac209b1ca7a1869220bce8a5539 | |
| parent | 6779cb55bfa4290412272cd744d06eb8a34e079e (diff) | |
fixup! WIP: test for passing a sRGB input through a DCP and back out again.
| -rw-r--r-- | test/image_end_to_end_test.cc | 78 |
1 files changed, 70 insertions, 8 deletions
diff --git a/test/image_end_to_end_test.cc b/test/image_end_to_end_test.cc index 7481c509c..14674baad 100644 --- a/test/image_end_to_end_test.cc +++ b/test/image_end_to_end_test.cc @@ -26,6 +26,7 @@ #include "lib/image_png.h" #include "lib/player.h" #include "lib/player_video.h" +#include "lib/video_content.h" #include <dcp/openjpeg_image.h> #include <dcp/j2k_transcode.h> #include <dcp/rgb_xyz.h> @@ -68,9 +69,7 @@ BOOST_AUTO_TEST_CASE(monochrome_test) auto film = new_test_film("monochrome_test", content); make_and_verify_dcp(film); - auto dcp = std::make_shared<DCPContent>(film->dir(film->dcp_name())); - auto film2 = new_test_film("monochrome_test_reload", { dcp }); - auto player = std::make_shared<Player>(film2, Image::Alignment::PADDED); + auto player = std::make_shared<Player>(film, Image::Alignment::PADDED); std::shared_ptr<PlayerVideo> video; player->Video.connect([&](std::shared_ptr<PlayerVideo> v, dcpomatic::DCPTime) { @@ -81,10 +80,40 @@ BOOST_AUTO_TEST_CASE(monochrome_test) BOOST_REQUIRE(!player->pass()); } - auto image = video->image(boost::bind(PlayerVideo::force, AV_PIX_FMT_RGB24), VideoRange::FULL, false); + auto pre_image = video->image(boost::bind(PlayerVideo::force, AV_PIX_FMT_RGB24), VideoRange::FULL, false); + + std::cout << "CC " << content[0]->video->colour_conversion()->preset().get() << "\n"; + + auto dcp = std::make_shared<DCPContent>(film->dir(film->dcp_name())); + auto film2 = new_test_film("monochrome_test_reload", { dcp }); + auto player2 = std::make_shared<Player>(film2, Image::Alignment::PADDED); + + std::shared_ptr<PlayerVideo> video2; + player2->Video.connect([&](std::shared_ptr<PlayerVideo> v, dcpomatic::DCPTime) { + video2 = v; + }); + + while (!video2) { + BOOST_REQUIRE(!player2->pass()); + } + + auto image = video2->image(boost::bind(PlayerVideo::force, AV_PIX_FMT_RGB24), VideoRange::FULL, false); + + auto j2k = dcp::decompress_j2k(*video2->j2k(), 0); + + int max[3] = { 0, 0, 0 }; + for (int y = 0; y < j2k->size().height; ++y) { + for (int x = 0; x < j2k->size().width; ++x) { + for (int c = 0; c < 3; ++c) { + max[c] = std::max(max[c], j2k->data(c)[y * j2k->size().width + x]); + } + } + } + + std::cout << "J2K max " << max[0] << " " << max[1] << " " << max[2] << "\n"; - auto j2k = dcp::decompress_j2k(*video->j2k(), 0); auto rgb_image_16 = std::make_shared<Image>(AV_PIX_FMT_RGB48LE, j2k->size(), Image::Alignment::COMPACT); + dcp::xyz_to_rgb(j2k, dcp::ColourConversion::srgb_to_xyz(), rgb_image_16->data()[0], j2k->size().width * 6); auto rgb_image = std::make_shared<Image>(AV_PIX_FMT_RGB24, j2k->size(), Image::Alignment::COMPACT); @@ -98,11 +127,44 @@ BOOST_AUTO_TEST_CASE(monochrome_test) } } - image_as_png(image).write("build/test/monochrome_test1.png"); - image_as_png(rgb_image).write("build/test/monochrome_test2.png"); + image_as_png(image).write("build/test/monochrome_test_1.png"); + image_as_png(rgb_image).write("build/test/monochrome_test_2.png"); - std::cout << "start " << max_rgb_difference(image_from_jpeg(source)) << "\n"; + std::cout << "start " << max_rgb_difference(image_from_jpeg(source, Image::Alignment::COMPACT)) << "\n"; + std::cout << "pre " << max_rgb_difference(pre_image) << "\n"; std::cout << "end " << max_rgb_difference(image) << "\n"; std::cout << "dcp " << max_rgb_difference(rgb_image) << "\n"; } + +BOOST_AUTO_TEST_CASE(monochrome_test2) +{ + auto source = TestPaths::private_data() / "mahler_mix_photos_2024_04_002174.jpg"; + + auto A = image_from_jpeg(source, Image::Alignment::PADDED); + auto B = A->convert_pixel_format(dcp::YUVToRGB::REC709, AV_PIX_FMT_RGB48LE, Image::Alignment::PADDED, false); + auto C = dcp::rgb_to_xyz(B->data()[0], B->size(), B->stride()[0], dcp::ColourConversion::srgb_to_xyz()); + + // auto comp = dcp::compress_j2k(C, 250000000, 24, false, false); + // auto dec = dcp::decompress_j2k(comp, 0); + + auto D = std::make_shared<Image>(AV_PIX_FMT_RGB48LE, C->size(), Image::Alignment::COMPACT); + dcp::xyz_to_rgb(C, dcp::ColourConversion::srgb_to_xyz(), D->data()[0], A->size().width * 6); + // dcp::xyz_to_rgb(dec, dcp::ColourConversion::srgb_to_xyz(), D->data()[0], A->size().width * 6); + + auto E = std::make_shared<Image>(AV_PIX_FMT_RGB24, A->size(), Image::Alignment::COMPACT); + for (int y = 0; y < A->size().height; ++y) { + uint16_t* from = reinterpret_cast<uint16_t*>(D->data()[0] + y * D->stride()[0]); + uint8_t* to = E->data()[0] + y * E->stride()[0]; + for (int x = 0; x < A->size().width; ++x) { + *to++ = *from++ >> 8; + *to++ = *from++ >> 8; + *to++ = *from++ >> 8; + } + } + + std::cout << "start " << max_rgb_difference(image_from_jpeg(source, Image::Alignment::PADDED)) << "\n"; + std::cout << "end " << max_rgb_difference(E) << "\n"; + +} + |
