diff options
| author | Carl Hetherington <cth@carlh.net> | 2019-11-04 16:38:14 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2019-11-16 22:46:39 +0100 |
| commit | ed4fc06db6957b2b63b2400a737f47c18a1003be (patch) | |
| tree | e429ffc3df79e141dacb870ffe9d232e8b72efd4 /test | |
| parent | 81e40e7b915a55f8e5aa2db34ad809552b1534e3 (diff) | |
Fix incorrect images when cropping without stretch.
Always overallocate images so that Image::crop_scale_window is always
safe from over-reading buffers. Relates to #1654 and probably #1653.
Backported from 7b0372776ac4da6a8e4ff29f41a4f08b9b4de506 in v2.15.x.
Diffstat (limited to 'test')
| -rw-r--r-- | test/image_test.cc | 35 | ||||
| -rw-r--r-- | test/test.cc | 6 | ||||
| -rw-r--r-- | test/test.h | 5 |
3 files changed, 39 insertions, 7 deletions
diff --git a/test/image_test.cc b/test/image_test.cc index 8b809c591..8579785a7 100644 --- a/test/image_test.cc +++ b/test/image_test.cc @@ -270,12 +270,43 @@ BOOST_AUTO_TEST_CASE (crop_scale_window_test) /** Special cases of Image::crop_scale_window which triggered some valgrind warnings */ BOOST_AUTO_TEST_CASE (crop_scale_window_test2) { - /* This 2048 does the same as J2KImageProxy does when it makes an image */ - shared_ptr<Image> image (new Image(AV_PIX_FMT_XYZ12LE, dcp::Size(2048, 858), true, 2048)); + shared_ptr<Image> image (new Image(AV_PIX_FMT_XYZ12LE, dcp::Size(2048, 858), true)); image->crop_scale_window (Crop(279, 0, 0, 0), dcp::Size(1069, 448), dcp::Size(1069, 578), dcp::YUV_TO_RGB_REC709, AV_PIX_FMT_RGB24, false, false); image->crop_scale_window (Crop(2048, 0, 0, 0), dcp::Size(1069, 448), dcp::Size(1069, 578), dcp::YUV_TO_RGB_REC709, AV_PIX_FMT_RGB24, false, false); } +BOOST_AUTO_TEST_CASE (crop_scale_window_test3) +{ + shared_ptr<FFmpegImageProxy> proxy(new FFmpegImageProxy("test/data/player_seek_test_0.png")); + shared_ptr<Image> xyz = proxy->image().first->convert_pixel_format(dcp::YUV_TO_RGB_REC709, AV_PIX_FMT_RGB24, true, false); + shared_ptr<Image> cropped = xyz->crop_scale_window(Crop(512, 0, 0, 0), dcp::Size(1486, 1080), dcp::Size(1998, 1080), dcp::YUV_TO_RGB_REC709, AV_PIX_FMT_RGB24, false, false); + write_image(cropped, "build/test/crop_scale_window_test3.png", "RGB", MagickCore::CharPixel); +} + +BOOST_AUTO_TEST_CASE (crop_scale_window_test4) +{ + shared_ptr<FFmpegImageProxy> proxy(new FFmpegImageProxy("test/data/player_seek_test_0.png")); + shared_ptr<Image> xyz = proxy->image().first->convert_pixel_format(dcp::YUV_TO_RGB_REC709, AV_PIX_FMT_RGB24, true, false); + shared_ptr<Image> cropped = xyz->crop_scale_window(Crop(512, 0, 0, 0), dcp::Size(1486, 1080), dcp::Size(1998, 1080), dcp::YUV_TO_RGB_REC709, AV_PIX_FMT_XYZ12LE, false, false); + write_image(cropped, "build/test/crop_scale_window_test4.png", "RGB", MagickCore::ShortPixel); +} + +BOOST_AUTO_TEST_CASE (crop_scale_window_test5) +{ + shared_ptr<FFmpegImageProxy> proxy(new FFmpegImageProxy("test/data/player_seek_test_0.png")); + shared_ptr<Image> xyz = proxy->image().first->convert_pixel_format(dcp::YUV_TO_RGB_REC709, AV_PIX_FMT_XYZ12LE, true, false); + shared_ptr<Image> cropped = xyz->crop_scale_window(Crop(512, 0, 0, 0), dcp::Size(1486, 1080), dcp::Size(1998, 1080), dcp::YUV_TO_RGB_REC709, AV_PIX_FMT_RGB24, false, false); + write_image(cropped, "build/test/crop_scale_window_test5.png", "RGB", MagickCore::CharPixel); +} + +BOOST_AUTO_TEST_CASE (crop_scale_window_test6) +{ + shared_ptr<FFmpegImageProxy> proxy(new FFmpegImageProxy("test/data/player_seek_test_0.png")); + shared_ptr<Image> xyz = proxy->image().first->convert_pixel_format(dcp::YUV_TO_RGB_REC709, AV_PIX_FMT_XYZ12LE, true, false); + shared_ptr<Image> cropped = xyz->crop_scale_window(Crop(512, 0, 0, 0), dcp::Size(1486, 1080), dcp::Size(1998, 1080), dcp::YUV_TO_RGB_REC709, AV_PIX_FMT_XYZ12LE, false, false); + write_image(cropped, "build/test/crop_scale_window_test6.png", "RGB", MagickCore::ShortPixel); +} + BOOST_AUTO_TEST_CASE (as_png_test) { shared_ptr<FFmpegImageProxy> proxy(new FFmpegImageProxy("test/data/3d_test/000001.png")); diff --git a/test/test.cc b/test/test.cc index 50770a687..a9d3ed1c7 100644 --- a/test/test.cc +++ b/test/test.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net> + Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net> This file is part of DCP-o-matic. @@ -417,11 +417,11 @@ wait_for_jobs () } void -write_image (shared_ptr<const Image> image, boost::filesystem::path file, string format) +write_image (shared_ptr<const Image> image, boost::filesystem::path file, string format, MagickCore::StorageType pixel_type) { using namespace MagickCore; - Magick::Image m (image->size().width, image->size().height, format.c_str(), CharPixel, (void *) image->data()[0]); + Magick::Image m (image->size().width, image->size().height, format.c_str(), pixel_type, (void *) image->data()[0]); m.write (file.string ()); } diff --git a/test/test.h b/test/test.h index 86b13cde5..3a11effa1 100644 --- a/test/test.h +++ b/test/test.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2018 Carl Hetherington <cth@carlh.net> + Copyright (C) 2013-2019 Carl Hetherington <cth@carlh.net> This file is part of DCP-o-matic. @@ -18,6 +18,7 @@ */ +#include <Magick++.h> #include <boost/filesystem.hpp> class Film; @@ -38,7 +39,7 @@ extern void check_file (boost::filesystem::path, boost::filesystem::path); extern void check_ffmpeg (boost::filesystem::path, boost::filesystem::path, int audio_tolerance); extern void check_image (boost::filesystem::path, boost::filesystem::path, double threshold = 0.01); extern boost::filesystem::path test_film_dir (std::string); -extern void write_image (boost::shared_ptr<const Image> image, boost::filesystem::path file, std::string format); +extern void write_image (boost::shared_ptr<const Image> image, boost::filesystem::path file, std::string format, MagickCore::StorageType pixel_type = MagickCore::CharPixel); boost::filesystem::path dcp_file (boost::shared_ptr<const Film> film, std::string prefix); void check_one_frame (boost::filesystem::path dcp, int64_t index, boost::filesystem::path ref); extern boost::filesystem::path subtitle_file (boost::shared_ptr<Film> film); |
