Rearrange checking (and re-examining) content.
authorCarl Hetherington <cth@carlh.net>
Sun, 28 Nov 2021 09:39:03 +0000 (10:39 +0100)
committerCarl Hetherington <cth@carlh.net>
Sun, 28 Nov 2021 20:13:15 +0000 (21:13 +0100)
Most importantly, checking of content for changes before making
a DCP is now done in the TranscodeJob (rather than being in a
separate job).  This makes things a little neater and also makes
the batch converter less confusing when you add a job whose content
has changed.

15 files changed:
src/lib/check_content_change_job.cc
src/lib/check_content_change_job.h
src/lib/film.cc
src/lib/film.h
src/lib/transcode_job.cc
src/lib/transcode_job.h
src/tools/dcpomatic.cc
src/tools/dcpomatic_batch.cc
src/tools/dcpomatic_cli.cc
test/ffmpeg_encoder_test.cc
test/interrupt_encoder_test.cc
test/reels_test.cc
test/test.cc
test/threed_test.cc
test/video_level_test.cc

index 967291bb37344a3a455708aae7175da37a2fedd3..500e03c1d5a07d4ab427bc6bf3bb3bd918dcdd6c 100644 (file)
@@ -32,11 +32,8 @@ using std::list;
 using std::cout;
 using std::shared_ptr;
 
 using std::cout;
 using std::shared_ptr;
 
-/** @param gui true if we are running this job from the GUI, false if it's the CLI */
-CheckContentChangeJob::CheckContentChangeJob (shared_ptr<const Film> film, shared_ptr<Job> following, bool gui)
+CheckContentChangeJob::CheckContentChangeJob (shared_ptr<const Film> film)
        : Job (film)
        : Job (film)
-       , _following (following)
-       , _gui (gui)
 {
 
 }
 {
 
 }
@@ -68,35 +65,12 @@ CheckContentChangeJob::run ()
        std::copy_if (content.begin(), content.end(), std::back_inserter(changed), [](shared_ptr<Content> c) { return c->changed(); });
 
        if (!changed.empty()) {
        std::copy_if (content.begin(), content.end(), std::back_inserter(changed), [](shared_ptr<Content> c) { return c->changed(); });
 
        if (!changed.empty()) {
-               if (_gui) {
-                       for (auto i: changed) {
-                               JobManager::instance()->add(shared_ptr<Job>(new ExamineContentJob(_film, i)));
-                       }
-                       string m = _("Some files have been changed since they were added to the project.\n\nThese files will now be re-examined, so you may need to check their settings.");
-                       if (_following) {
-                               /* I'm assuming that _following is a make DCP job */
-                               m += "  ";
-                               m += _("Choose 'Make DCP' again when you have done this.");
-                       }
-                       set_message (m);
-               } else {
-                       set_progress (1);
-                       set_state (FINISHED_ERROR);
-                       set_error (
-                               _("Some files have been changed since they were added to the project.  Open the project in DCP-o-matic, check the settings, then save it before trying again."),
-                               ""
-                               );
-                       return;
+               for (auto i: changed) {
+                       JobManager::instance()->add(make_shared<ExamineContentJob>(_film, i));
                }
                }
-       } else if (_following) {
-               JobManager::instance()->add (_following);
+               set_message (_("Some files have been changed since they were added to the project.\n\nThese files will now be re-examined, so you may need to check their settings."));
        }
 
        }
 
-       /* Only set this job as finished once we have added the following job, otherwise I think
-          it's possible that the tests will sporadically fail if they check for all jobs being
-          complete in the gap between this one finishing and _following being added.
-       */
-
        set_progress (1);
        set_state (FINISHED_OK);
 }
        set_progress (1);
        set_state (FINISHED_OK);
 }
index 739d2651f426c535d3fde8f383f07a3a612132d7..b3cdf594c1076d762bef89ea43a3e8fcf228e7f7 100644 (file)
 class CheckContentChangeJob : public Job
 {
 public:
 class CheckContentChangeJob : public Job
 {
 public:
-       CheckContentChangeJob (std::shared_ptr<const Film>, std::shared_ptr<Job> following = std::shared_ptr<Job>(), bool gui = true);
+       CheckContentChangeJob (std::shared_ptr<const Film>);
        ~CheckContentChangeJob ();
 
        std::string name () const;
        std::string json_name () const;
        void run ();
        ~CheckContentChangeJob ();
 
        std::string name () const;
        std::string json_name () const;
        void run ();
-
-private:
-       std::shared_ptr<Job> _following;
-       bool _gui;
 };
 };
