#include "util.h"
#include "job_manager.h"
#include "transcode_job.h"
-#include "scp_dcp_job.h"
+#include "upload_job.h"
#include "log.h"
#include "exceptions.h"
#include "examine_content_job.h"
#include "config.h"
#include "playlist.h"
-#include "player.h"
#include "dcp_content_type.h"
#include "ratio.h"
#include "cross.h"
-#include "cinema.h"
#include "safe_stringstream.h"
#include "environment_info.h"
#include "raw_convert.h"
#include "audio_processor.h"
#include "md5_digester.h"
+#include "compose.hpp"
+#include "screen.h"
#include <libcxml/cxml.h>
#include <dcp/cpl.h>
-#include <dcp/signer.h>
+#include <dcp/certificate_chain.h>
#include <dcp/util.h>
#include <dcp/local_time.h>
#include <dcp/decrypted_kdm.h>
#include <libxml++/libxml++.h>
#include <boost/filesystem.hpp>
#include <boost/algorithm/string.hpp>
-#include <boost/lexical_cast.hpp>
#include <boost/foreach.hpp>
#include <unistd.h>
#include <stdexcept>
#include <iostream>
#include <algorithm>
-#include <fstream>
#include <cstdlib>
#include <iomanip>
#include <set>
#include "i18n.h"
using std::string;
-using std::multimap;
using std::pair;
-using std::map;
using std::vector;
using std::setfill;
using std::min;
using std::max;
using std::make_pair;
-using std::endl;
using std::cout;
using std::list;
using std::set;
using boost::shared_ptr;
using boost::weak_ptr;
using boost::dynamic_pointer_cast;
-using boost::to_upper_copy;
-using boost::ends_with;
-using boost::starts_with;
using boost::optional;
using boost::is_any_of;
-using dcp::Size;
-using dcp::Signer;
#define LOG_GENERAL(...) log()->log (String::compose (__VA_ARGS__), Log::TYPE_GENERAL);
#define LOG_GENERAL_NC(...) log()->log (__VA_ARGS__, Log::TYPE_GENERAL);
}
boost::filesystem::path
-Film::audio_analysis_path () const
+Film::audio_analysis_path (shared_ptr<const Playlist> playlist) const
{
boost::filesystem::path p = dir ("analysis");
MD5Digester digester;
- BOOST_FOREACH (shared_ptr<Content> i, content ()) {
+ BOOST_FOREACH (shared_ptr<Content> i, playlist->content ()) {
shared_ptr<AudioContent> ac = dynamic_pointer_cast<AudioContent> (i);
if (!ac) {
continue;
digester.add (ac->digest ());
digester.add (ac->audio_mapping().digest ());
- digester.add (ac->audio_gain ());
+ if (playlist->content().size() != 1) {
+ /* Analyses should be considered equal regardless of gain
+ if they were made from just one piece of content. This
+ is because we can fake any gain change in a single-content
+ analysis at the plotting stage rather than having to
+ recompute it.
+ */
+ digester.add (ac->audio_gain ());
+ }
}
if (audio_processor ()) {
LOG_GENERAL ("Content: %1", i->technical_summary());
}
LOG_GENERAL ("DCP video rate %1 fps", video_frame_rate());
- LOG_GENERAL ("%1 threads", Config::instance()->num_local_encoding_threads());
+ if (Config::instance()->only_servers_encode ()) {
+ LOG_GENERAL_NC ("0 threads: ONLY SERVERS SET TO ENCODE");
+ } else {
+ LOG_GENERAL ("%1 threads", Config::instance()->num_local_encoding_threads());
+ }
LOG_GENERAL ("J2K bandwidth %1", j2k_bandwidth());
if (container() == 0) {
void
Film::send_dcp_to_tms ()
{
- shared_ptr<Job> j (new SCPDCPJob (shared_from_this()));
+ shared_ptr<Job> j (new UploadJob (shared_from_this()));
JobManager::instance()->add (j);
}
/* Split the raw name up into words */
vector<string> words;
- split (words, raw_name, is_any_of (" "));
+ split (words, raw_name, is_any_of (" _-"));
string fixed_name;
if (!dm.territory.empty ()) {
d << "_" << dm.territory;
- if (!dm.rating.empty ()) {
+ if (dm.rating.empty ()) {
+ d << "-NR";
+ } else {
d << "-" << dm.rating;
}
}
{
_three_d = t;
signal_changed (THREE_D);
+
+ if (_three_d && _isdcf_metadata.two_d_version_of_three_d) {
+ _isdcf_metadata.two_d_version_of_three_d = false;
+ signal_changed (ISDCF_METADATA);
+ }
}
void
void
Film::examine_and_add_content (shared_ptr<Content> c)
{
- if (dynamic_pointer_cast<FFmpegContent> (c)) {
+ if (dynamic_pointer_cast<FFmpegContent> (c) && !_directory.empty ()) {
run_ffprobe (c->path(0), file ("ffprobe.log"), _log);
}
shared_ptr<Job> j (new ExamineContentJob (shared_from_this(), c));
_job_connections.push_back (
- j->Finished.connect (bind (&Film::maybe_add_content, this, boost::weak_ptr<Job> (j), boost::weak_ptr<Content> (c)))
+ j->Finished.connect (bind (&Film::maybe_add_content, this, weak_ptr<Job> (j), weak_ptr<Content> (c)))
);
JobManager::instance()->add (j);
}
void
-Film::playlist_content_changed (boost::weak_ptr<Content> c, int p, bool frequent)
+Film::playlist_content_changed (weak_ptr<Content> c, int p, bool frequent)
{
+ _dirty = true;
+
if (p == VideoContentProperty::VIDEO_FRAME_RATE) {
set_video_frame_rate (_playlist->best_dcp_frame_rate ());
} else if (p == AudioContentProperty::AUDIO_STREAMS) {
int
Film::audio_frame_rate () const
{
- /* XXX */
+ BOOST_FOREACH (shared_ptr<Content> i, content ()) {
+ shared_ptr<AudioContent> a = dynamic_pointer_cast<AudioContent> (i);
+ if (a && a->has_rate_above_48k ()) {
+ return 96000;
+ }
+ }
+
return 48000;
}
) const
{
shared_ptr<const dcp::CPL> cpl (new dcp::CPL (cpl_file));
- shared_ptr<const dcp::Signer> signer = Config::instance()->signer();
+ shared_ptr<const dcp::CertificateChain> signer = Config::instance()->signer_chain ();
if (!signer->valid ()) {
throw InvalidSignerError ();
}