X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Ftest.cc;h=8ca103a6bdedb9800c97ef94f3f14509ac5253ee;hb=fbaade900b1479fafe54bbbe904cf8483a577e94;hp=fd9c6941be30e4aac818a3debf3f2b6706df865b;hpb=2c43d6e1068704cc4f4d6383217ed9a1a07bb67d;p=dcpomatic.git diff --git a/test/test.cc b/test/test.cc index fd9c6941b..8ca103a6b 100644 --- a/test/test.cc +++ b/test/test.cc @@ -45,6 +45,8 @@ #include "test.h" #include #include +#include +#include #include #include #include @@ -94,13 +96,19 @@ TestPaths::TestPaths::private_data () return boost::filesystem::path(env); } - return boost::filesystem::canonical(boost::filesystem::path ("..") / boost::filesystem::path ("dcpomatic-test-private")); + auto relative = boost::filesystem::path ("..") / boost::filesystem::path ("dcpomatic-test-private"); + if (!boost::filesystem::exists(relative)) { + std::cerr << "No private test data found! Tests may fail.\n"; + return relative; + } + + return boost::filesystem::canonical(relative); } boost::filesystem::path TestPaths::xsd () { - return boost::filesystem::canonical(boost::filesystem::path("..") / boost::filesystem::path("libdcp") / boost::filesystem::path("xsd")); + return boost::filesystem::current_path().parent_path() / "libdcp" / "xsd"; } @@ -110,12 +118,12 @@ setup_test_config () Config::instance()->set_master_encoding_threads (boost::thread::hardware_concurrency() / 2); Config::instance()->set_server_encoding_threads (1); Config::instance()->set_server_port_base (61921); - Config::instance()->set_default_container (Ratio::from_id ("185")); Config::instance()->set_default_dcp_content_type (static_cast (0)); Config::instance()->set_default_audio_delay (0); Config::instance()->set_default_j2k_bandwidth (100000000); Config::instance()->set_default_interop (false); Config::instance()->set_default_still_length (10); + Config::instance()->set_default_dcp_audio_channels(8); Config::instance()->set_log_types ( LogEntry::TYPE_GENERAL | LogEntry::TYPE_WARNING | LogEntry::TYPE_ERROR | LogEntry::TYPE_DISK @@ -127,6 +135,8 @@ setup_test_config () auto decryption = make_shared(dcp::file_to_string("test/data/decryption_chain")); decryption->set_key(dcp::file_to_string("test/data/decryption_key")); Config::instance()->set_decryption_chain (decryption); + Config::instance()->set_dcp_asset_filename_format(dcp::NameFormat("%t")); + Config::instance()->set_cinemas_file("test/data/empty_cinemas.xml"); } @@ -149,6 +159,7 @@ struct TestConfig dcpomatic_setup (); setup_test_config (); + capture_ffmpeg_logs(); EncodeServerFinder::instance()->stop (); @@ -277,13 +288,14 @@ check_mxf_audio_file (boost::filesystem::path ref, boost::filesystem::path check BOOST_REQUIRE (!ASDCP_FAILURE (check_reader.FillAudioDescriptor (check_desc))); BOOST_REQUIRE_EQUAL (ref_desc.ContainerDuration, check_desc.ContainerDuration); + BOOST_REQUIRE_MESSAGE(ref_desc.ChannelCount, check_desc.ChannelCount); ASDCP::PCM::FrameBuffer ref_buffer (Kumu::Megabyte); ASDCP::PCM::FrameBuffer check_buffer (Kumu::Megabyte); for (size_t i = 0; i < ref_desc.ContainerDuration; ++i) { ref_reader.ReadFrame (i, ref_buffer, 0); check_reader.ReadFrame (i, check_buffer, 0); - BOOST_REQUIRE (memcmp(ref_buffer.RoData(), check_buffer.RoData(), ref_buffer.Size()) == 0); + BOOST_REQUIRE_MESSAGE(memcmp(ref_buffer.RoData(), check_buffer.RoData(), ref_buffer.Size()) == 0, "Audio MXF differs in frame " << i); } } @@ -537,7 +549,7 @@ check_dcp (boost::filesystem::path ref, shared_ptr film) void -check_dcp (boost::filesystem::path ref, boost::filesystem::path check) +check_dcp(boost::filesystem::path ref, boost::filesystem::path check, bool sound_can_differ) { dcp::DCP ref_dcp (ref); ref_dcp.read (); @@ -551,9 +563,12 @@ check_dcp (boost::filesystem::path ref, boost::filesystem::path check) options.cpl_annotation_texts_can_differ = true; options.reel_annotation_texts_can_differ = true; options.reel_hashes_can_differ = true; + options.asset_hashes_can_differ = true; options.issue_dates_can_differ = true; + options.max_subtitle_vertical_position_error = 0.001; + options.sound_assets_can_differ = sound_can_differ; - BOOST_CHECK (ref_dcp.equals (check_dcp, options, boost::bind (note, _1, _2))); + BOOST_CHECK_MESSAGE(ref_dcp.equals(check_dcp, options, boost::bind (note, _1, _2)), check << " does not match " << ref); } void @@ -715,15 +730,13 @@ png_error_fn (png_structp, char const * message) void write_image (shared_ptr image, boost::filesystem::path file) { - int png_color_type = 0; + int png_color_type = PNG_COLOR_TYPE_RGB; int bits_per_pixel = 0; switch (image->pixel_format()) { case AV_PIX_FMT_RGB24: - png_color_type = PNG_COLOR_TYPE_RGB; bits_per_pixel = 8; break; case AV_PIX_FMT_XYZ12LE: - png_color_type = PNG_COLOR_TYPE_RGB; bits_per_pixel = 16; break; default: @@ -743,9 +756,40 @@ write_image (shared_ptr image, boost::filesystem::path file) png_set_IHDR (png_ptr, info_ptr, image->size().width, image->size().height, bits_per_pixel, png_color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); - png_byte ** row_pointers = reinterpret_cast(png_malloc(png_ptr, image->size().height * sizeof(png_byte *))); - for (int i = 0; i < image->size().height; ++i) { - row_pointers[i] = (png_byte *) (image->data()[0] + i * image->stride()[0]); + auto const width = image->size().width; + auto const height = image->size().height; + auto const stride = image->stride()[0]; + + vector> data_to_write(height); + for (int y = 0; y < height; ++y) { + data_to_write[y].resize(stride); + } + + switch (image->pixel_format()) { + case AV_PIX_FMT_RGB24: + for (int y = 0; y < height; ++y) { + memcpy(data_to_write[y].data(), image->data()[0] + y * stride, stride); + } + break; + case AV_PIX_FMT_XYZ12LE: + /* 16-bit pixel values must be written MSB first */ + for (int y = 0; y < height; ++y) { + data_to_write[y].resize(stride); + uint8_t* original = image->data()[0] + y * stride; + for (int x = 0; x < width * 3; ++x) { + data_to_write[y][x * 2] = original[1]; + data_to_write[y][x * 2 + 1] = original[0]; + original += 2; + } + } + break; + default: + break; + } + + png_byte ** row_pointers = reinterpret_cast(png_malloc(png_ptr, image->size().height * sizeof(png_byte *))); + for (int y = 0; y < height; ++y) { + row_pointers[y] = reinterpret_cast(data_to_write[y].data()); } png_write_info (png_ptr, info_ptr); @@ -795,25 +839,23 @@ check_one_frame (boost::filesystem::path dcp_dir, int64_t index, boost::filesyst boost::filesystem::path dcp_file (shared_ptr film, string prefix) { - auto i = boost::filesystem::recursive_directory_iterator(film->dir(film->dcp_name())); - while (i != boost::filesystem::recursive_directory_iterator() && !boost::algorithm::starts_with(i->path().leaf().string(), prefix)) { - ++i; - } + using namespace boost::filesystem; - BOOST_REQUIRE_MESSAGE(i != boost::filesystem::recursive_directory_iterator(), "Could not find file with prefix " << prefix); - return i->path(); + vector matches; + std::copy_if(recursive_directory_iterator(film->dir(film->dcp_name())), recursive_directory_iterator(), std::back_inserter(matches), [&prefix](directory_entry const& entry) { + return boost::algorithm::starts_with(entry.path().filename().string(), prefix); + }); + + BOOST_REQUIRE_MESSAGE(matches.size() == 1, "Found " << matches.size() << " files with prefix " << prefix); + return matches[0].path(); } boost::filesystem::path subtitle_file (shared_ptr film) { - for (auto i: boost::filesystem::directory_iterator(film->directory().get() / film->dcp_name (false))) { - if (boost::filesystem::is_directory(i.path())) { - for (auto j: boost::filesystem::directory_iterator(i.path())) { - if (boost::algorithm::starts_with(j.path().leaf().string(), "sub_")) { - return j.path(); - } - } + for (auto i: boost::filesystem::recursive_directory_iterator(film->directory().get() / film->dcp_name(false))) { + if (boost::algorithm::starts_with(i.path().filename().string(), "sub_")) { + return i.path(); } } @@ -904,12 +946,9 @@ void progress (float) {} void -make_and_verify_dcp (shared_ptr film, vector ignore) +verify_dcp(boost::filesystem::path dir, vector ignore) { - film->write_metadata (); - make_dcp (film, TranscodeJob::ChangedBehaviour::IGNORE); - BOOST_REQUIRE (!wait_for_jobs()); - auto notes = dcp::verify ({film->dir(film->dcp_name())}, &stage, &progress, TestPaths::xsd()); + auto notes = dcp::verify({dir}, {}, &stage, &progress, {}, TestPaths::xsd()); bool ok = true; for (auto i: notes) { if (find(ignore.begin(), ignore.end(), i.code()) == ignore.end()) { @@ -921,6 +960,16 @@ make_and_verify_dcp (shared_ptr film, vector } +void +make_and_verify_dcp (shared_ptr film, vector ignore) +{ + film->write_metadata (); + make_dcp (film, TranscodeJob::ChangedBehaviour::IGNORE); + BOOST_REQUIRE (!wait_for_jobs()); + verify_dcp({film->dir(film->dcp_name())}, ignore); +} + + void check_int_close (int a, int b, int d) { @@ -948,10 +997,34 @@ find_file (boost::filesystem::path dir, string filename_part) boost::optional found; for (auto i: boost::filesystem::directory_iterator(dir)) { if (i.path().filename().string().find(filename_part) != string::npos) { - BOOST_REQUIRE (!found); + BOOST_REQUIRE_MESSAGE(!found, "File " << filename_part << " found more than once in " << dir); found = i; } } - BOOST_REQUIRE (found); + BOOST_REQUIRE_MESSAGE(found, "Could not find " << filename_part << " in " << dir); return *found; } + + +Editor::Editor(boost::filesystem::path path) + : _path(path) + , _content(dcp::file_to_string(path)) +{ + +} + +Editor::~Editor() +{ + auto f = fopen(_path.string().c_str(), "w"); + BOOST_REQUIRE(f); + fwrite(_content.c_str(), _content.length(), 1, f); + fclose(f); +} + +void +Editor::replace(string a, string b) +{ + auto old_content = _content; + boost::algorithm::replace_all(_content, a, b); + BOOST_REQUIRE(_content != old_content); +}