X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Fvideo_level_test.cc;h=fd221468499728646f6cafc6d4ebf8f2e0bc536e;hb=59209af1e2d73334ff7dfe6c7da465293dc24c0b;hp=c974c938d3002f71a4fc86b9f1518ab8597bbd9b;hpb=71f3520ea315fb65ff151c99aa0b64fc8dccdb1d;p=dcpomatic.git diff --git a/test/video_level_test.cc b/test/video_level_test.cc index c974c938d..fd2214684 100644 --- a/test/video_level_test.cc +++ b/test/video_level_test.cc @@ -38,6 +38,8 @@ #include "lib/image_decoder.h" #include "lib/ffmpeg_encoder.h" #include "lib/job_manager.h" +#include "lib/player.h" +#include "lib/player_video.h" #include "lib/transcode_job.h" #include "lib/video_decoder.h" #include "test.h" @@ -52,7 +54,6 @@ using std::min; -using std::make_pair; using std::max; using std::pair; using std::string; @@ -69,7 +70,7 @@ static shared_ptr grey_image (dcp::Size size, uint8_t pixel) { - auto grey = make_shared(AV_PIX_FMT_RGB24, size, true); + auto grey = make_shared(AV_PIX_FMT_RGB24, size, Image::Alignment::PADDED); for (int y = 0; y < size.height; ++y) { uint8_t* p = grey->data()[0] + y * grey->stride()[0]; for (int x = 0; x < size.width; ++x) { @@ -91,8 +92,8 @@ BOOST_AUTO_TEST_CASE (ffmpeg_image_full_range_not_changed) write_image (grey_image(size, grey_pixel), file); - FFmpegImageProxy proxy (file, VideoRange::FULL); - ImageProxy::Result result = proxy.image (); + FFmpegImageProxy proxy (file); + ImageProxy::Result result = proxy.image (Image::Alignment::COMPACT); BOOST_REQUIRE (!result.error); for (int y = 0; y < size.height; ++y) { @@ -106,19 +107,30 @@ BOOST_AUTO_TEST_CASE (ffmpeg_image_full_range_not_changed) BOOST_AUTO_TEST_CASE (ffmpeg_image_video_range_expanded) { - dcp::Size size(640, 480); + dcp::Size size(1998, 1080); uint8_t const grey_pixel = 128; - uint8_t const expanded_grey_pixel = static_cast((grey_pixel - 16) * 256.0 / 219); + uint8_t const expanded_grey_pixel = static_cast(lrintf((grey_pixel - 16) * 256.0 / 219)); boost::filesystem::path const file = "build/test/ffmpeg_image_video_range_expanded.png"; - write_image (grey_image(size, grey_pixel), file); + write_image(grey_image(size, grey_pixel), file); - FFmpegImageProxy proxy (file, VideoRange::VIDEO); - ImageProxy::Result result = proxy.image (); - BOOST_REQUIRE (!result.error); + auto content = content_factory(file).front(); + auto film = new_test_film2 ("ffmpeg_image_video_range_expanded", { content }); + content->video->set_range (VideoRange::VIDEO); + auto player = make_shared(film, film->playlist()); + + shared_ptr player_video; + player->Video.connect([&player_video](shared_ptr pv, dcpomatic::DCPTime) { + player_video = pv; + }); + while (!player_video) { + BOOST_REQUIRE (!player->pass()); + } + + auto image = player_video->image ([](AVPixelFormat f) { return f; }, VideoRange::FULL, false); for (int y = 0; y < size.height; ++y) { - uint8_t* p = result.image->data()[0] + y * result.image->stride()[0]; + uint8_t* p = image->data()[0] + y * image->stride()[0]; for (int x = 0; x < size.width; ++x) { BOOST_REQUIRE_EQUAL (*p++, expanded_grey_pixel); } @@ -185,6 +197,9 @@ pixel_range (shared_ptr image) } +/** @return pixel range of the first frame in @ref content in its raw form, i.e. + * straight out of the decoder with no level processing, scaling etc. + */ static pair pixel_range (shared_ptr film, shared_ptr content) @@ -198,7 +213,7 @@ pixel_range (shared_ptr film, shared_ptr content) BOOST_REQUIRE (!decoder->pass()); } - return pixel_range (content_video->image->image().image); + return pixel_range (content_video->image->image(Image::Alignment::COMPACT).image); } @@ -391,9 +406,9 @@ static pair V_movie_range (shared_ptr film) { - auto job = make_shared(film); + auto job = make_shared(film, TranscodeJob::ChangedBehaviour::IGNORE); job->set_encoder ( - make_shared(film, job, film->file("export.mov"), ExportFormat::PRORES, true, false, false, 23) + make_shared(film, job, film->file("export.mov"), ExportFormat::PRORES_HQ, true, false, false, 23) ); JobManager::instance()->add (job); BOOST_REQUIRE (!wait_for_jobs()); @@ -504,8 +519,8 @@ BOOST_AUTO_TEST_CASE (image_F_to_V_movie) BOOST_AUTO_TEST_CASE (image_FoV_to_V_movie) { auto range = V_movie_range (image_FoV("image_FoV_to_V_movie")); - BOOST_CHECK_EQUAL (range.first, 102); - BOOST_CHECK_EQUAL (range.second, 923); + BOOST_CHECK_EQUAL (range.first, 64); + BOOST_CHECK_EQUAL (range.second, 960); }