, _reference_subtitle (false)
, _three_d (false)
{
- video.reset (new VideoContent (this));
- audio.reset (new AudioContent (this));
-
read_directory (p);
set_default_colour_conversion ();
}
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");
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;
{
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
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
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() + "_";
+ string s = Content::identifier() + "_";
+
+ if (video) {
+ s += video->identifier() + "_";
+ }
+
if (subtitle) {
s += subtitle->identifier () + " ";
}
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
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.");
public:
explicit DCPExaminer (boost::shared_ptr<const DCPContent>);
+ bool has_video () const {
+ return _has_video;
+ }
+
boost::optional<double> video_frame_rate () const {
return _video_frame_rate;
}
dcp::Size video_size () const {
- return _video_size.get_value_or (dcp::Size (1998, 1080));
+ DCPOMATIC_ASSERT (_has_video);
+ DCPOMATIC_ASSERT (_video_size);
+ return *_video_size;
}
Frame video_length () const {
return _needs_assets;
}
+ bool has_audio () const {
+ return _has_audio;
+ }
+
int audio_channels () const {
return _audio_channels.get_value_or (0);
}
std::string _name;
bool _has_subtitles;
bool _encrypted;
+ /** true if this DCP has video content (but false if it has unresolved references to video content) */
+ bool _has_video;
+ /** true if this DCP has audio content (but false if it has unresolved references to audio content) */
+ bool _has_audio;
bool _needs_assets;
bool _kdm_valid;
boost::optional<dcp::Standard> _standard;
return;
}
- if (dcp->subtitle) {
- dcp->subtitle->set_use (true);
- }
+ setup_from_dcp (dcp);
if (dcp->three_d()) {
_film->set_three_d (true);
}
- Ratio const * r = Ratio::nearest_from_ratio(dcp->video->size().ratio());
- if (r) {
- _film->set_container(r);
- }
-
_viewer->set_film (_film);
_viewer->set_position (DCPTime ());
_info->triggered_update ();
DCPOMATIC_ASSERT (dcp);
dcp->add_ov (wx_to_std(c->GetPath()));
dcp->examine (shared_ptr<Job>());
- /* Maybe we just gained some subtitles */
- if (dcp->subtitle) {
- dcp->subtitle->set_use (true);
- }
+ setup_from_dcp (dcp);
}
c->Destroy ();
_viewer->forward_frame ();
}
+private:
+
+ void setup_from_dcp (shared_ptr<DCPContent> dcp)
+ {
+ if (dcp->subtitle) {
+ dcp->subtitle->set_use (true);
+ }
+
+ if (dcp->video) {
+ Ratio const * r = Ratio::nearest_from_ratio(dcp->video->size().ratio());
+ if (r) {
+ _film->set_container(r);
+ }
+ }
+ }
+
bool _update_news_requested;
PlayerInformation* _info;
wxPreferencesEditor* _config_dialog;