index 64fc04f5ddbcbc4172502b443bab05ca32617857..d0f0106c49b6fb0e2906b53468d76e3e71190e25 100644 (file)
@@ -377,12 +377,9 @@ Film::subtitle_analysis_path (shared_ptr<const Content> content) const
 }
 
 
 }
 
 
-/** Add suitable Jobs to the JobManager to create a DCP for this Film.
- *  @param gui true if this is being called from a GUI tool.
- *  @param check true to check the content in the project for changes before making the DCP.
- */
+/** Add suitable Jobs to the JobManager to create a DCP for this Film */
 void
 void
-Film::make_dcp (bool gui, bool check)
+Film::make_dcp (TranscodeJob::ChangedBehaviour behaviour)
 {
        if (dcp_name().find ("/") != string::npos) {
                throw BadSettingError (_("name"), _("Cannot contain slashes"));
 {
        if (dcp_name().find ("/") != string::npos) {
                throw BadSettingError (_("name"), _("Cannot contain slashes"));
@@ -438,14 +435,9 @@ Film::make_dcp (bool gui, bool check)
        }
        LOG_GENERAL ("J2K bandwidth %1", j2k_bandwidth());
 
        }
        LOG_GENERAL ("J2K bandwidth %1", j2k_bandwidth());
 
-       auto tj = make_shared<TranscodeJob>(shared_from_this());
+       auto tj = make_shared<TranscodeJob>(shared_from_this(), behaviour);
        tj->set_encoder (make_shared<DCPEncoder>(shared_from_this(), tj));
        tj->set_encoder (make_shared<DCPEncoder>(shared_from_this(), tj));
-       if (check) {
-               auto cc = make_shared<CheckContentChangeJob>(shared_from_this(), tj, gui);
-               JobManager::instance()->add (cc);
-       } else {
-               JobManager::instance()->add (tj);
-       }
+       JobManager::instance()->add (tj);
 }
 
 /** Start a job to send our DCP to the configured TMS */
 }
 
 /** Start a job to send our DCP to the configured TMS */
index 5255e8355a7e1e6c9a59a6652bf509b37ce5389a..78a66e17f24d9903e65afcde30a259681bf2a77b 100644 (file)
@@ -30,6 +30,7 @@
 #include "dcp_text_track.h"
 #include "frame_rate_change.h"
 #include "signaller.h"
 #include "dcp_text_track.h"
 #include "frame_rate_change.h"
 #include "signaller.h"
+#include "transcode_job.h"
 #include "types.h"
 #include "util.h"
 #include <dcp/encrypted_kdm.h>
 #include "types.h"
 #include "util.h"
 #include <dcp/encrypted_kdm.h>
@@ -111,7 +112,7 @@ public:
        boost::filesystem::path subtitle_analysis_path (std::shared_ptr<const Content>) const;
 
        void send_dcp_to_tms ();
        boost::filesystem::path subtitle_analysis_path (std::shared_ptr<const Content>) const;
 
        void send_dcp_to_tms ();
-       void make_dcp (bool gui = false, bool check = true);
+       void make_dcp (TranscodeJob::ChangedBehaviour behaviour);
 
        /** @return Logger.
         *  It is safe to call this from any thread.
 
        /** @return Logger.
         *  It is safe to call this from any thread.
index 8186b9e7cdc30f680e655cf1cb2b68cd25b88074..68cd30e540df71787d43c63898b9b1532f437076 100644 (file)
 
 #include "analytics.h"
 #include "compose.hpp"
 
 #include "analytics.h"
 #include "compose.hpp"
+#include "content.h"
 #include "config.h"
 #include "dcp_encoder.h"
 #include "dcpomatic_log.h"
 #include "encoder.h"
 #include "config.h"
 #include "dcp_encoder.h"
 #include "dcpomatic_log.h"
 #include "encoder.h"
+#include "examine_content_job.h"
 #include "film.h"
 #include "job_manager.h"
 #include "log.h"
 #include "film.h"
 #include "job_manager.h"
 #include "log.h"
@@ -52,8 +54,9 @@ using std::dynamic_pointer_cast;
 
 
 /** @param film Film to use */
 
 
 /** @param film Film to use */
-TranscodeJob::TranscodeJob (shared_ptr<const Film> film)
+TranscodeJob::TranscodeJob (shared_ptr<const Film> film, ChangedBehaviour changed)
        : Job (film)
        : Job (film)
