summaryrefslogtreecommitdiff
path: root/src/lib/dcp_content.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2018-04-27 15:13:42 +0100
committerCarl Hetherington <cth@carlh.net>2018-04-27 15:13:42 +0100
commitdd9f4f7e9511f8f830ec05d1b60c475c6b2d71e0 (patch)
treea2035eacaa9dc587ed119f2785dff9589db05aff /src/lib/dcp_content.cc
parent565490c24a46d0aa941f75cf2a03b195246008b4 (diff)
Fix incorrect container size when loading a VF/OV combination into the player.
Diffstat (limited to 'src/lib/dcp_content.cc')
-rw-r--r--src/lib/dcp_content.cc98
1 files changed, 68 insertions, 30 deletions
diff --git a/src/lib/dcp_content.cc b/src/lib/dcp_content.cc
index b5209e2c7..1dffa6b36 100644
--- a/src/lib/dcp_content.cc
+++ b/src/lib/dcp_content.cc
@@ -72,9 +72,6 @@ DCPContent::DCPContent (shared_ptr<const Film> film, boost::filesystem::path p)
, _reference_subtitle (false)
, _three_d (false)
{
- video.reset (new VideoContent (this));
- audio.reset (new AudioContent (this));
-
read_directory (p);
set_default_colour_conversion ();
}
@@ -86,18 +83,20 @@ DCPContent::DCPContent (shared_ptr<const Film> film, cxml::ConstNodePtr node, in
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)
+ 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");
@@ -152,15 +151,28 @@ DCPContent::examine (shared_ptr<Job> job)
Content::examine (job);
shared_ptr<DCPExaminer> examiner (new DCPExaminer (shared_from_this ()));
- video->take_from_examiner (examiner);
- set_default_colour_conversion ();
- 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);
+ 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);
+ }
bool has_subtitles = false;
{
@@ -199,7 +211,9 @@ DCPContent::examine (shared_ptr<Job> job)
signal_changed (AudioContentProperty::STREAMS);
- video->set_frame_type (_three_d ? VIDEO_FRAME_TYPE_3D : VIDEO_FRAME_TYPE_2D);
+ if (video) {
+ video->set_frame_type (_three_d ? VIDEO_FRAME_TYPE_3D : VIDEO_FRAME_TYPE_2D);
+ }
}
string
@@ -212,9 +226,14 @@ DCPContent::summary () const
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
@@ -274,6 +293,9 @@ DCPContent::as_xml (xmlpp::Node* node, bool with_paths) const
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 ());
}
@@ -281,7 +303,12 @@ DCPContent::full_length () const
string
DCPContent::identifier () const
{
- string s = Content::identifier() + "_" + video->identifier() + "_";
+ string s = Content::identifier() + "_";
+
+ if (video) {
+ s += video->identifier() + "_";
+ }
+
if (subtitle) {
s += subtitle->identifier () + " ";
}
@@ -332,15 +359,21 @@ void
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
@@ -484,6 +517,11 @@ DCPContent::can_reference (function<shared_ptr<ContentPart> (shared_ptr<const Co
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()) {
/// TRANSLATORS: this string will follow "Cannot reference this DCP: "
why_not = _("its video frame size differs from the film's.");