X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fhints.cc;h=eb3ea1d02c542752e277aff62f3258d4c6e2a475;hb=27b83475435dda4e84a90cf59a52f150905c4ab1;hp=d196b7ddb088c4509cd93575da3bda4e8bd69b7b;hpb=54038beb4437c027e584fc95110f6fd4dbf2207d;p=dcpomatic.git diff --git a/src/lib/hints.cc b/src/lib/hints.cc index d196b7ddb..eb3ea1d02 100644 --- a/src/lib/hints.cc +++ b/src/lib/hints.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Carl Hetherington + Copyright (C) 2016-2018 Carl Hetherington This file is part of DCP-o-matic. @@ -23,7 +23,8 @@ #include "film.h" #include "content.h" #include "video_content.h" -#include "subtitle_content.h" +#include "caption_content.h" +#include "audio_processor.h" #include "font.h" #include "ratio.h" #include "audio_analysis.h" @@ -32,12 +33,16 @@ #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; @@ -51,8 +56,8 @@ get_hints (shared_ptr film) bool big_font_files = false; if (film->interop ()) { BOOST_FOREACH (shared_ptr i, content) { - if (i->subtitle) { - BOOST_FOREACH (shared_ptr j, i->subtitle->fonts ()) { + if (i->caption) { + BOOST_FOREACH (shared_ptr j, i->caption->fonts ()) { for (int k = 0; k < FontFiles::VARIANTS; ++k) { optional const p = j->file (static_cast (k)); if (p && boost::filesystem::file_size (p.get()) >= (640 * 1024)) { @@ -72,6 +77,11 @@ get_hints (shared_ptr film) hints.push_back (_("Your DCP has fewer than 6 audio channels. This may cause problems on some projectors.")); } + AudioProcessor const * ap = film->audio_processor(); + if (ap && (ap->id() == "stereo-5.1-upmix-a" || ap->id() == "stereo-5.1-upmix-b")) { + hints.push_back (_("You are using DCP-o-matic's stereo-to-5.1 upmixer. This is experimental and may result in poor-quality audio. If you continue, you should listen to the resulting DCP in a cinema to make sure that it sounds good.")); + } + int flat_or_narrower = 0; int scope = 0; BOOST_FOREACH (shared_ptr i, content) { @@ -79,22 +89,24 @@ get_hints (shared_ptr film) Ratio const * r = i->video->scale().ratio (); if (r && r->id() == "239") { ++scope; - } else if (r && r->id() != "239" && r->id() != "full-frame") { + } else if (r && r->id() != "239" && r->id() != "190") { ++flat_or_narrower; } } } - 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 != "190") { + 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) { @@ -102,7 +114,47 @@ 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); + } + + optional lowest_speed_up; + optional highest_speed_up; + BOOST_FOREACH (shared_ptr i, content) { + double spu = film->active_frame_rate_change(i->position()).speed_up; + if (!lowest_speed_up || spu < *lowest_speed_up) { + lowest_speed_up = spu; + } + if (!highest_speed_up || spu > *highest_speed_up) { + highest_speed_up = spu; + } + } + + double worst_speed_up = 1; + if (highest_speed_up) { + worst_speed_up = *highest_speed_up; + } + if (lowest_speed_up) { + worst_speed_up = max (worst_speed_up, 1 / *lowest_speed_up); + } + + if (worst_speed_up > 25.5/24.0) { + hints.push_back (_("There is a large difference between the frame rate of your DCP and that of some of your content. This will cause your audio to play back at a much lower or higher pitch than it should. You are advised to set your DCP frame rate to one closer to your content, provided that your target projection systems support your chosen DCP rate.")); } int vob = 0; @@ -129,30 +181,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)); + try { + shared_ptr an (new AudioAnalysis (path)); - string ch; + string ch; - vector sample_peak = an->sample_peak (); - vector true_peak = an->true_peak (); + 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)) + ", "; + 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); + 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 - ) - ); + 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. + */ } }