X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fhints.cc;h=eb3cc73aaf281508e327c63480e2161888561949;hb=45c410c9ae0b1627d5b169646931d623d1cb0f8c;hp=bf0f440961c313a39a776e8f2f68661e0fc18fc6;hpb=09d5906f44907aab5afb41ce2da887550c0011a8;p=dcpomatic.git diff --git a/src/lib/hints.cc b/src/lib/hints.cc index bf0f44096..eb3cc73aa 100644 --- a/src/lib/hints.cc +++ b/src/lib/hints.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Carl Hetherington + Copyright (C) 2016-2017 Carl Hetherington This file is part of DCP-o-matic. @@ -28,14 +28,20 @@ #include "ratio.h" #include "audio_analysis.h" #include "compose.hpp" +#include "util.h" +#include #include #include +#include #include "i18n.h" using std::vector; using std::string; +using std::pair; +using std::min; using std::max; +using std::cout; using boost::shared_ptr; using boost::optional; @@ -83,16 +89,18 @@ get_hints (shared_ptr film) } } - if (scope && !flat_or_narrower && film->container()->id() == "185") { + string const film_container = film->container()->id(); + + if (scope && !flat_or_narrower && film_container == "185") { hints.push_back (_("All of your content is in Scope (2.39:1) but your DCP's container is Flat (1.85:1). This will letter-box your content inside a Flat (1.85:1) frame. You may prefer to set your DCP's container to Scope (2.39:1) in the \"DCP\" tab.")); } - if (!scope && flat_or_narrower && film->container()->id() == "239") { + if (!scope && flat_or_narrower && film_container == "239") { hints.push_back (_("All of your content is at 1.85:1 or narrower but your DCP's container is Scope (2.39:1). This will pillar-box your content inside a Flat (1.85:1) frame. You may prefer to set your DCP's container to Flat (1.85:1) in the \"DCP\" tab.")); } - if (film->video_frame_rate() != 24 && film->video_frame_rate() != 48) { - hints.push_back (String::compose (_("Your DCP frame rate (%1 fps) may cause problems in a few (mostly older) projectors. Use 24 or 48 frames per second to be on the safe side."), film->video_frame_rate())); + if (film_container != "185" && film_container != "239" && film_container != "full-frame") { + hints.push_back (_("Your DCP uses an unusual container ratio. This may cause problems on some projectors. If possible, use Flat or Scope for the DCP container ratio")); } if (film->j2k_bandwidth() >= 245000000) { @@ -100,7 +108,23 @@ get_hints (shared_ptr film) } if (film->interop() && film->video_frame_rate() != 24 && film->video_frame_rate() != 48) { - hints.push_back (_("You are set up for an Interop DCP at a frame rate which is not officially supported. You are advised to make a SMPTE DCP instead.")); + string base = _("You are set up for an Interop DCP at a frame rate which is not officially supported. You are advised either to change the frame rate of your DCP or to make a SMPTE DCP instead."); + base += " "; + pair range24 = film->speed_up_range (24); + pair range48 = film->speed_up_range (48); + pair range (max (range24.first, range48.first), min (range24.second, range48.second)); + string h; + if (range.second > (29.0/24)) { + h = base; + h += _("However, setting your DCP frame rate to 24 or 48 will cause a significant speed-up of your content, and SMPTE DCPs are not supported by all projectors."); + } else if (range.first < (24.0/29)) { + h = base; + h += _("However, setting your DCP frame rate to 24 or 48 will cause a significant slowdown of your content, and SMPTE DCPs are not supported by all projectors."); + } else { + h = _("You are set up for an Interop DCP at a frame rate which is not officially supported. You are advised either to change the frame rate of your DCP or to make a SMPTE DCP instead (although SMPTE DCPs are not supported by all projectors)."); + } + + hints.push_back (h); } int vob = 0; @@ -127,15 +151,36 @@ get_hints (shared_ptr film) boost::filesystem::path path = film->audio_analysis_path (film->playlist ()); if (boost::filesystem::exists (path)) { - shared_ptr an (new AudioAnalysis (path)); - if (an->sample_peak() || an->true_peak()) { - float const peak = max (an->sample_peak().get_value_or(0), an->true_peak().get_value_or(0)); - float const peak_dB = 20 * log10 (peak) + an->gain_correction (film->playlist ()); - if (peak_dB > -3 && peak_dB < -0.5) { - hints.push_back (_("Your audio level is very high. You should reduce the gain of your audio content.")); - } else if (peak_dB > -0.5) { - hints.push_back (_("Your audio level is very close to clipping. You should reduce the gain of your audio content.")); + try { + shared_ptr an (new AudioAnalysis (path)); + + string ch; + + vector sample_peak = an->sample_peak (); + vector true_peak = an->true_peak (); + + for (size_t i = 0; i < sample_peak.size(); ++i) { + float const peak = max (sample_peak[i].peak, true_peak.empty() ? 0 : true_peak[i]); + float const peak_dB = 20 * log10 (peak) + an->gain_correction (film->playlist ()); + if (peak_dB > -3) { + ch += dcp::raw_convert (short_audio_channel_name (i)) + ", "; + } + } + + ch = ch.substr (0, ch.length() - 2); + + if (!ch.empty ()) { + hints.push_back ( + String::compose ( + _("Your audio level is very high (on %1). You should reduce the gain of your audio content."), + ch + ) + ); } + } catch (OldFormatError& e) { + /* The audio analysis is too old to load in; just skip this hint as if + it had never been run. + */ } }