Fix font_id_map errors when importing DCP subtitles that have no
[dcpomatic.git] / src / lib / hints.cc
index fe2e5889cf1ae7625232e42769bd8b1882e3a4b3..46296351be71e899a6ffdbc4a29972d9c3e52309 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2016-2021 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2016-2022 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 #include "audio_content.h"
 #include "audio_processor.h"
 #include "compose.hpp"
+#include "config.h"
 #include "content.h"
 #include "cross.h"
 #include "dcp_content_type.h"
 #include "film.h"
 #include "font.h"
-#include "font_data.h"
 #include "hints.h"
+#include "maths_util.h"
 #include "player.h"
 #include "ratio.h"
 #include "text_content.h"
 #include "types.h"
-#include "util.h"
 #include "video_content.h"
 #include "writer.h"
 #include <dcp/cpl.h>
 using std::cout;
 using std::make_shared;
 using std::max;
-using std::min;
-using std::pair;
 using std::shared_ptr;
 using std::string;
-using std::vector;
 using std::weak_ptr;
 using boost::optional;
 using boost::bind;
@@ -384,6 +381,7 @@ try
 
        auto content = film->content ();
 
+       check_certificates ();
        check_interop ();
        check_big_font_files ();
        check_few_audio_channels ();
@@ -400,6 +398,7 @@ try
        check_ffec_and_ffmc_in_smpte_feature ();
        check_out_of_range_markers ();
        check_text_languages ();
+       check_audio_language ();
 
        if (check_loudness_done) {
                emit (bind(boost::ref(Progress), _("Examining subtitles and closed captions")));
@@ -407,9 +406,9 @@ try
                emit (bind(boost::ref(Progress), _("Examining audio, subtitles and closed captions")));
        }
 
-       auto player = make_shared<Player>(film);
+       auto player = make_shared<Player>(film, Image::Alignment::COMPACT);
        player->set_ignore_video ();
-       if (check_loudness_done) {
+       if (check_loudness_done || _disable_audio_analysis) {
                /* We don't need to analyse audio because we already loaded a suitable analysis */
                player->set_ignore_audio ();
        }
@@ -419,6 +418,8 @@ try
        struct timeval last_pulse;
        gettimeofday (&last_pulse, 0);
 
+       _writer->write (player->get_subtitle_fonts());
+
        while (!player->pass()) {
 
                struct timeval now;
@@ -438,7 +439,6 @@ try
                check_loudness ();
        }
 
-       _writer->write (player->get_subtitle_fonts());
 
        if (_long_subtitle && !_very_long_subtitle) {
                hint (_("At least one of your subtitle lines has more than 52 characters.  It is recommended to make each line 52 characters at most in length."));
@@ -637,3 +637,48 @@ Hints::check_text_languages ()
                }
        }
 }
+
+
+void
+Hints::check_audio_language ()
+{
+       auto content = film()->content();
+       auto mapped_audio =
+               std::find_if(content.begin(), content.end(), [](shared_ptr<const Content> c) {
+                       return c->audio && !c->audio->mapping().mapped_output_channels().empty();
+               });
+
+       if (mapped_audio != content.end() && !film()->audio_language()) {
+               hint (_("Some of your content has audio but you have not set the audio language.  It is advisable to set the audio language "
+                       "in the \"DCP\" tab unless your audio has no spoken parts."));
+       }
+}
+
+
+void
+Hints::check_certificates ()
+{
+       auto bad = Config::instance()->check_certificates();
+       if (!bad) {
+               return;
+       }
+
+       switch (*bad) {
+       case Config::BAD_SIGNER_UTF8_STRINGS:
+               hint(_("The certificate chain that DCP-o-matic uses for signing DCPs and KDMs contains a small error "
+                      "which will prevent DCPs from being validated correctly on some systems.  You are advised to "
+                      "re-create the signing certificate chain by clicking the \"Re-make certificates and key...\" "
+                      "button in the Keys page of Preferences."));
+               break;
+       case Config::BAD_SIGNER_VALIDITY_TOO_LONG:
+               hint(_("The certificate chain that DCP-o-matic uses for signing DCPs and KDMs has a validity period "
+                      "that is too long.  This will cause problems playing back DCPs on some systems. "
+                      "You are advised to re-create the signing certificate chain by clicking the "
+                      "\"Re-make certificates and key...\" button in the Keys page of Preferences."));
+               break;
+       default:
+               /* Some bad situations can't happen here as DCP-o-matic would have refused to start until they are fixed */
+               break;
+       }
+}
+