/*
- Copyright (C) 2014-2016 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2014-2018 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
video->take_from_examiner (examiner);
set_default_colour_conversion ();
- {
- boost::mutex::scoped_lock lm (_mutex);
-
- AudioStreamPtr as (new AudioStream (examiner->audio_frame_rate(), examiner->audio_length(), examiner->audio_channels()));
- audio->set_stream (as);
- AudioMapping m = as->mapping ();
- film()->make_audio_mapping_default (m);
- as->set_mapping (m);
- }
-
+ AudioStreamPtr as (new AudioStream (examiner->audio_frame_rate(), examiner->audio_length(), examiner->audio_channels()));
+ audio->set_stream (as);
+ AudioMapping m = as->mapping ();
+ film()->make_audio_mapping_default (m);
+ as->set_mapping (m);
signal_changed (AudioContentProperty::STREAMS);
bool has_subtitles = false;
signal_changed (DCPContentProperty::NAME);
}
+ signal_changed (AudioContentProperty::STREAMS);
+
video->set_frame_type (_three_d ? VIDEO_FRAME_TYPE_3D : VIDEO_FRAME_TYPE_2D);
}
}
bool
-DCPContent::can_reference (function<shared_ptr<ContentPart> (shared_ptr<const Content>)> part, string overlapping, list<string>& why_not) const
+DCPContent::can_reference (function<shared_ptr<ContentPart> (shared_ptr<const Content>)> part, string overlapping, string& why_not) const
{
/* We must be using the same standard as the film */
if (_standard) {
if (_standard.get() == dcp::INTEROP && !film()->interop()) {
- why_not.push_back (_("The film is set to SMPTE and this DCP is Interop."));
+ /// TRANSLATORS: this string will follow "Cannot reference this DCP: "
+ why_not = _("it is Interop and the film is set to SMPTE.");
return false;
} else if (_standard.get() == dcp::SMPTE && film()->interop()) {
- why_not.push_back (_("The film is set to Interop and this DCP is SMPTE."));
+ /// TRANSLATORS: this string will follow "Cannot reference this DCP: "
+ why_not = _("it is SMPTE and the film is set to Interop.");
return false;
}
}
/* And the same frame rate */
if (!video_frame_rate() || (lrint(video_frame_rate().get()) != film()->video_frame_rate())) {
- why_not.push_back (_("The film has a different frame rate to this DCP."));
+ /// TRANSLATORS: this string will follow "Cannot reference this DCP: "
+ why_not = _("it has a different frame rate to the film.");
return false;
}
} catch (dcp::DCPReadError) {
/* We couldn't read the DCP; it's probably missing */
return false;
+ } catch (dcp::KDMDecryptionError) {
+ /* We have an incorrect KDM */
+ return false;
}
/* fr must contain reels(). It can also contain other reels, but it must at
*/
BOOST_FOREACH (DCPTimePeriod i, reel_list) {
if (find (fr.begin(), fr.end(), i) == fr.end ()) {
- why_not.push_back (_("The reel lengths in the film differ from those in the DCP; set the reel mode to 'split by video content'."));
+ /// TRANSLATORS: this string will follow "Cannot reference this DCP: "
+ why_not = _("its reel lengths differ from those in the film; set the reel mode to 'split by video content'.");
return false;
}
}
ContentList a = overlaps (film()->content(), part, position(), end());
if (a.size() != 1 || a.front().get() != this) {
- why_not.push_back (overlapping);
+ why_not = overlapping;
return false;
}
}
bool
-DCPContent::can_reference_video (list<string>& why_not) const
+DCPContent::can_reference_video (string& why_not) const
{
if (film()->frame_size() != video->size()) {
- why_not.push_back (_("The video frame size in the film differs from that in the DCP."));
+ /// TRANSLATORS: this string will follow "Cannot reference this DCP: "
+ why_not = _("its video frame size differs from the film's.");
return false;
}
- return can_reference (bind (&Content::video, _1), _("There is other video content overlapping this DCP; remove it."), why_not);
+ /// TRANSLATORS: this string will follow "Cannot reference this DCP: "
+ return can_reference (bind (&Content::video, _1), _("it overlaps other video content; remove the other content."), why_not);
}
bool
-DCPContent::can_reference_audio (list<string>& why_not) const
+DCPContent::can_reference_audio (string& why_not) const
{
shared_ptr<DCPDecoder> decoder;
try {
} catch (dcp::DCPReadError) {
/* We couldn't read the DCP, so it's probably missing */
return false;
+ } catch (dcp::KDMDecryptionError) {
+ /* We have an incorrect KDM */
+ return false;
}
BOOST_FOREACH (shared_ptr<dcp::Reel> i, decoder->reels()) {
if (!i->main_sound()) {
- why_not.push_back (_("The DCP does not have sound in all reels."));
+ /// TRANSLATORS: this string will follow "Cannot reference this DCP: "
+ why_not = _("it does not have sound in all its reels.");
return false;
}
}
- return can_reference (bind (&Content::audio, _1), _("There is other audio content overlapping this DCP; remove it."), why_not);
+ /// TRANSLATORS: this string will follow "Cannot reference this DCP: "
+ return can_reference (bind (&Content::audio, _1), _("it overlaps other audio content; remove the other content."), why_not);
}
bool
-DCPContent::can_reference_subtitle (list<string>& why_not) const
+DCPContent::can_reference_subtitle (string& why_not) const
{
shared_ptr<DCPDecoder> decoder;
try {
} catch (dcp::DCPReadError) {
/* We couldn't read the DCP, so it's probably missing */
return false;
+ } catch (dcp::KDMDecryptionError) {
+ /* We have an incorrect KDM */
+ return false;
}
BOOST_FOREACH (shared_ptr<dcp::Reel> i, decoder->reels()) {
if (!i->main_subtitle()) {
- why_not.push_back (_("The DCP does not have subtitles in all reels."));
+ /// TRANSLATORS: this string will follow "Cannot reference this DCP: "
+ why_not = _("it does not have subtitles in all its reels.");
return false;
}
}
- return can_reference (bind (&Content::subtitle, _1), _("There is other subtitle content overlapping this DCP; remove it."), why_not);
+ /// TRANSLATORS: this string will follow "Cannot reference this DCP: "
+ return can_reference (bind (&Content::subtitle, _1), _("it overlaps other subtitle content; remove the other content."), why_not);
}
void
DCPContent::take_settings_from (shared_ptr<const Content> c)
{
shared_ptr<const DCPContent> dc = dynamic_pointer_cast<const DCPContent> (c);
- DCPOMATIC_ASSERT (dc);
+ if (!dc) {
+ return;
+ }
_reference_video = dc->_reference_video;
_reference_audio = dc->_reference_audio;