summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2019-10-14 11:24:48 +0200
committerCarl Hetherington <cth@carlh.net>2019-10-14 11:24:48 +0200
commit96f7dd41a2c8627bc1ea0d24d84142eb04b4ffef (patch)
tree27c4f6a5355a0496e960e1769632d00c41ad4816 /src/lib
parent95bd2d068f67f7c0e611c720c95bfd6781329d86 (diff)
parenta9dde34b8772ef8b985af067e2ff709be4e3cab6 (diff)
Merge branch 'v2.15.x' of ssh://localhost:2222/home/carl/git/dcpomatic into v2.15.x
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/audio_processor.cc17
-rw-r--r--src/lib/audio_processor.h2
-rw-r--r--src/lib/config.cc4
-rw-r--r--src/lib/config.h11
-rw-r--r--src/lib/dcp_decoder.cc39
-rw-r--r--src/lib/dcp_decoder.h7
-rw-r--r--src/lib/film.cc8
-rw-r--r--src/lib/hints.cc2
-rw-r--r--src/lib/player.h1
9 files changed, 79 insertions, 12 deletions
diff --git a/src/lib/audio_processor.cc b/src/lib/audio_processor.cc
index 0d3f2b6d7..6cccbdc80 100644
--- a/src/lib/audio_processor.cc
+++ b/src/lib/audio_processor.cc
@@ -22,16 +22,21 @@
#include "mid_side_decoder.h"
#include "upmixer_a.h"
#include "upmixer_b.h"
+#include "config.h"
using std::string;
using std::list;
list<AudioProcessor const *> AudioProcessor::_all;
+list<AudioProcessor const *> AudioProcessor::_non_experimental;
void
AudioProcessor::setup_audio_processors ()
{
- _all.push_back (new MidSideDecoder ());
+ AudioProcessor* mid_side = new MidSideDecoder ();
+ _all.push_back (mid_side);
+ _non_experimental.push_back (mid_side);
+
_all.push_back (new UpmixerA (48000));
_all.push_back (new UpmixerB (48000));
}
@@ -49,6 +54,16 @@ AudioProcessor::from_id (string id)
}
list<AudioProcessor const *>
+AudioProcessor::visible ()
+{
+ if (Config::instance()->show_experimental_audio_processors()) {
+ return _all;
+ }
+
+ return _non_experimental;
+}
+
+list<AudioProcessor const *>
AudioProcessor::all ()
{
return _all;
diff --git a/src/lib/audio_processor.h b/src/lib/audio_processor.h
index e10df254c..78a3efb58 100644
--- a/src/lib/audio_processor.h
+++ b/src/lib/audio_processor.h
@@ -61,11 +61,13 @@ public:
virtual std::vector<std::string> input_names () const = 0;
static std::list<AudioProcessor const *> all ();
+ static std::list<AudioProcessor const *> visible ();
static void setup_audio_processors ();
static AudioProcessor const * from_id (std::string);
private:
static std::list<AudioProcessor const *> _all;
+ static std::list<AudioProcessor const *> _non_experimental;
};
#endif
diff --git a/src/lib/config.cc b/src/lib/config.cc
index 1d2ef1e40..581620f83 100644
--- a/src/lib/config.cc
+++ b/src/lib/config.cc
@@ -94,6 +94,7 @@ Config::set_defaults ()
_tms_password = "";
_allow_any_dcp_frame_rate = false;
_allow_any_container = false;
+ _show_experimental_audio_processors = false;
_language = optional<string> ();
_default_still_length = 10;
_default_container = Ratio::from_id ("185");
@@ -384,6 +385,7 @@ try
_maximum_j2k_bandwidth = f.optional_number_child<int> ("MaximumJ2KBandwidth").get_value_or (250000000);
_allow_any_dcp_frame_rate = f.optional_bool_child ("AllowAnyDCPFrameRate").get_value_or (false);
_allow_any_container = f.optional_bool_child ("AllowAnyContainer").get_value_or (false);
+ _show_experimental_audio_processors = f.optional_bool_child ("ShowExperimentalAudioProcessors").get_value_or (false);
_log_types = f.optional_number_child<int> ("LogTypes").get_value_or (LogEntry::TYPE_GENERAL | LogEntry::TYPE_WARNING | LogEntry::TYPE_ERROR);
_analyse_ebur128 = f.optional_bool_child("AnalyseEBUR128").get_value_or (true);
@@ -801,6 +803,8 @@ Config::write_config () const
root->add_child("AllowAnyDCPFrameRate")->add_child_text (_allow_any_dcp_frame_rate ? "1" : "0");
/* [XML] AllowAnyContainer 1 to allow users to user any container ratio for their DCP, 0 to limit the GUI to standard containers. */
root->add_child("AllowAnyContainer")->add_child_text (_allow_any_container ? "1" : "0");
+ /* [XML] ShowExperimentalAudioProcessors 1 to offer users the (experimental) audio upmixer processors, 0 to hide them */
+ root->add_child("ShowExperimentalAudioProcessors")->add_child_text (_show_experimental_audio_processors ? "1" : "0");
/* [XML] LogTypes Types of logging to write; a bitfield where 1 is general notes, 2 warnings, 4 errors, 8 debug information related
to encoding, 16 debug information related to encoding, 32 debug information for timing purposes, 64 debug information related
to sending email.
diff --git a/src/lib/config.h b/src/lib/config.h
index 9a57b1b48..ff7a0fe39 100644
--- a/src/lib/config.h
+++ b/src/lib/config.h
@@ -82,6 +82,7 @@ public:
PLAYER_PLAYLIST_DIRECTORY,
PLAYER_DEBUG_LOG,
HISTORY,
+ SHOW_EXPERIMENTAL_AUDIO_PROCESSORS,
#ifdef DCPOMATIC_VARIANT_SWAROOP
PLAYER_BACKGROUND_IMAGE,
#endif
@@ -157,6 +158,10 @@ public:
return _allow_any_container;
}
+ bool show_experimental_audio_processors () const {
+ return _show_experimental_audio_processors;
+ }
+
ISDCFMetadata default_isdcf_metadata () const {
return _default_isdcf_metadata;
}
@@ -620,6 +625,10 @@ public:
maybe_set (_allow_any_container, a);
}
+ void set_show_experimental_audio_processors (bool e) {
+ maybe_set (_show_experimental_audio_processors, e, SHOW_EXPERIMENTAL_AUDIO_PROCESSORS);
+ }
+
void set_default_isdcf_metadata (ISDCFMetadata d) {
maybe_set (_default_isdcf_metadata, d);
}
@@ -1177,6 +1186,8 @@ private:
https://www.dcpomatic.com/forum/viewtopic.php?f=2&t=1119&p=4468
*/
bool _allow_any_container;
+ /** Offer the upmixers in the audio processor settings */
+ bool _show_experimental_audio_processors;
/** Default ISDCF metadata for newly-created Films */
ISDCFMetadata _default_isdcf_metadata;
boost::optional<std::string> _language;
diff --git a/src/lib/dcp_decoder.cc b/src/lib/dcp_decoder.cc
index 95cad9266..4b189189e 100644
--- a/src/lib/dcp_decoder.cc
+++ b/src/lib/dcp_decoder.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2014-2018 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2014-2019 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
@@ -28,6 +28,7 @@
#include "ffmpeg_image_proxy.h"
#include "image.h"
#include "config.h"
+#include "digester.h"
#include <dcp/dcp.h>
#include <dcp/cpl.h>
#include <dcp/reel.h>
@@ -52,6 +53,7 @@
using std::list;
using std::cout;
+using std::string;
using boost::shared_ptr;
using boost::dynamic_pointer_cast;
using boost::optional;
@@ -75,16 +77,18 @@ DCPDecoder::DCPDecoder (shared_ptr<const Film> film, shared_ptr<const DCPContent
}
}
- if (old) {
- _reels = old->_reels;
+ /* We try to avoid re-scanning the DCP's files every time we make a new DCPDecoder; we do this
+ by re-using the _reels list. Before we do this we need to check that nothing too serious
+ has changed in the DCPContent.
- /* We might have gained a KDM since we made the Reel objects */
- if (_dcp_content->kdm ()) {
- dcp::DecryptedKDM k = decrypted_kdm ();
- BOOST_FOREACH (shared_ptr<dcp::Reel> i, _reels) {
- i->add (k);
- }
- }
+ We do this by storing a digest of the important bits of the DCPContent and then checking that's
+ the same before we re-use _reels.
+ */
+
+ _lazy_digest = calculate_lazy_digest (c);
+
+ if (old && old->lazy_digest() == _lazy_digest) {
+ _reels = old->_reels;
} else {
list<shared_ptr<dcp::CPL> > cpl_list = cpls ();
@@ -425,3 +429,18 @@ DCPDecoder::set_forced_reduction (optional<int> reduction)
{
_forced_reduction = reduction;
}
+
+string
+DCPDecoder::calculate_lazy_digest (shared_ptr<const DCPContent> c) const
+{
+ Digester d;
+ BOOST_FOREACH (boost::filesystem::path i, c->paths()) {
+ d.add (i.string());
+ }
+ d.add (static_cast<bool>(_dcp_content->kdm()));
+ d.add (static_cast<bool>(c->cpl()));
+ if (c->cpl()) {
+ d.add (c->cpl().get());
+ }
+ return d.get ();
+}
diff --git a/src/lib/dcp_decoder.h b/src/lib/dcp_decoder.h
index 2e63b24a2..496d95740 100644
--- a/src/lib/dcp_decoder.h
+++ b/src/lib/dcp_decoder.h
@@ -58,6 +58,10 @@ public:
bool pass ();
void seek (dcpomatic::ContentTime t, bool accurate);
+ std::string lazy_digest () const {
+ return _lazy_digest;
+ }
+
private:
friend struct dcp_subtitle_within_dcp_test;
@@ -72,6 +76,7 @@ private:
boost::shared_ptr<TextDecoder> decoder,
dcp::Size size
);
+ std::string calculate_lazy_digest (boost::shared_ptr<const DCPContent>) const;
/** Time of next thing to return from pass relative to the start of _reel */
dcpomatic::ContentTime _next;
@@ -89,4 +94,6 @@ private:
bool _decode_referenced;
boost::optional<int> _forced_reduction;
+
+ std::string _lazy_digest;
};
diff --git a/src/lib/film.cc b/src/lib/film.cc
index e85543b80..93459661b 100644
--- a/src/lib/film.cc
+++ b/src/lib/film.cc
@@ -93,6 +93,7 @@ using std::copy;
using std::back_inserter;
using std::map;
using std::exception;
+using std::find;
using boost::shared_ptr;
using boost::weak_ptr;
using boost::dynamic_pointer_cast;
@@ -542,6 +543,13 @@ Film::read_metadata (optional<boost::filesystem::path> path)
_audio_processor = 0;
}
+ if (_audio_processor && !Config::instance()->show_experimental_audio_processors()) {
+ list<AudioProcessor const *> ap = AudioProcessor::visible();
+ if (find(ap.begin(), ap.end(), _audio_processor) == ap.end()) {
+ Config::instance()->set_show_experimental_audio_processors(true);
+ }
+ }
+
_reel_type = static_cast<ReelType> (f.optional_number_child<int>("ReelType").get_value_or (static_cast<int>(REELTYPE_SINGLE)));
_reel_length = f.optional_number_child<int64_t>("ReelLength").get_value_or (2000000000);
_upload_after_make_dcp = f.optional_bool_child("UploadAfterMakeDCP").get_value_or (false);
diff --git a/src/lib/hints.cc b/src/lib/hints.cc
index a9b9d6f54..ad81e8d59 100644
--- a/src/lib/hints.cc
+++ b/src/lib/hints.cc
@@ -117,7 +117,7 @@ Hints::thread ()
}
if (film->audio_channels() < 6) {
- hint (_("Your DCP has fewer than 6 audio channels. This may cause problems on some projectors."));
+ hint (_("Your DCP has fewer than 6 audio channels. This may cause problems on some projectors. You may want to set the DCP to have 6 channels. It does not matter if your content has fewer channels, as DCP-o-matic will fill the extras with silence."));
}
AudioProcessor const * ap = film->audio_processor();
diff --git a/src/lib/player.h b/src/lib/player.h
index 7558f6da0..e99c345bb 100644
--- a/src/lib/player.h
+++ b/src/lib/player.h
@@ -110,6 +110,7 @@ private:
friend struct player_subframe_test;
friend struct empty_test1;
friend struct empty_test2;
+ friend struct check_reuse_old_data_test;
void setup_pieces ();
void setup_pieces_unlocked ();