#include "overlaps.h"
#include "compose.hpp"
#include "dcp_decoder.h"
-#include "subtitle_content.h"
+#include "caption_content.h"
#include <dcp/dcp.h>
#include <dcp/raw_convert.h>
#include <dcp/exceptions.h>
, _reference_subtitle (false)
, _three_d (false)
{
- video.reset (new VideoContent (this));
- audio.reset (new AudioContent (this));
-
read_directory (p);
set_default_colour_conversion ();
}
{
video = VideoContent::from_xml (this, node, version);
audio = AudioContent::from_xml (this, node, version);
- subtitle = SubtitleContent::from_xml (this, node, version);
-
- audio->set_stream (
- AudioStreamPtr (
- new AudioStream (
- node->number_child<int> ("AudioFrameRate"),
- /* AudioLength was not present in some old metadata versions */
- node->optional_number_child<Frame>("AudioLength").get_value_or (
- video->length() * node->number_child<int>("AudioFrameRate") / video_frame_rate().get()
- ),
- AudioMapping (node->node_child ("AudioMapping"), version)
+ caption = CaptionContent::from_xml (this, node, version);
+
+ if (video && audio) {
+ audio->set_stream (
+ AudioStreamPtr (
+ new AudioStream (
+ node->number_child<int> ("AudioFrameRate"),
+ /* AudioLength was not present in some old metadata versions */
+ node->optional_number_child<Frame>("AudioLength").get_value_or (
+ video->length() * node->number_child<int>("AudioFrameRate") / video_frame_rate().get()
+ ),
+ AudioMapping (node->node_child ("AudioMapping"), version)
+ )
)
- )
- );
+ );
+ }
_name = node->string_child ("Name");
_encrypted = node->bool_child ("Encrypted");
bool const needed_assets = needs_assets ();
bool const needed_kdm = needs_kdm ();
string const old_name = name ();
- bool had_subtitles = static_cast<bool> (subtitle);
+ bool had_subtitles = static_cast<bool> (caption);
if (job) {
job->set_progress_unknown ();
Content::examine (job);
shared_ptr<DCPExaminer> examiner (new DCPExaminer (shared_from_this ()));
- video->take_from_examiner (examiner);
- set_default_colour_conversion ();
- {
- boost::mutex::scoped_lock lm (_mutex);
+ if (examiner->has_video()) {
+ {
+ boost::mutex::scoped_lock lm (_mutex);
+ video.reset (new VideoContent (this));
+ }
+ video->take_from_examiner (examiner);
+ set_default_colour_conversion ();
+ }
+ if (examiner->has_audio()) {
+ {
+ boost::mutex::scoped_lock lm (_mutex);
+ audio.reset (new AudioContent (this));
+ }
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);
}
- signal_changed (AudioContentProperty::STREAMS);
-
bool has_subtitles = false;
{
boost::mutex::scoped_lock lm (_mutex);
_name = examiner->name ();
if (examiner->has_subtitles ()) {
- subtitle.reset (new SubtitleContent (this));
+ caption.reset (new CaptionContent (this));
} else {
- subtitle.reset ();
+ caption.reset ();
}
- has_subtitles = static_cast<bool> (subtitle);
+ has_subtitles = static_cast<bool> (caption);
_encrypted = examiner->encrypted ();
_needs_assets = examiner->needs_assets ();
_kdm_valid = examiner->kdm_valid ();
signal_changed (DCPContentProperty::NAME);
}
- video->set_frame_type (_three_d ? VIDEO_FRAME_TYPE_3D : VIDEO_FRAME_TYPE_2D);
+ signal_changed (AudioContentProperty::STREAMS);
+
+ if (video) {
+ video->set_frame_type (_three_d ? VIDEO_FRAME_TYPE_3D : VIDEO_FRAME_TYPE_2D);
+ }
}
string
string
DCPContent::technical_summary () const
{
- return Content::technical_summary() + " - "
- + video->technical_summary() + " - "
- + audio->technical_summary() + " - ";
+ string s = Content::technical_summary() + " - ";
+ if (video) {
+ s += video->technical_summary() + " - ";
+ }
+ if (audio) {
+ s += audio->technical_summary() + " - ";
+ }
+ return s;
}
void
audio->stream()->mapping().as_xml (node->add_child("AudioMapping"));
}
- if (subtitle) {
- subtitle->as_xml (node);
+ if (caption) {
+ caption->as_xml (node);
}
boost::mutex::scoped_lock lm (_mutex);
DCPTime
DCPContent::full_length () const
{
+ if (!video) {
+ return DCPTime();
+ }
FrameRateChange const frc (active_video_frame_rate (), film()->video_frame_rate ());
return DCPTime::from_frames (llrint (video->length () * frc.factor ()), film()->video_frame_rate ());
}
string
DCPContent::identifier () const
{
- string s = Content::identifier() + "_" + video->identifier() + "_";
- if (subtitle) {
- s += subtitle->identifier () + " ";
+ string s = Content::identifier() + "_";
+
+ if (video) {
+ s += video->identifier() + "_";
+ }
+
+ if (caption) {
+ s += caption->identifier () + " ";
}
s += string (_reference_video ? "1" : "0") + string (_reference_subtitle ? "1" : "0");
DCPContent::add_properties (list<UserProperty>& p) const
{
Content::add_properties (p);
- video->add_properties (p);
- audio->add_properties (p);
+ if (video) {
+ video->add_properties (p);
+ }
+ if (audio) {
+ audio->add_properties (p);
+ }
}
void
DCPContent::set_default_colour_conversion ()
{
/* Default to no colour conversion for DCPs */
- video->unset_colour_conversion ();
+ if (video) {
+ video->unset_colour_conversion ();
+ }
}
void
/* We must be using the same standard as the film */
if (_standard) {
if (_standard.get() == dcp::INTEROP && !film()->interop()) {
- why_not = _("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 = _("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 = _("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;
}
*/
BOOST_FOREACH (DCPTimePeriod i, reel_list) {
if (find (fr.begin(), fr.end(), i) == fr.end ()) {
- why_not = _("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;
}
}
bool
DCPContent::can_reference_video (string& why_not) const
{
+ if (!video) {
+ why_not = _("There is no video in this DCP");
+ return false;
+ }
+
if (film()->frame_size() != video->size()) {
- why_not = _("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
} catch (dcp::DCPReadError) {
/* We couldn't read the DCP, so it's probably missing */
return false;
+ } catch (DCPError) {
+ /* 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 = _("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
BOOST_FOREACH (shared_ptr<dcp::Reel> i, decoder->reels()) {
if (!i->main_subtitle()) {
- why_not = _("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::caption, _1), _("it overlaps other caption content; remove the other content."), why_not);
}
void