summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2025-01-07 00:41:03 +0100
committerCarl Hetherington <cth@carlh.net>2025-03-08 21:52:48 +0100
commit636bca85fffa7e639954438d1053081c680967b3 (patch)
treee8169b9d982aaac209b1ca7a1869220bce8a5539
parent6779cb55bfa4290412272cd744d06eb8a34e079e (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.cc78
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";
+
+}
+