X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Fmake_black_test.cc;h=ee99031099b525119e188915dcb72289d9d23b28;hb=refs%2Ftags%2Fv2.14.51;hp=f6c3a4bb2bbc87616ffc3cfbeb84a3ffacc07704;hpb=40b654453c2ce0b266f43c36f1b9a5d1705f983c;p=dcpomatic.git diff --git a/test/make_black_test.cc b/test/make_black_test.cc index f6c3a4bb2..ee9903109 100644 --- a/test/make_black_test.cc +++ b/test/make_black_test.cc @@ -1,26 +1,27 @@ /* Copyright (C) 2012 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ /** @file test/make_black_test.cc - * @brief Check that Image::make_black works, and doesn't use values which crash + * @brief Check that Image::make_black works and doesn't use values which crash * sws_scale(). - * + * @ingroup selfcontained * @see test/image_test.cc */ @@ -29,10 +30,11 @@ extern "C" { #include } +#include "lib/ffmpeg_image_proxy.h" #include "lib/image.h" -#include "lib/scaler.h" using std::list; +using boost::shared_ptr; BOOST_AUTO_TEST_CASE (make_black_test) { @@ -76,13 +78,13 @@ BOOST_AUTO_TEST_CASE (make_black_test) pix_fmts.push_back (AV_PIX_FMT_YUVA422P16LE); pix_fmts.push_back (AV_PIX_FMT_YUVA444P16LE); pix_fmts.push_back (AV_PIX_FMT_RGB555LE); // 46 - + int N = 0; for (list::const_iterator i = pix_fmts.begin(); i != pix_fmts.end(); ++i) { boost::shared_ptr foo (new Image (*i, in_size, true)); foo->make_black (); - boost::shared_ptr bar = foo->scale (out_size, Scaler::from_id ("bicubic"), PIX_FMT_RGB24, true); - + boost::shared_ptr bar = foo->scale (out_size, dcp::YUV_TO_RGB_REC601, AV_PIX_FMT_RGB24, true, false); + uint8_t* p = bar->data()[0]; for (int y = 0; y < bar->size().height; ++y) { uint8_t* q = p; @@ -98,3 +100,64 @@ BOOST_AUTO_TEST_CASE (make_black_test) ++N; } } + + +BOOST_AUTO_TEST_CASE (make_part_black_test) +{ + shared_ptr proxy (new FFmpegImageProxy("test/data/flat_red.png")); + shared_ptr original = proxy->image().first; + + list pix_fmts = { + AV_PIX_FMT_RGB24, + AV_PIX_FMT_ARGB, + AV_PIX_FMT_RGBA, + AV_PIX_FMT_ABGR, + AV_PIX_FMT_BGRA, + AV_PIX_FMT_YUV420P, + AV_PIX_FMT_YUV422P10LE, + }; + + list > positions = { + { 0, 256 }, + { 128, 64 }, + }; + + int N = 0; + for (list::const_iterator i = pix_fmts.begin(); i != pix_fmts.end(); ++i) { + for (list >::const_iterator j = positions.begin(); j != positions.end(); ++j) { + shared_ptr foo = original->convert_pixel_format(dcp::YUV_TO_RGB_REC601, *i, true, false); + foo->make_part_black (j->first, j->second); + shared_ptr bar = foo->convert_pixel_format (dcp::YUV_TO_RGB_REC601, AV_PIX_FMT_RGB24, true, false); + + uint8_t* p = bar->data()[0]; + for (int y = 0; y < bar->size().height; ++y) { + uint8_t* q = p; + for (int x = 0; x < bar->size().width; ++x) { + int r = *q++; + int g = *q++; + int b = *q++; + if (x >= j->first && x < (j->first + j->second)) { + BOOST_CHECK_MESSAGE ( + r < 3, "red=" << static_cast(r) << " at x=" << x << " format " << *i << " from " << j->first << " width " << j->second + ); + } else { + BOOST_CHECK_MESSAGE ( + r >= 252, "red=" << static_cast(r) << " at x=" << x << " format " << *i << " from " << j->first << " width " << j->second + ); + + } + BOOST_CHECK_MESSAGE ( + g == 0, "green=" << static_cast(g) << " at x=" << x << " format " << *i << " from " << j->first << " width " << j->second + ); + BOOST_CHECK_MESSAGE ( + b == 0, "blue=" << static_cast(b) << " at x=" << x << " format " << *i << " from " << j->first << " width " << j->second + ); + } + p += bar->stride()[0]; + } + + ++N; + } + } +} +