From d0a0a4839f0e1e8d37f9f9ad41784c4d18210a6b Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 31 May 2017 16:20:09 +0100 Subject: [PATCH] Allow repeat-frame to work with 3D. --- ChangeLog | 4 ++ src/lib/j2k_encoder.cc | 4 +- src/lib/j2k_encoder.h | 2 +- test/optimise_stills_test.cc | 102 +++++++++++++++++++++++++++++++++++ test/test.cc | 1 + test/wscript | 1 + 6 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 test/optimise_stills_test.cc diff --git a/ChangeLog b/ChangeLog index 30d576e08..cf44cbc4f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2017-05-31 Carl Hetherington + + * Speed up generation of 3D DCPs from still images. + 2017-05-26 Carl Hetherington * Version 2.11.8 released. diff --git a/src/lib/j2k_encoder.cc b/src/lib/j2k_encoder.cc index 3c062dcaa..15977bb3e 100644 --- a/src/lib/j2k_encoder.cc +++ b/src/lib/j2k_encoder.cc @@ -220,7 +220,7 @@ J2KEncoder::encode (shared_ptr pv, DCPTime time) LOG_DEBUG_ENCODE("Frame @ %1 J2K", to_string(time)); /* This frame already has J2K data, so just write it */ _writer->write (pv->j2k(), position, pv->eyes ()); - } else if (_last_player_video && _writer->can_repeat(position) && pv->same (_last_player_video)) { + } else if (_last_player_video[pv->eyes()] && _writer->can_repeat(position) && pv->same (_last_player_video[pv->eyes()])) { LOG_DEBUG_ENCODE("Frame @ %1 REPEAT", to_string(time)); _writer->repeat (position, pv->eyes ()); } else { @@ -244,7 +244,7 @@ J2KEncoder::encode (shared_ptr pv, DCPTime time) _empty_condition.notify_all (); } - _last_player_video = pv; + _last_player_video[pv->eyes()] = pv; _last_player_video_time = time; } diff --git a/src/lib/j2k_encoder.h b/src/lib/j2k_encoder.h index cc8a854eb..2180f3f6a 100644 --- a/src/lib/j2k_encoder.h +++ b/src/lib/j2k_encoder.h @@ -100,7 +100,7 @@ private: boost::shared_ptr _writer; Waker _waker; - boost::shared_ptr _last_player_video; + boost::shared_ptr _last_player_video[EYES_COUNT]; boost::optional _last_player_video_time; boost::signals2::scoped_connection _server_found_connection; diff --git a/test/optimise_stills_test.cc b/test/optimise_stills_test.cc new file mode 100644 index 000000000..7bd7f3b85 --- /dev/null +++ b/test/optimise_stills_test.cc @@ -0,0 +1,102 @@ +/* + Copyright (C) 2017 Carl Hetherington + + 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. + + 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 DCP-o-matic. If not, see . + +*/ + +#include "lib/dcp_encoder.h" +#include "lib/writer.h" +#include "lib/transcode_job.h" +#include "lib/job_manager.h" +#include "lib/film.h" +#include "lib/ratio.h" +#include "lib/content_factory.h" +#include "lib/dcp_content_type.h" +#include "lib/content.h" +#include "lib/video_content.h" +#include "test.h" +#include +#include + +using std::getline; +using std::ifstream; +using std::string; +using std::vector; +using boost::starts_with; +using boost::split; +using boost::dynamic_pointer_cast; +using boost::shared_ptr; + +static +void +check (string name, int check_full, int check_repeat) +{ + /* The encoder will have been destroyed so parse the logs */ + ifstream log ("build/test/" + name + "/log"); + string line; + int repeat = 0; + int full = 0; + while (getline (log, line)) { + vector bits; + split (bits, line, boost::is_any_of (":")); + if (bits.size() >= 4 && starts_with (bits[3], " Wrote")) { + split (bits, bits[3], boost::is_any_of (" ")); + if (bits.size() >= 7) { + full = atoi (bits[2].c_str()); + repeat = atoi (bits[6].c_str()); + } + } + + } + + BOOST_CHECK_EQUAL (full, check_full); + BOOST_CHECK_EQUAL (repeat, check_repeat); +} + +/** Make a 2D DCP out of a 2D still and check that the J2K encoding is only done once for each frame */ +BOOST_AUTO_TEST_CASE (optimise_stills_test1) +{ + shared_ptr film = new_test_film ("optimise_stills_test1"); + film->set_container (Ratio::from_id ("185")); + film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TLR")); + film->set_name ("frobozz"); + shared_ptr content = content_factory(film, "test/data/flat_red.png").front (); + film->examine_and_add_content (content); + BOOST_REQUIRE (!wait_for_jobs ()); + film->make_dcp (); + BOOST_REQUIRE (!wait_for_jobs ()); + + check ("optimise_stills_test1", 1, 10 * 24 - 1); +} + +/** Make a 3D DCP out of a 3D L/R still and check that the J2K encoding is only done once for L and R */ +BOOST_AUTO_TEST_CASE (optimise_stills_test2) +{ + shared_ptr film = new_test_film ("optimise_stills_test2"); + film->set_container (Ratio::from_id ("185")); + film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TLR")); + film->set_name ("frobozz"); + shared_ptr content = content_factory(film, "test/data/flat_red.png").front (); + film->examine_and_add_content (content); + BOOST_REQUIRE (!wait_for_jobs ()); + content->video->set_frame_type (VIDEO_FRAME_TYPE_3D_LEFT_RIGHT); + film->set_three_d (true); + film->make_dcp (); + BOOST_REQUIRE (!wait_for_jobs ()); + + check ("optimise_stills_test2", 2, 10 * 48 - 2); +} diff --git a/test/test.cc b/test/test.cc index 699dea6c3..1b94b3912 100644 --- a/test/test.cc +++ b/test/test.cc @@ -82,6 +82,7 @@ struct TestConfig 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_log_types (LogEntry::TYPE_GENERAL | LogEntry::TYPE_WARNING | LogEntry::TYPE_ERROR); EncodeServerFinder::instance()->stop (); diff --git a/test/wscript b/test/wscript index cb39468a1..3ccc64423 100644 --- a/test/wscript +++ b/test/wscript @@ -75,6 +75,7 @@ def build(bld): j2k_bandwidth_test.cc job_test.cc make_black_test.cc + optimise_stills_test.cc pixel_formats_test.cc player_test.cc ratio_test.cc -- 2.30.2