+       , _changed (changed)
 {
 
 }
 {
 
 }
@@ -90,6 +93,32 @@ void
 TranscodeJob::run ()
 {
        try {
 TranscodeJob::run ()
 {
        try {
+               auto content = _film->content();
+               std::vector<shared_ptr<Content>> changed;
+               std::copy_if (content.begin(), content.end(), std::back_inserter(changed), [](shared_ptr<Content> c) { return c->changed(); });
+
+               if (!changed.empty()) {
+                       switch (_changed) {
+                       case ChangedBehaviour::EXAMINE_THEN_STOP:
+                               for (auto i: changed) {
+                                       JobManager::instance()->add(make_shared<ExamineContentJob>(_film, i));
+                               }
+                               set_progress (1);
+                               set_message (_("Some files have been changed since they were added to the project.\n\nThese files will now be re-examined, so you may need to check their settings before trying again."));
+                               set_error (_("Files have changed since they were added to the project."), _("Check their new settings, then try again."));
+                               set_state (FINISHED_ERROR);
+                               return;
+                       case ChangedBehaviour::STOP:
+                               set_progress (1);
+                               set_error (_("Files have changed since they were added to the project."), _("Open the project in DCP-o-matic, check the settings, then save it before trying again."));
+                               set_state (FINISHED_ERROR);
+                               return;
+                       default:
+                               LOG_GENERAL_NC (_("Some files have been changed since they were added to the project."));
+                               break;
+                       }
+               }
+
                struct timeval start;
                gettimeofday (&start, 0);
                LOG_GENERAL_NC (N_("Transcode job starting"));
                struct timeval start;
                gettimeofday (&start, 0);
                LOG_GENERAL_NC (N_("Transcode job starting"));
@@ -139,29 +168,17 @@ TranscodeJob::status () const
                return Job::status ();
        }
 
                return Job::status ();
        }
 
-
-       char buffer[256];
        if (finished() || _encoder->finishing()) {
        if (finished() || _encoder->finishing()) {
-               strncpy (buffer, Job::status().c_str(), 255);
-               buffer[255] = '\0';
-       } else {
-               snprintf (
-                       buffer, sizeof(buffer), "%s; %" PRId64 "/%" PRId64 " frames",
-                       Job::status().c_str(),
-                       _encoder->frames_done(),
-                       _film->length().frames_round (_film->video_frame_rate ())
-                       );
-
-               optional<float> const fps = _encoder->current_rate ();
-               if (fps) {
-                       char fps_buffer[64];
-                       /// TRANSLATORS: fps here is an abbreviation for frames per second
-                       snprintf (fps_buffer, sizeof(fps_buffer), _("; %.1f fps"), *fps);
-                       strncat (buffer, fps_buffer, strlen(buffer) - 1);
-               }
+               return Job::status();
+       }
+
+       auto status = String::compose(_("%1; %2/%3 frames"), Job::status(), _encoder->frames_done(), _film->length().frames_round(_film->video_frame_rate()));
+       if (auto const fps = _encoder->current_rate()) {
+               /// TRANSLATORS: fps here is an abbreviation for frames per second
+               status += String::compose(_("; %1 fps"), dcp::locale_convert<string>(*fps, 1));
        }
 
        }
 
-       return buffer;
+       return status;
 }
 
 
 }
 
 
index 030e22bef092dea8bc67b794bea4bef8668a042f..368a9b685117ff6425e0a43207032a05450e960e 100644 (file)
 */
 
 
 */
 
 
+#ifndef DCPOMATIC_TRANSCODE_JOB_H
+#define DCPOMATIC_TRANSCODE_JOB_H
+
+
 /** @file src/transcode_job.h
  *  @brief A job which transcodes from one format to another.
  */
 /** @file src/transcode_job.h
  *  @brief A job which transcodes from one format to another.
  */
 #include "job.h"
 
 
 #include "job.h"
 
 
+/* Defined by Windows */
+#undef IGNORE
+
+
 class Encoder;
 
 
 class Encoder;
 
 
