summaryrefslogtreecommitdiff
path: root/test/video_level_test.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2021-05-25 00:57:16 +0200
committerCarl Hetherington <cth@carlh.net>2021-05-25 21:35:12 +0200
commit62f9b78a2eb5f0fc6b9028264bac6ad501d83309 (patch)
treea187c6385350318f7d96090d09712106ac08ed19 /test/video_level_test.cc
parent5d9ff746138a30c1469b788afe5a4eee25fed368 (diff)
Move video level conversion for RGB from FFmpegImageProxy to Image.
Since FFmpeg does not do video level conversion for RGB sources when we (sort of) ask it to in Image::crop_scale_window() it seems to make more sense to compensate for that by calling full_to_video_range() in the same place (rather than in FFmpegImageProxy).
Diffstat (limited to 'test/video_level_test.cc')
-rw-r--r--test/video_level_test.cc36
1 files changed, 26 insertions, 10 deletions
diff --git a/test/video_level_test.cc b/test/video_level_test.cc
index c974c938d..be54cd3f9 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"
@@ -91,7 +93,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_image_full_range_not_changed)
write_image (grey_image(size, grey_pixel), file);
- FFmpegImageProxy proxy (file, VideoRange::FULL);
+ FFmpegImageProxy proxy (file);
ImageProxy::Result result = proxy.image ();
BOOST_REQUIRE (!result.error);
@@ -106,19 +108,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<uint8_t>((grey_pixel - 16) * 256.0 / 219);
+ uint8_t const expanded_grey_pixel = static_cast<uint8_t>(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<Player>(film, film->playlist());
+
+ shared_ptr<PlayerVideo> player_video;
+ player->Video.connect([&player_video](shared_ptr<PlayerVideo> pv, dcpomatic::DCPTime) {
+ player_video = pv;
+ });
+ while (!player_video) {
+ BOOST_REQUIRE (!player->pass());
+ }
+
+ auto image = player_video->image ([](AVPixelFormat f) { return f; }, VideoRange::FULL, true, 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 +198,9 @@ pixel_range (shared_ptr<const Image> 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<int, int>
pixel_range (shared_ptr<const Film> film, shared_ptr<const Content> content)
@@ -504,8 +520,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);
}