Along the way this helps to fix #2942.
void
-AtmosMXFContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
+AtmosMXFContent::examine(shared_ptr<const Film> film, shared_ptr<Job> job, bool tolerant)
{
job->set_progress_unknown ();
- Content::examine (film, job);
+ Content::examine(film, job, tolerant);
auto a = make_shared<dcp::AtmosAsset>(path(0));
{
return std::dynamic_pointer_cast<const AtmosMXFContent> (Content::shared_from_this());
}
- void examine (std::shared_ptr<const Film> film, std::shared_ptr<Job> job) override;
+ void examine(std::shared_ptr<const Film> film, std::shared_ptr<Job> job, bool tolerant) override;
std::string summary () const override;
void as_xml(
if (!changed.empty()) {
for (auto i: changed) {
- JobManager::instance()->add(make_shared<ExamineContentJob>(_film, i));
+ JobManager::instance()->add(make_shared<ExamineContentJob>(_film, i, false));
}
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."));
}
void
-Content::examine (shared_ptr<const Film>, shared_ptr<Job> job)
+Content::examine(shared_ptr<const Film>, shared_ptr<Job> job, bool)
{
if (job) {
job->sub (_("Computing digest"));
/** Examine the content to establish digest, frame rates and any other
* useful metadata.
* @param job Job to use to report progress, or 0.
+ * @param tolerant true to try to carry on in the presence of problems with the content,
+ * false to throw exceptions in these cases.
*/
- virtual void examine (std::shared_ptr<const Film> film, std::shared_ptr<Job> job);
+ virtual void examine(std::shared_ptr<const Film> film, std::shared_ptr<Job> job, bool tolerant);
virtual void take_settings_from (std::shared_ptr<const Content> c);
/** @param film Film, or 0 */
void
-DCPContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
+DCPContent::examine(shared_ptr<const Film> film, shared_ptr<Job> job, bool tolerant)
{
bool const needed_assets = needs_assets ();
bool const needed_kdm = needs_kdm ();
if (job) {
job->set_progress_unknown ();
}
- Content::examine (film, job);
+ Content::examine(film, job, tolerant);
- auto examiner = make_shared<DCPExaminer>(shared_from_this(), film ? film->tolerant() : true);
+ auto examiner = make_shared<DCPExaminer>(shared_from_this(), tolerant);
if (examiner->has_video()) {
{
dcpomatic::DCPTime full_length (std::shared_ptr<const Film> film) const override;
dcpomatic::DCPTime approximate_length () const override;
- void examine (std::shared_ptr<const Film> film, std::shared_ptr<Job>) override;
+ void examine(std::shared_ptr<const Film> film, std::shared_ptr<Job>, bool tolerant) override;
std::string summary () const override;
std::string technical_summary () const override;
}
void
-DCPSubtitleContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
+DCPSubtitleContent::examine(shared_ptr<const Film> film, shared_ptr<Job> job, bool tolerant)
{
- Content::examine (film, job);
+ Content::examine(film, job, tolerant);
auto subtitle_asset = load(path(0));
DCPSubtitleContent (boost::filesystem::path);
DCPSubtitleContent (cxml::ConstNodePtr, boost::optional<boost::filesystem::path> film_directory, int);
- void examine (std::shared_ptr<const Film> film, std::shared_ptr<Job>) override;
+ void examine (std::shared_ptr<const Film> film, std::shared_ptr<Job>, bool tolerant) override;
std::string summary () const override;
std::string technical_summary () const override;
using std::shared_ptr;
-ExamineContentJob::ExamineContentJob (shared_ptr<const Film> film, shared_ptr<Content> c)
- : Job (film)
- , _content (c)
+ExamineContentJob::ExamineContentJob(shared_ptr<const Film> film, shared_ptr<Content> content, bool tolerant)
+ : Job(film)
+ , _content(content)
+ , _tolerant(tolerant)
{
}
void
ExamineContentJob::run ()
{
- _content->examine (_film, shared_from_this());
+ _content->examine(_film, shared_from_this(), _tolerant);
set_progress (1);
set_state (FINISHED_OK);
}
class ExamineContentJob : public Job
{
public:
- ExamineContentJob (std::shared_ptr<const Film>, std::shared_ptr<Content>);
+ ExamineContentJob(std::shared_ptr<const Film> film, std::shared_ptr<Content> content, bool tolerant);
~ExamineContentJob ();
std::string name () const override;
private:
std::shared_ptr<Content> _content;
+
+ bool _tolerant;
};
void
-FCPXMLContent::examine(shared_ptr<const Film> film, shared_ptr<Job> job)
+FCPXMLContent::examine(shared_ptr<const Film> film, shared_ptr<Job> job, bool tolerant)
{
- Content::examine(film, job);
+ Content::examine(film, job, tolerant);
auto sequence = dcpomatic::fcpxml::load(path(0));
return std::dynamic_pointer_cast<const FCPXMLContent>(Content::shared_from_this());
}
- void examine(std::shared_ptr<const Film> film, std::shared_ptr<Job>) override;
+ void examine(std::shared_ptr<const Film> film, std::shared_ptr<Job>, bool tolerant) override;
std::string summary() const override;
std::string technical_summary() const override;
void as_xml(xmlpp::Element*, bool with_paths, PathBehaviour path_behaviour, boost::optional<boost::filesystem::path> film_directory) const override;
void
-FFmpegContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
+FFmpegContent::examine(shared_ptr<const Film> film, shared_ptr<Job> job, bool tolerant)
{
ContentChangeSignaller cc1 (this, FFmpegContentProperty::SUBTITLE_STREAMS);
ContentChangeSignaller cc2 (this, FFmpegContentProperty::SUBTITLE_STREAM);
job->set_progress_unknown ();
}
- Content::examine (film, job);
+ Content::examine(film, job, tolerant);
auto examiner = make_shared<FFmpegExaminer>(shared_from_this (), job);
return std::dynamic_pointer_cast<const FFmpegContent> (Content::shared_from_this ());
}
- void examine (std::shared_ptr<const Film> film, std::shared_ptr<Job>) override;
+ void examine(std::shared_ptr<const Film> film, std::shared_ptr<Job>, bool tolerant) override;
void take_settings_from (std::shared_ptr<const Content> c) override;
std::string summary () const override;
std::string technical_summary () const override;
run_ffprobe (content->path(0), file("ffprobe.log"));
}
- auto j = make_shared<ExamineContentJob>(shared_from_this(), content);
+ auto j = make_shared<ExamineContentJob>(shared_from_this(), content, false);
_job_connections.push_back (
j->Finished.connect (bind (&Film::maybe_add_content, this, weak_ptr<Job>(j), weak_ptr<Content>(content), disable_audio_analysis))
void
-ImageContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
+ImageContent::examine(shared_ptr<const Film> film, shared_ptr<Job> job, bool tolerant)
{
if (_path_to_scan) {
job->sub (_("Scanning image files"));
set_paths (paths);
}
- Content::examine (film, job);
+ Content::examine(film, job, tolerant);
auto examiner = make_shared<ImageExaminer>(film, shared_from_this(), job);
video->take_from_examiner(film, examiner);
return std::dynamic_pointer_cast<const ImageContent> (Content::shared_from_this ());
};
- void examine (std::shared_ptr<const Film> film, std::shared_ptr<Job>) override;
+ void examine(std::shared_ptr<const Film> film, std::shared_ptr<Job>, bool tolerant) override;
std::string summary () const override;
std::string technical_summary () const override;
void
-StringTextFileContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
+StringTextFileContent::examine(shared_ptr<const Film> film, shared_ptr<Job> job, bool tolerant)
{
- Content::examine (film, job);
+ Content::examine(film, job, tolerant);
StringTextFile file (shared_from_this());
only_text()->clear_fonts();
return std::dynamic_pointer_cast<const StringTextFileContent> (Content::shared_from_this ());
}
- void examine (std::shared_ptr<const Film> film, std::shared_ptr<Job>) override;
+ void examine(std::shared_ptr<const Film> film, std::shared_ptr<Job>, bool tolerant) override;
std::string summary () const override;
std::string technical_summary () const override;
switch (_changed) {
case ChangedBehaviour::EXAMINE_THEN_STOP:
for (auto i: changed) {
- JobManager::instance()->add(make_shared<ExamineContentJob>(_film, i));
+ JobManager::instance()->add(make_shared<ExamineContentJob>(_film, i, false));
}
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."));
void
-VideoMXFContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
+VideoMXFContent::examine(shared_ptr<const Film> film, shared_ptr<Job> job, bool tolerant)
{
job->set_progress_unknown ();
- Content::examine (film, job);
+ Content::examine(film, job, tolerant);
video.reset (new VideoContent (this));
auto examiner = make_shared<VideoMXFExaminer>(shared_from_this());
return std::dynamic_pointer_cast<const VideoMXFContent>(Content::shared_from_this());
}
- void examine (std::shared_ptr<const Film> film, std::shared_ptr<Job> job) override;
+ void examine(std::shared_ptr<const Film> film, std::shared_ptr<Job> job, bool tolerant) override;
std::string summary () const override;
std::string technical_summary () const override;
std::string identifier () const override;
try {
_stress.set_suspended (true);
auto dcp = make_shared<DCPContent>(dir);
- auto job = make_shared<ExamineContentJob>(film, dcp);
+ auto job = make_shared<ExamineContentJob>(film, dcp, true);
auto add_dcp_to_film = [this](weak_ptr<Film> weak_film, weak_ptr<Job> weak_job, weak_ptr<Content> weak_content)
{
DCPOMATIC_ASSERT (_film);
auto dcp = dynamic_pointer_cast<DCPContent>(_film->content().front());
DCPOMATIC_ASSERT (dcp);
- dcp->examine (_film, shared_ptr<Job>());
+ dcp->examine(_film, {}, true);
/* Examining content re-creates the TextContent objects, so we must re-enable them */
for (auto i: dcp->text) {
auto dcp = std::dynamic_pointer_cast<DCPContent>(_film->content().front());
DCPOMATIC_ASSERT(dcp);
dcp->add_ov (wx_to_std(c->GetPath()));
- JobManager::instance()->add(make_shared<ExamineContentJob>(_film, dcp));
+ JobManager::instance()->add(make_shared<ExamineContentJob>(_film, dcp, true));
bool const ok = display_progress(variant::wx::dcpomatic_player(), _("Loading content"));
if (!ok || !report_errors_from_last_job(this)) {
return;
}
for (auto i: _content) {
- JobManager::instance()->add(make_shared<ExamineContentJob>(film, i));
+ JobManager::instance()->add(make_shared<ExamineContentJob>(film, i, false));
}
}
auto film = _film.lock ();
DCPOMATIC_ASSERT (film);
- JobManager::instance()->add (make_shared<ExamineContentJob>(film, dcp));
+ JobManager::instance()->add(make_shared<ExamineContentJob>(film, dcp, false));
}
void
dcp->add_ov(dialog.path());
auto film = _film.lock();
DCPOMATIC_ASSERT (film);
- JobManager::instance()->add (make_shared<ExamineContentJob>(film, dcp));
+ JobManager::instance()->add (make_shared<ExamineContentJob>(film, dcp, false));
}
}
auto film = _film.lock ();
DCPOMATIC_ASSERT (film);
- JobManager::instance()->add (make_shared<ExamineContentJob>(film, dcp));
+ JobManager::instance()->add(make_shared<ExamineContentJob>(film, dcp, false));
}
}
if (content) {
- auto job = make_shared<ExamineContentJob>(shared_ptr<Film>(), content);
+ auto job = make_shared<ExamineContentJob>(shared_ptr<Film>(), content, false);
jm->add (job);
jobs.push_back (job);
}
if (kdm) {
try {
dcp->add_kdm (*kdm);
- dcp->examine (_film, shared_ptr<Job>());
+ dcp->examine(_film, shared_ptr<Job>(), true);
} catch (KDMError& e) {
error_dialog(this, _("Could not load KDM."));
}
reels = decoder->reels();
vf_content->add_ov (ov->dir(ov->dcp_name(false)));
- JobManager::instance()->add (make_shared<ExamineContentJob>(test, vf_content));
+ JobManager::instance()->add(make_shared<ExamineContentJob>(test, vf_content, false));
BOOST_REQUIRE (!wait_for_jobs());
decoder = std::dynamic_pointer_cast<DCPDecoder>(player->_pieces.front()->decoder);
BOOST_REQUIRE (decoder);
reels = decoder->reels();
encrypted_content->add_kdm (kdm);
- JobManager::instance()->add (make_shared<ExamineContentJob>(test, encrypted_content));
+ JobManager::instance()->add(make_shared<ExamineContentJob>(test, encrypted_content, false));
BOOST_REQUIRE (!wait_for_jobs());
decoder = std::dynamic_pointer_cast<DCPDecoder>(player->_pieces.front()->decoder);
BOOST_REQUIRE (decoder);
auto dcp_content = make_shared<DCPContent>(film->dir(film->dcp_name()));
auto film2 = new_test_film("remake_id_test2_2", { dcp_content });
dcp_content->add_kdm(kdm);
- JobManager::instance()->add(make_shared<ExamineContentJob>(film2, dcp_content));
+ JobManager::instance()->add(make_shared<ExamineContentJob>(film2, dcp_content, false));
BOOST_REQUIRE(!wait_for_jobs());
make_and_verify_dcp (film2);
}
auto test = new_test_film(name + "_test", { vf_dcp });
vf_dcp->add_ov(ov->dir(ov->dcp_name(false)));
- JobManager::instance()->add(make_shared<ExamineContentJob>(test, vf_dcp));
+ JobManager::instance()->add(make_shared<ExamineContentJob>(test, vf_dcp, false));
BOOST_CHECK(!wait_for_jobs());
make_and_verify_dcp(