#include <libxml++/libxml++.h>
#include <libcxml/cxml.h>
#include "film.h"
-#include "container.h"
#include "job.h"
#include "filter.h"
#include "util.h"
#include "job_manager.h"
-#include "ab_transcode_job.h"
#include "transcode_job.h"
#include "scp_dcp_job.h"
#include "log.h"
#include "config.h"
#include "version.h"
#include "ui_signaller.h"
-#include "analyse_audio_job.h"
#include "playlist.h"
#include "player.h"
#include "ffmpeg_content.h"
#include "imagemagick_content.h"
#include "sndfile_content.h"
#include "dcp_content_type.h"
+#include "ratio.h"
+#include "cross.h"
#include "i18n.h"
using std::cout;
using std::list;
using boost::shared_ptr;
+using boost::weak_ptr;
using boost::lexical_cast;
using boost::dynamic_pointer_cast;
using boost::to_upper_copy;
, _dcp_content_type (Config::instance()->default_dcp_content_type ())
, _container (Config::instance()->default_container ())
, _scaler (Scaler::from_id ("bicubic"))
- , _ab (false)
, _with_subtitles (false)
, _subtitle_offset (0)
, _subtitle_scale (1)
, _colour_lut (0)
, _j2k_bandwidth (200000000)
, _dci_metadata (Config::instance()->default_dci_metadata ())
- , _dcp_video_frame_rate (0)
+ , _dcp_video_frame_rate (24)
, _dcp_audio_channels (MAX_AUDIO_CHANNELS)
+ , _minimum_audio_channels (0)
, _dirty (false)
{
set_dci_date_today ();
}
set_directory (result.string ());
- _log.reset (new FileLog (file ("log")));
}
Film::Film (Film const & o)
, _dcp_content_type (o._dcp_content_type)
, _container (o._container)
, _scaler (o._scaler)
- , _ab (o._ab)
, _with_subtitles (o._with_subtitles)
, _subtitle_offset (o._subtitle_offset)
, _subtitle_scale (o._subtitle_scale)
, _dci_metadata (o._dci_metadata)
, _dcp_video_frame_rate (o._dcp_video_frame_rate)
, _dci_date (o._dci_date)
+ , _minimum_audio_channels (o._minimum_audio_channels)
, _dirty (o._dirty)
{
_playlist->ContentChanged.connect (bind (&Film::playlist_content_changed, this, _1, _2));
<< "_" << j2k_bandwidth()
<< "_" << lexical_cast<int> (colour_lut());
- if (ab()) {
- pair<string, string> fa = Filter::ffmpeg_strings (Config::instance()->reference_filters());
- s << "ab_" << Config::instance()->reference_scaler()->id() << "_" << fa.first << "_" << fa.second;
- }
-
return s.str ();
}
string
Film::internal_video_mxf_dir () const
{
- boost::filesystem::path p;
return dir ("video");
}
return o;
}
-string
-Film::audio_analysis_path () const
+boost::filesystem::path
+Film::audio_analysis_path (shared_ptr<const AudioContent> c) const
{
- boost::filesystem::path p;
- p /= "analysis";
- p /= _playlist->audio_digest();
- return file (p.string ());
+ boost::filesystem::path p = dir ("analysis");
+ p /= c->digest();
+ return p;
}
/** Add suitable Jobs to the JobManager to create a DCP for this Film */
#endif
pair<string, int> const c = cpu_info ();
log()->log (String::compose ("CPU: %1, %2 processors", c.first, c.second));
+ list<pair<string, string> > const m = mount_info ();
+ for (list<pair<string, string> >::const_iterator i = m.begin(); i != m.end(); ++i) {
+ log()->log (String::compose ("Mount: %1 %2", i->first, i->second));
+ }
if (container() == 0) {
throw MissingSettingError (_("container"));
throw MissingSettingError (_("name"));
}
- shared_ptr<Job> r;
-
- if (ab()) {
- r = JobManager::instance()->add (shared_ptr<Job> (new ABTranscodeJob (shared_from_this())));
- } else {
- r = JobManager::instance()->add (shared_ptr<Job> (new TranscodeJob (shared_from_this())));
- }
-}
-
-/** Start a job to analyse the audio in our Playlist */
-void
-Film::analyse_audio ()
-{
- if (_analyse_audio_job) {
- return;
- }
-
- _analyse_audio_job.reset (new AnalyseAudioJob (shared_from_this()));
- _analyse_audio_job->Finished.connect (bind (&Film::analyse_audio_finished, this));
- JobManager::instance()->add (_analyse_audio_job);
-}
-
-void
-Film::analyse_audio_finished ()
-{
- ensure_ui_thread ();
-
- if (_analyse_audio_job->finished_ok ()) {
- AudioAnalysisSucceeded ();
- }
-
- _analyse_audio_job.reset ();
+ JobManager::instance()->add (shared_ptr<Job> (new TranscodeJob (shared_from_this())));
}
/** Start a job to send our DCP to the configured TMS */
}
root->add_child("Scaler")->add_child_text (_scaler->id ());
- root->add_child("AB")->add_child_text (_ab ? "1" : "0");
root->add_child("WithSubtitles")->add_child_text (_with_subtitles ? "1" : "0");
root->add_child("SubtitleOffset")->add_child_text (lexical_cast<string> (_subtitle_offset));
root->add_child("SubtitleScale")->add_child_text (lexical_cast<string> (_subtitle_scale));
root->add_child("DCPVideoFrameRate")->add_child_text (lexical_cast<string> (_dcp_video_frame_rate));
root->add_child("DCIDate")->add_child_text (boost::gregorian::to_iso_string (_dci_date));
root->add_child("DCPAudioChannels")->add_child_text (lexical_cast<string> (_dcp_audio_channels));
+ root->add_child("MinimumAudioChannels")->add_child_text (lexical_cast<string> (_minimum_audio_channels));
_playlist->as_xml (root->add_child ("Playlist"));
doc.write_to_file_formatted (file ("metadata.xml"));
{
optional<string> c = f.optional_string_child ("Container");
if (c) {
- _container = Container::from_id (c.get ());
+ _container = Ratio::from_id (c.get ());
}
}
_scaler = Scaler::from_id (f.string_child ("Scaler"));
- _ab = f.bool_child ("AB");
_with_subtitles = f.bool_child ("WithSubtitles");
_subtitle_offset = f.number_child<float> ("SubtitleOffset");
_subtitle_scale = f.number_child<float> ("SubtitleScale");
_dcp_video_frame_rate = f.number_child<int> ("DCPVideoFrameRate");
_dci_date = boost::gregorian::from_undelimited_string (f.string_child ("DCIDate"));
_dcp_audio_channels = f.number_child<int> ("DCPAudioChannels");
+ _minimum_audio_channels = f.number_child<int> ("MinimumAudioChannels");
_playlist->set_from_xml (shared_from_this(), f.node_child ("Playlist"));
}
void
-Film::set_container (Container const * c)
+Film::set_container (Ratio const * c)
{
{
boost::mutex::scoped_lock lm (_state_mutex);
signal_changed (SCALER);
}
-void
-Film::set_ab (bool a)
-{
- {
- boost::mutex::scoped_lock lm (_state_mutex);
- _ab = a;
- }
- signal_changed (AB);
-}
-
void
Film::set_with_subtitles (bool w)
{
}
+void
+Film::set_minimum_audio_channels (int c)
+{
+ {
+ boost::mutex::scoped_lock lm (_state_mutex);
+ _minimum_audio_channels = c;
+ }
+ signal_changed (MINIMUM_AUDIO_CHANNELS);
+}
+
void
Film::set_dcp_video_frame_rate (int f)
{
Film::examine_and_add_content (shared_ptr<Content> c)
{
shared_ptr<Job> j (new ExamineContentJob (shared_from_this(), c));
+ j->Finished.connect (bind (&Film::add_content_weak, this, boost::weak_ptr<Content> (c)));
JobManager::instance()->add (j);
}
+void
+Film::add_content_weak (weak_ptr<Content> c)
+{
+ shared_ptr<Content> content = c.lock ();
+ if (content) {
+ add_content (content);
+ }
+}
+
void
Film::add_content (shared_ptr<Content> c)
{