@@ -36,7 +44,13 @@ class Encoder;
 class TranscodeJob : public Job
 {
 public:
 class TranscodeJob : public Job
 {
 public:
-       explicit TranscodeJob (std::shared_ptr<const Film> film);
+       enum class ChangedBehaviour {
+               EXAMINE_THEN_STOP,
+               STOP,
+               IGNORE
+       };
+
+       explicit TranscodeJob (std::shared_ptr<const Film> film, ChangedBehaviour changed);
        ~TranscodeJob ();
 
        std::string name () const override;
        ~TranscodeJob ();
 
        std::string name () const override;
@@ -50,4 +64,9 @@ private:
        int remaining_time () const override;
 
        std::shared_ptr<Encoder> _encoder;
        int remaining_time () const override;
 
        std::shared_ptr<Encoder> _encoder;
+       ChangedBehaviour _changed;
 };
 };
+
+
+#endif
+
index 0b7f632e1ef409613c11263ba8cc78e89c06b7e4..70abcf3b7779882335c416a428fd0e6d045549a8 100644 (file)
@@ -799,7 +799,7 @@ private:
                           a long time, and crashes/power failures are moderately likely.
                        */
                        _film->write_metadata ();
                           a long time, and crashes/power failures are moderately likely.
                        */
                        _film->write_metadata ();
-                       _film->make_dcp (true);
+                       _film->make_dcp (TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP);
                } catch (BadSettingError& e) {
                        error_dialog (this, wxString::Format (_("Bad setting for %s."), std_to_wx(e.setting()).data()), std_to_wx(e.what()));
                } catch (std::exception& e) {
                } catch (BadSettingError& e) {
                        error_dialog (this, wxString::Format (_("Bad setting for %s."), std_to_wx(e.setting()).data()), std_to_wx(e.what()));
                } catch (std::exception& e) {
@@ -993,7 +993,7 @@ private:
                                }
                        }
 
                                }
                        }
 
