X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Fvideo_level_test.cc;h=e2419d8e734c96f0ef92add497afb2062a0d5f75;hb=ef25237193100de106eccdb8f40524fa670bda76;hp=be54cd3f90075f18837f75c059919fbd38336eac;hpb=62f9b78a2eb5f0fc6b9028264bac6ad501d83309;p=dcpomatic.git diff --git a/test/video_level_test.cc b/test/video_level_test.cc index be54cd3f9..e2419d8e7 100644 --- a/test/video_level_test.cc +++ b/test/video_level_test.cc @@ -54,7 +54,6 @@ using std::min; -using std::make_pair; using std::max; using std::pair; using std::string; @@ -71,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) { @@ -94,7 +93,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_image_full_range_not_changed) write_image (grey_image(size, grey_pixel), file); FFmpegImageProxy proxy (file); - ImageProxy::Result result = proxy.image (); + ImageProxy::Result result = proxy.image (Image::Alignment::COMPACT); BOOST_REQUIRE (!result.error); for (int y = 0; y < size.height; ++y) { @@ -115,9 +114,9 @@ BOOST_AUTO_TEST_CASE (ffmpeg_image_video_range_expanded) write_image(grey_image(size, grey_pixel), file); - auto content = content_factory(file).front(); - auto film = new_test_film2 ("ffmpeg_image_video_range_expanded", { content }); - content->video->set_range (VideoRange::VIDEO); + auto content = content_factory(file); + auto film = new_test_film2 ("ffmpeg_image_video_range_expanded", content); + content[0]->video->set_range (VideoRange::VIDEO); auto player = make_shared(film, film->playlist()); shared_ptr player_video; @@ -128,7 +127,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_image_video_range_expanded) BOOST_REQUIRE (!player->pass()); } - auto image = player_video->image ([](AVPixelFormat f) { return f; }, VideoRange::FULL, true, false); + auto image = player_video->image ([](AVPixelFormat f) { return f; }, VideoRange::FULL, false); for (int y = 0; y < size.height; ++y) { uint8_t* p = image->data()[0] + y * image->stride()[0]; @@ -139,6 +138,57 @@ BOOST_AUTO_TEST_CASE (ffmpeg_image_video_range_expanded) } +BOOST_AUTO_TEST_CASE(yuv_expanded_into_full_rgb) +{ + auto convert = [](int y_val, int u_val, int v_val, AVPixelFormat pix_fmt) { + auto const size = dcp::Size(640, 480); + auto yuv = make_shared(AV_PIX_FMT_YUVA444P12LE, size, Image::Alignment::PADDED); + BOOST_REQUIRE_EQUAL(yuv->planes(), 4); + for (int y = 0; y < size.height; ++y) { + uint16_t* Y = reinterpret_cast(yuv->data()[0] + y * yuv->stride()[0]); + uint16_t* U = reinterpret_cast(yuv->data()[1] + y * yuv->stride()[1]); + uint16_t* V = reinterpret_cast(yuv->data()[2] + y * yuv->stride()[2]); + uint16_t* A = reinterpret_cast(yuv->data()[3] + y * yuv->stride()[3]); + for (int x = 0; x < size.width; ++x) { + *Y++ = y_val; + *U++ = u_val; + *V++ = v_val; + *A++ = 4096; + } + } + + return yuv->crop_scale_window( + Crop(), size, size, dcp::YUVToRGB::REC709, + VideoRange::VIDEO, + pix_fmt, + VideoRange::FULL, + Image::Alignment::COMPACT, + false + ); + }; + + auto white24 = convert(3760, 2048, 2048, AV_PIX_FMT_RGB24); + BOOST_CHECK_EQUAL(white24->data()[0][0], 255); + BOOST_CHECK_EQUAL(white24->data()[0][1], 255); + BOOST_CHECK_EQUAL(white24->data()[0][2], 255); + + auto black24 = convert(256, 2048, 2048, AV_PIX_FMT_RGB24); + BOOST_CHECK_EQUAL(black24->data()[0][0], 0); + BOOST_CHECK_EQUAL(black24->data()[0][1], 0); + BOOST_CHECK_EQUAL(black24->data()[0][2], 0); + + auto white48 = convert(3760, 2048, 2048, AV_PIX_FMT_RGB48LE); + BOOST_CHECK_EQUAL(reinterpret_cast(white48->data()[0])[0], 65283); + BOOST_CHECK_EQUAL(reinterpret_cast(white48->data()[0])[1], 65283); + BOOST_CHECK_EQUAL(reinterpret_cast(white48->data()[0])[2], 65283); + + auto black48 = convert(256, 2048, 2048, AV_PIX_FMT_RGB48LE); + BOOST_CHECK_EQUAL(reinterpret_cast(black48->data()[0])[0], 0); + BOOST_CHECK_EQUAL(reinterpret_cast(black48->data()[0])[1], 0); + BOOST_CHECK_EQUAL(reinterpret_cast(black48->data()[0])[2], 0); +} + + static pair pixel_range (shared_ptr image) @@ -214,7 +264,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); } @@ -261,7 +311,7 @@ shared_ptr movie_V (string name) { auto film = new_test_film2 (name); - auto content = dynamic_pointer_cast(content_factory("test/data/rgb_grey_testcard.mp4").front()); + auto content = dynamic_pointer_cast(content_factory("test/data/rgb_grey_testcard.mp4")[0]); BOOST_REQUIRE (content); film->examine_and_add_content (content); BOOST_REQUIRE (!wait_for_jobs()); @@ -279,7 +329,7 @@ shared_ptr movie_VoF (string name) { auto film = new_test_film2 (name); - auto content = dynamic_pointer_cast(content_factory("test/data/rgb_grey_testcard.mp4").front()); + auto content = dynamic_pointer_cast(content_factory("test/data/rgb_grey_testcard.mp4")[0]); BOOST_REQUIRE (content); film->examine_and_add_content (content); BOOST_REQUIRE (!wait_for_jobs()); @@ -298,7 +348,7 @@ shared_ptr movie_F (string name) { auto film = new_test_film2 (name); - auto content = dynamic_pointer_cast(content_factory("test/data/rgb_grey_testcard.mov").front()); + auto content = dynamic_pointer_cast(content_factory("test/data/rgb_grey_testcard.mov")[0]); BOOST_REQUIRE (content); film->examine_and_add_content (content); BOOST_REQUIRE (!wait_for_jobs()); @@ -316,7 +366,7 @@ shared_ptr movie_FoV (string name) { auto film = new_test_film2 (name); - auto content = dynamic_pointer_cast(content_factory("test/data/rgb_grey_testcard.mov").front()); + auto content = dynamic_pointer_cast(content_factory("test/data/rgb_grey_testcard.mov")[0]); BOOST_REQUIRE (content); film->examine_and_add_content (content); BOOST_REQUIRE (!wait_for_jobs()); @@ -335,7 +385,7 @@ shared_ptr image_F (string name) { auto film = new_test_film2 (name); - auto content = dynamic_pointer_cast(content_factory("test/data/rgb_grey_testcard.png").front()); + auto content = dynamic_pointer_cast(content_factory("test/data/rgb_grey_testcard.png")[0]); BOOST_REQUIRE (content); film->examine_and_add_content (content); BOOST_REQUIRE (!wait_for_jobs()); @@ -353,7 +403,7 @@ shared_ptr image_FoV (string name) { auto film = new_test_film2 (name); - auto content = dynamic_pointer_cast(content_factory("test/data/rgb_grey_testcard.png").front()); + auto content = dynamic_pointer_cast(content_factory("test/data/rgb_grey_testcard.png")[0]); BOOST_REQUIRE (content); film->examine_and_add_content (content); BOOST_REQUIRE (!wait_for_jobs()); @@ -407,9 +457,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());