-                       auto job = make_shared<TranscodeJob>(_film);
+                       auto job = make_shared<TranscodeJob>(_film, TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP);
                        job->set_encoder (
                                make_shared<FFmpegEncoder> (
                                        _film, job, d->path(), d->format(), d->mixdown_to_stereo(), d->split_reels(), d->split_streams(), d->x264_crf())
                        job->set_encoder (
                                make_shared<FFmpegEncoder> (
                                        _film, job, d->path(), d->format(), d->mixdown_to_stereo(), d->split_reels(), d->split_streams(), d->x264_crf())
@@ -1008,7 +1008,7 @@ private:
        {
                auto d = new ExportSubtitlesDialog (this, _film->reels().size(), _film->interop());
                if (d->ShowModal() == wxID_OK) {
        {
                auto d = new ExportSubtitlesDialog (this, _film->reels().size(), _film->interop());
                if (d->ShowModal() == wxID_OK) {
-                       auto job = make_shared<TranscodeJob>(_film);
+                       auto job = make_shared<TranscodeJob>(_film, TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP);
                        job->set_encoder (
                                make_shared<SubtitleEncoder>(_film, job, d->path(), _film->isdcf_name(true), d->split_reels(), d->include_font())
                                );
                        job->set_encoder (
                                make_shared<SubtitleEncoder>(_film, job, d->path(), _film->isdcf_name(true), d->split_reels(), d->include_font())
                                );
index 06147060267d60e7ac17281ce4985a0c73b928e5..29f79ff080bf840276773c1159c12f3078c21fc1 100644 (file)
@@ -211,7 +211,7 @@ public:
                                }
                        }
 
                                }
                        }
 
-                       film->make_dcp ();
+                       film->make_dcp (TranscodeJob::ChangedBehaviour::STOP);
                } catch (std::exception& e) {
                        auto p = std_to_wx (path.string ());
                        auto b = p.ToUTF8 ();
                } catch (std::exception& e) {
                        auto p = std_to_wx (path.string ());
                        auto b = p.ToUTF8 ();
@@ -450,7 +450,7 @@ class App : public wxApp
                                try {
                                        film = make_shared<Film>(i);
                                        film->read_metadata ();
                                try {
                                        film = make_shared<Film>(i);
                                        film->read_metadata ();
-                                       film->make_dcp ();
+                                       film->make_dcp (TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP);
                                } catch (exception& e) {
                                        error_dialog (
                                                0,
                                } catch (exception& e) {
                                        error_dialog (
                                                0,
index 75f57fa89ce4b659a50346c79df05b6f6acab978..95f2f40397ecf95c0d763948b784123f68d18a9b 100644 (file)
@@ -355,7 +355,7 @@ main (int argc, char* argv[])
                cout << "\nMaking DCP for " << film->name() << "\n";
        }
 
                cout << "\nMaking DCP for " << film->name() << "\n";
        }
 
-       film->make_dcp (false, check);
+       film->make_dcp (check ? TranscodeJob::ChangedBehaviour::STOP : TranscodeJob::ChangedBehaviour::IGNORE);
        bool const error = show_jobs_on_console (progress);
 
        if (keep_going) {
        bool const error = show_jobs_on_console (progress);
 
        if (keep_going) {
index 993da4d2348a84e32d9a681900092b81bad1c846..9edf2bdbd5880748b64155e13e79e07eed1b6d2d 100644 (file)
@@ -69,12 +69,12 @@ ffmpeg_content_test (int number, boost::filesystem::path content, ExportFormat f
        name = String::compose("%1_test%2", name, number);
 
        auto c = make_shared<FFmpegContent>(content);
        name = String::compose("%1_test%2", name, number);
 
        auto c = make_shared<FFmpegContent>(content);
-       shared_ptr<Film> film = new_test_film2 (name, {c}, &cl);
+       auto film = new_test_film2 (name, {c}, &cl);
        film->set_name (name);
        film->set_audio_channels (6);
 
        film->write_metadata ();
        film->set_name (name);
        film->set_audio_channels (6);
 
        film->write_metadata ();
-       auto job = make_shared<TranscodeJob>(film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        auto file = boost::filesystem::path("build") / "test" / String::compose("%1.%2", name, extension);
        cl.add (file);
        FFmpegEncoder encoder (film, job, file, format, false, false, false, 23);
        auto file = boost::filesystem::path("build") / "test" / String::compose("%1.%2", name, extension);
        cl.add (file);
        FFmpegEncoder encoder (film, job, file, format, false, false, false, 23);
@@ -127,7 +127,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_prores_test5)
        c->video->set_length (240);
 
        film->write_metadata ();
        c->video->set_length (240);
 
        film->write_metadata ();
-       auto job = make_shared<TranscodeJob> (film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_test5.mov", ExportFormat::PRORES, false, false, false, 23);
        encoder.go ();
 }
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_test5.mov", ExportFormat::PRORES, false, false, false, 23);
        encoder.go ();
 }
@@ -149,7 +149,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_prores_test6)
        s->only_text()->set_effect_colour (dcp::Colour (0, 255, 255));
        film->write_metadata();
 
        s->only_text()->set_effect_colour (dcp::Colour (0, 255, 255));
        film->write_metadata();
 
-       auto job = make_shared<TranscodeJob> (film);
+       auto job = make_shared<TranscodeJob> (film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_test6.mov", ExportFormat::PRORES, false, false, false, 23);
        encoder.go ();
 }
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_test6.mov", ExportFormat::PRORES, false, false, false, 23);
        encoder.go ();
 }
@@ -174,7 +174,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_prores_test7)
        s->only_text()->set_effect (dcp::Effect::SHADOW);
        s->only_text()->set_effect_colour (dcp::Colour (0, 255, 255));
 
        s->only_text()->set_effect (dcp::Effect::SHADOW);
        s->only_text()->set_effect_colour (dcp::Colour (0, 255, 255));
 
-       auto job = make_shared<TranscodeJob> (film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_test7.mov", ExportFormat::PRORES, false, false, false, 23);
        encoder.go ();
 }
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_test7.mov", ExportFormat::PRORES, false, false, false, 23);
        encoder.go ();
 }
@@ -203,7 +203,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test2)
        s->only_text()->set_effect_colour (dcp::Colour (0, 255, 255));
        film->write_metadata();
 
        s->only_text()->set_effect_colour (dcp::Colour (0, 255, 255));
        film->write_metadata();
 
-       auto job = make_shared<TranscodeJob> (film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_h264_test2.mp4", ExportFormat::H264_AAC, false, false, false, 23);
        encoder.go ();
 }
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_h264_test2.mp4", ExportFormat::H264_AAC, false, false, false, 23);
        encoder.go ();
 }
@@ -229,7 +229,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test3)
        s->only_text()->set_effect_colour (dcp::Colour (0, 255, 255));
        film->write_metadata();
 
        s->only_text()->set_effect_colour (dcp::Colour (0, 255, 255));
        film->write_metadata();
 
-       auto job = make_shared<TranscodeJob> (film);
+       auto job = make_shared<TranscodeJob> (film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_h264_test3.mp4", ExportFormat::H264_AAC, false, false, false, 23);
        encoder.go ();
 }
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_h264_test3.mp4", ExportFormat::H264_AAC, false, false, false, 23);
        encoder.go ();
 }
@@ -243,7 +243,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test4)
 
        film->set_container(Ratio::from_id("185"));
 
 
        film->set_container(Ratio::from_id("185"));
 
-       auto job = make_shared<TranscodeJob>(film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder(film, job, "build/test/ffmpeg_encoder_h264_test4.mp4", ExportFormat::H264_AAC, false, false, false, 23);
        encoder.go();
 }
        FFmpegEncoder encoder(film, job, "build/test/ffmpeg_encoder_h264_test4.mp4", ExportFormat::H264_AAC, false, false, false, 23);
        encoder.go();
 }
@@ -298,7 +298,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test5)
        map.set (0, 5, 1);
        Rs->audio->set_mapping (map);
 
        map.set (0, 5, 1);
        Rs->audio->set_mapping (map);
 
-       auto job = make_shared<TranscodeJob> (film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_h264_test5.mp4", ExportFormat::H264_AAC, true, false, false, 23);
        encoder.go ();
 
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_h264_test5.mp4", ExportFormat::H264_AAC, true, false, false, 23);
        encoder.go ();
 
@@ -326,7 +326,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test6)
                i->set_use (true);
        }
 
                i->set_use (true);
        }
 
-       auto job = make_shared<TranscodeJob> (film2);
+       auto job = make_shared<TranscodeJob>(film2, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film2, job, "build/test/ffmpeg_encoder_h264_test6_vf.mp4", ExportFormat::H264_AAC, true, false, false, 23);
        encoder.go ();
 }
        FFmpegEncoder encoder (film2, job, "build/test/ffmpeg_encoder_h264_test6_vf.mp4", ExportFormat::H264_AAC, true, false, false, 23);
        encoder.go ();
 }
@@ -338,7 +338,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_3d_dcp_to_h264)
        auto dcp = make_shared<DCPContent>(TestPaths::private_data() / "xm");
        auto film2 = new_test_film2 ("ffmpeg_encoder_3d_dcp_to_h264_export", {dcp});
 
        auto dcp = make_shared<DCPContent>(TestPaths::private_data() / "xm");
        auto film2 = new_test_film2 ("ffmpeg_encoder_3d_dcp_to_h264_export", {dcp});
 
-       auto job = make_shared<TranscodeJob> (film2);
+       auto job = make_shared<TranscodeJob>(film2, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film2, job, "build/test/ffmpeg_encoder_3d_dcp_to_h264.mp4", ExportFormat::H264_AAC, true, false, false, 23);
        encoder.go ();
 }
        FFmpegEncoder encoder (film2, job, "build/test/ffmpeg_encoder_3d_dcp_to_h264.mp4", ExportFormat::H264_AAC, true, false, false, 23);
        encoder.go ();
 }
@@ -360,7 +360,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test7)
        auto dcp = make_shared<DCPContent>(film->dir(film->dcp_name()));
        auto film2 = new_test_film2 ("ffmpeg_encoder_h264_test7_export", {dcp});
 
        auto dcp = make_shared<DCPContent>(film->dir(film->dcp_name()));
        auto film2 = new_test_film2 ("ffmpeg_encoder_h264_test7_export", {dcp});
 
-       auto job = make_shared<TranscodeJob> (film2);
+       auto job = make_shared<TranscodeJob> (film2, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film2, job, "build/test/ffmpeg_encoder_h264_test7.mp4", ExportFormat::H264_AAC, true, false, false, 23);
        encoder.go ();
 }
        FFmpegEncoder encoder (film2, job, "build/test/ffmpeg_encoder_h264_test7.mp4", ExportFormat::H264_AAC, true, false, false, 23);
        encoder.go ();
 }
@@ -369,12 +369,12 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test7)
 /** Stereo project with mixdown-to-stereo set */
 BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test8)
 {
 /** Stereo project with mixdown-to-stereo set */
 BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test8)
 {
-       shared_ptr<Film> film = new_test_film2("ffmpeg_encoder_h264_test4");
-       film->examine_and_add_content(shared_ptr<DCPContent>(new DCPContent("test/data/scope_dcp")));
+       auto film = new_test_film2("ffmpeg_encoder_h264_test4");
+       film->examine_and_add_content(make_shared<DCPContent>("test/data/scope_dcp"));
        BOOST_REQUIRE(!wait_for_jobs());
        film->set_audio_channels (2);
 
        BOOST_REQUIRE(!wait_for_jobs());
        film->set_audio_channels (2);
 
-       shared_ptr<Job> job(new TranscodeJob(film));
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder(film, job, "build/test/ffmpeg_encoder_h264_test8.mp4", ExportFormat::H264_AAC, true, false, false, 23);
        encoder.go();
 }
        FFmpegEncoder encoder(film, job, "build/test/ffmpeg_encoder_h264_test8.mp4", ExportFormat::H264_AAC, true, false, false, 23);
        encoder.go();
 }
@@ -385,7 +385,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test9)
 {
        shared_ptr<Film> film = new_test_film ("ffmpeg_encoder_prores_test9");
        film->set_name ("ffmpeg_encoder_prores_test9");
 {
        shared_ptr<Film> film = new_test_film ("ffmpeg_encoder_prores_test9");
        film->set_name ("ffmpeg_encoder_prores_test9");
-       shared_ptr<ImageContent> c (new ImageContent(TestPaths::private_data() / "bbc405.png"));
+       auto c = make_shared<ImageContent>(TestPaths::private_data() / "bbc405.png");
        film->set_container (Ratio::from_id ("185"));
        film->set_audio_channels (12);
 
        film->set_container (Ratio::from_id ("185"));
        film->set_audio_channels (12);
 
@@ -395,7 +395,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test9)
        c->video->set_length (240);
 
        film->write_metadata ();
        c->video->set_length (240);
 
        film->write_metadata ();
-       shared_ptr<Job> job (new TranscodeJob (film));
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_test9.mov", ExportFormat::H264_AAC, false, false, false, 23);
        encoder.go ();
 }
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_test9.mov", ExportFormat::H264_AAC, false, false, false, 23);
        encoder.go ();
 }
@@ -410,7 +410,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_prores_from_dcp_with_crop)
        dcp->video->set_right_crop (32);
        film->write_metadata ();
 
        dcp->video->set_right_crop (32);
        film->write_metadata ();
 
-       auto job = make_shared<TranscodeJob>(film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_from_dcp_with_crop.mov", ExportFormat::PRORES, false, false, false, 23);
        encoder.go ();
 }
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_from_dcp_with_crop.mov", ExportFormat::PRORES, false, false, false, 23);
        encoder.go ();
 }
@@ -425,7 +425,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_from_dcp_with_crop)
        dcp->video->set_right_crop (32);
        film->write_metadata ();
 
        dcp->video->set_right_crop (32);
        film->write_metadata ();
 
-       auto job = make_shared<TranscodeJob>(film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_from_dcp_with_crop.mov", ExportFormat::H264_AAC, false, false, false, 23);
        encoder.go ();
 }
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_from_dcp_with_crop.mov", ExportFormat::H264_AAC, false, false, false, 23);
        encoder.go ();
 }
@@ -441,7 +441,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_with_reels)
        content1->video->set_length (240);
        content2->video->set_length (240);
 
        content1->video->set_length (240);
        content2->video->set_length (240);
 
-       auto job = make_shared<TranscodeJob>(film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_h264_with_reels.mov", ExportFormat::H264_AAC, false, true, false, 23);
        encoder.go ();
 
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_h264_with_reels.mov", ExportFormat::H264_AAC, false, true, false, 23);
        encoder.go ();
 
@@ -463,7 +463,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_prores_regression_1)
        auto content = content_factory(TestPaths::private_data() / "arrietty_JP-EN.mkv").front();
        auto film = new_test_film2 ("ffmpeg_encoder_prores_regression_1", { content });
 
        auto content = content_factory(TestPaths::private_data() / "arrietty_JP-EN.mkv").front();
        auto film = new_test_film2 ("ffmpeg_encoder_prores_regression_1", { content });
 
-       auto job = make_shared<TranscodeJob>(film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_regression_1.mov", ExportFormat::PRORES, false, true, false, 23);
        encoder.go ();
 }
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_regression_1.mov", ExportFormat::PRORES, false, true, false, 23);
        encoder.go ();
 }
@@ -478,7 +478,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_prores_regression_2)
        auto content = content_factory(TestPaths::private_data() / "tge_clip.mkv").front();
        auto film = new_test_film2 ("ffmpeg_encoder_prores_regression_2", { content });
 
        auto content = content_factory(TestPaths::private_data() / "tge_clip.mkv").front();
        auto film = new_test_film2 ("ffmpeg_encoder_prores_regression_2", { content });
 
-       auto job = make_shared<TranscodeJob>(film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_regression_2.mov", ExportFormat::PRORES, false, true, false, 23);
        encoder.go ();
 
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_regression_2.mov", ExportFormat::PRORES, false, true, false, 23);
        encoder.go ();
 
index bc90dab4294b66369f679e231a7b051a7fb2a587..5b76e67d357d44b347d4b347fdff954eb4e2f0c3 100644 (file)
@@ -54,7 +54,7 @@ BOOST_AUTO_TEST_CASE (interrupt_encoder_test)
        film->examine_and_add_content (content);
        BOOST_REQUIRE (!wait_for_jobs());
 
        film->examine_and_add_content (content);
        BOOST_REQUIRE (!wait_for_jobs());
 
-       film->make_dcp ();
+       film->make_dcp (TranscodeJob::ChangedBehaviour::IGNORE);
 
        dcpomatic_sleep_seconds (10);
 
 
        dcpomatic_sleep_seconds (10);
 
index 5bb119f463965ec81d6fe204ba8b0cde17acf685..db974d38463cb452148416fb81b6063b341e409e 100644 (file)
@@ -564,7 +564,7 @@ BOOST_AUTO_TEST_CASE (reels_should_not_be_short4)
        BOOST_CHECK (film->reels().front() == dcpomatic::DCPTimePeriod(dcpomatic::DCPTime(), dcpomatic::DCPTime::from_frames(263, 24)));
 
        film->write_metadata ();
        BOOST_CHECK (film->reels().front() == dcpomatic::DCPTimePeriod(dcpomatic::DCPTime(), dcpomatic::DCPTime::from_frames(263, 24)));
 
        film->write_metadata ();
-       film->make_dcp ();
+       film->make_dcp (TranscodeJob::ChangedBehaviour::IGNORE);
        BOOST_REQUIRE (!wait_for_jobs());
 
        vector<boost::filesystem::path> dirs = { film->dir(film->dcp_name(false)) };
        BOOST_REQUIRE (!wait_for_jobs());
 
        vector<boost::filesystem::path> dirs = { film->dir(film->dcp_name(false)) };
index c63dd132a1d7a446c3757a2d79f82ae298c7cf2b..4ea709c81912f08d7fdeb4311fc3609314c731a0 100644 (file)
@@ -893,7 +893,7 @@ void
 make_and_verify_dcp (shared_ptr<Film> film, vector<dcp::VerificationNote::Code> ignore)
 {
        film->write_metadata ();
 make_and_verify_dcp (shared_ptr<Film> film, vector<dcp::VerificationNote::Code> ignore)
 {
        film->write_metadata ();
-       film->make_dcp ();
+       film->make_dcp (TranscodeJob::ChangedBehaviour::IGNORE);
        BOOST_REQUIRE (!wait_for_jobs());
        auto notes = dcp::verify ({film->dir(film->dcp_name())}, &stage, &progress, TestPaths::xsd());
        bool ok = true;
        BOOST_REQUIRE (!wait_for_jobs());
        auto notes = dcp::verify ({film->dir(film->dcp_name())}, &stage, &progress, TestPaths::xsd());
        bool ok = true;
index 0c8632251a12743cb482ad51fb2d2220955d9eef..bceb6700fe1d7bad834626dba3ea5569e1b73f1f 100644 (file)
@@ -186,7 +186,7 @@ BOOST_AUTO_TEST_CASE (threed_test7)
        c->video->set_length (24);
 
        film->set_three_d (true);
        c->video->set_length (24);
 
        film->set_three_d (true);
-       film->make_dcp ();
+       film->make_dcp (TranscodeJob::ChangedBehaviour::IGNORE);
        film->write_metadata ();
 
        auto jm = JobManager::instance ();
        film->write_metadata ();
 
        auto jm = JobManager::instance ();
index ada9b602a3089ac5bfdc47e5f736ae1e5b374017..4483e22d529b7b672f5ea6c0f6c7480e375e2303 100644 (file)
@@ -406,7 +406,7 @@ static
 pair<int, int>
 V_movie_range (shared_ptr<Film> film)
 {
 pair<int, int>
 V_movie_range (shared_ptr<Film> film)
 {
-       auto job = make_shared<TranscodeJob>(film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        job->set_encoder (
                make_shared<FFmpegEncoder>(film, job, film->file("export.mov"), ExportFormat::PRORES, true, false, false, 23)
                );
        job->set_encoder (
                make_shared<FFmpegEncoder>(film, job, film->file("export.mov"), ExportFormat::PRORES, true, false, false, 23)
                );