From: Carl Hetherington Date: Mon, 12 Oct 2015 14:05:09 +0000 (+0100) Subject: Rename split-by-video content slightly; fix referencing to multi-reel DCPs. X-Git-Tag: v2.4.11~3 X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=f9068dcbfbb09082e29e2a779ef1a7a2f6ee849e Rename split-by-video content slightly; fix referencing to multi-reel DCPs. --- diff --git a/src/lib/dcp_content.cc b/src/lib/dcp_content.cc index cb9dcf53d..f39b2fb4a 100644 --- a/src/lib/dcp_content.cc +++ b/src/lib/dcp_content.cc @@ -23,9 +23,13 @@ #include "film.h" #include "config.h" #include "compose.hpp" +#include "dcp_decoder.h" #include #include +#include +#include #include +#include #include #include @@ -245,3 +249,20 @@ DCPContent::set_reference_subtitle (bool r) signal_changed (DCPContentProperty::REFERENCE_SUBTITLE); } + +list +DCPContent::reel_split_points () const +{ + list s; + DCPDecoder decoder (shared_from_this(), false); + DCPTime t = position(); + + shared_ptr film = _film.lock (); + DCPOMATIC_ASSERT (film); + BOOST_FOREACH (shared_ptr k, decoder.reels()) { + s.push_back (t); + t += DCPTime::from_frames (k->main_picture()->duration(), film->video_frame_rate()); + } + + return s; +} diff --git a/src/lib/dcp_content.h b/src/lib/dcp_content.h index 0f59bdf43..be12ba534 100644 --- a/src/lib/dcp_content.h +++ b/src/lib/dcp_content.h @@ -52,6 +52,10 @@ public: return boost::dynamic_pointer_cast (Content::shared_from_this ()); } + boost::shared_ptr shared_from_this () const { + return boost::dynamic_pointer_cast (Content::shared_from_this ()); + } + DCPTime full_length () const; void examine (boost::shared_ptr); @@ -61,6 +65,7 @@ public: std::string identifier () const; void set_default_colour_conversion (); + std::list reel_split_points () const; /* SubtitleContent */ diff --git a/src/lib/dcpomatic_time.cc b/src/lib/dcpomatic_time.cc index 49309b1d2..1d9659935 100644 --- a/src/lib/dcpomatic_time.cc +++ b/src/lib/dcpomatic_time.cc @@ -88,3 +88,10 @@ operator<< (ostream& s, DCPTime t) s << "[DCP " << t.get() << " " << t.seconds() << "s]"; return s; } + +ostream & +operator<< (ostream& s, DCPTimePeriod p) +{ + s << "[DCP " << p.from.get() << " " << p.from.seconds() << "s -> " << p.to.get() << " " << p.to.seconds() << "s]"; + return s; +} diff --git a/src/lib/dcpomatic_time.h b/src/lib/dcpomatic_time.h index beea8c898..496f54d8e 100644 --- a/src/lib/dcpomatic_time.h +++ b/src/lib/dcpomatic_time.h @@ -272,5 +272,6 @@ ContentTime min (ContentTime a, ContentTime b); ContentTime max (ContentTime a, ContentTime b); std::ostream& operator<< (std::ostream& s, ContentTime t); std::ostream& operator<< (std::ostream& s, DCPTime t); +std::ostream& operator<< (std::ostream& s, DCPTimePeriod p); #endif diff --git a/src/lib/film.cc b/src/lib/film.cc index 8cf468150..ace180d1d 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -1297,16 +1297,18 @@ Film::reels () const case REELTYPE_SINGLE: p.push_back (DCPTimePeriod (DCPTime (), len)); break; - case REELTYPE_ONE_PER_VIDEO: + case REELTYPE_BY_VIDEO_CONTENT: { optional last; BOOST_FOREACH (shared_ptr c, content ()) { shared_ptr v = dynamic_pointer_cast (c); if (v) { - if (last) { - p.push_back (DCPTimePeriod (last.get(), v->position ())); + BOOST_FOREACH (DCPTime t, v->reel_split_points()) { + if (last) { + p.push_back (DCPTimePeriod (last.get(), t)); + } + last = t; } - last = v->position (); } } if (last) { @@ -1330,4 +1332,3 @@ Film::reels () const return p; } - diff --git a/src/lib/player.cc b/src/lib/player.cc index 0606a9340..c484ecc9a 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -46,6 +46,7 @@ #include "dcp_subtitle_decoder.h" #include "audio_processor.h" #include "playlist.h" +#include "referenced_reel_asset.h" #include #include #include @@ -741,26 +742,49 @@ Player::set_play_referenced () _have_valid_pieces = false; } -list > +list Player::get_reel_assets () { - list > a; + list a; BOOST_FOREACH (shared_ptr i, _playlist->content ()) { shared_ptr j = dynamic_pointer_cast (i); if (!j) { continue; } - /* XXX: hack hack hack */ DCPDecoder decoder (j, false); - if (j->reference_video ()) { - a.push_back (decoder.reels().front()->main_picture ()); - } - if (j->reference_audio ()) { - a.push_back (decoder.reels().front()->main_sound ()); - } - if (j->reference_subtitle ()) { - a.push_back (decoder.reels().front()->main_subtitle ()); + int64_t offset = 0; + BOOST_FOREACH (shared_ptr k, decoder.reels()) { + DCPTime const from = i->position() + DCPTime::from_frames (offset, _film->video_frame_rate()); + if (j->reference_video ()) { + a.push_back ( + ReferencedReelAsset ( + k->main_picture (), + DCPTimePeriod (from, from + DCPTime::from_frames (k->main_picture()->duration(), _film->video_frame_rate())) + ) + ); + } + + if (j->reference_audio ()) { + a.push_back ( + ReferencedReelAsset ( + k->main_sound (), + DCPTimePeriod (from, from + DCPTime::from_frames (k->main_sound()->duration(), _film->video_frame_rate())) + ) + ); + } + + if (j->reference_subtitle ()) { + a.push_back ( + ReferencedReelAsset ( + k->main_subtitle (), + DCPTimePeriod (from, from + DCPTime::from_frames (k->main_subtitle()->duration(), _film->video_frame_rate())) + ) + ); + } + + /* Assume that main picture duration is the length of the reel */ + offset += k->main_picture()->duration (); } } diff --git a/src/lib/player.h b/src/lib/player.h index 9bb84a11c..cd1423e9f 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -37,6 +37,7 @@ class PlayerVideo; class Playlist; class Font; class AudioBuffers; +class ReferencedReelAsset; /** @class Player * @brief A class which can `play' a Playlist. @@ -50,7 +51,7 @@ public: boost::shared_ptr get_audio (DCPTime time, DCPTime length, bool accurate); PlayerSubtitles get_subtitles (DCPTime time, DCPTime length, bool starting, bool burnt); std::list > get_subtitle_fonts (); - std::list > get_reel_assets (); + std::list get_reel_assets (); void set_video_container_size (dcp::Size); void set_ignore_video (); diff --git a/src/lib/transcoder.cc b/src/lib/transcoder.cc index 49742f98d..20185e8c9 100644 --- a/src/lib/transcoder.cc +++ b/src/lib/transcoder.cc @@ -33,6 +33,7 @@ #include "job.h" #include "writer.h" #include "compose.hpp" +#include "referenced_reel_asset.h" #include "subtitle_content.h" #include #include @@ -101,8 +102,7 @@ Transcoder::go () } } - /* XXX: we should be passing through details of positions, at least... */ - BOOST_FOREACH (shared_ptr i, _player->get_reel_assets ()) { + BOOST_FOREACH (ReferencedReelAsset i, _player->get_reel_assets ()) { _writer->write (i); } diff --git a/src/lib/types.h b/src/lib/types.h index 5486f8612..105432f83 100644 --- a/src/lib/types.h +++ b/src/lib/types.h @@ -87,7 +87,7 @@ enum Part enum ReelType { REELTYPE_SINGLE, - REELTYPE_ONE_PER_VIDEO, + REELTYPE_BY_VIDEO_CONTENT, REELTYPE_BY_LENGTH }; diff --git a/src/lib/video_content.cc b/src/lib/video_content.cc index ff54c4014..a9b286315 100644 --- a/src/lib/video_content.cc +++ b/src/lib/video_content.cc @@ -579,3 +579,11 @@ VideoContent::add_properties (list >& p) const p.push_back (make_pair (_("Video size"), raw_convert (video_size().width) + "x" + raw_convert (video_size().height))); p.push_back (make_pair (_("Video frame rate"), raw_convert (video_frame_rate()) + " " + _("frames per second"))); } + +list +VideoContent::reel_split_points () const +{ + list t; + t.push_back (position ()); + return t; +} diff --git a/src/lib/video_content.h b/src/lib/video_content.h index f7689763f..c0a609a6a 100644 --- a/src/lib/video_content.h +++ b/src/lib/video_content.h @@ -55,6 +55,11 @@ public: virtual void set_default_colour_conversion (); + /** @return points at which to split this content when + * REELTYPE_BY_VIDEO_CONTENT is in use. + */ + virtual std::list reel_split_points () const; + Frame video_length () const { boost::mutex::scoped_lock lm (_mutex); return _video_length; diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 53c4cc370..736dba78e 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -34,6 +34,7 @@ #include "version.h" #include "font.h" #include "util.h" +#include "referenced_reel_asset.h" #include #include #include @@ -602,11 +603,10 @@ Writer::finish () reel_picture_asset.reset (new dcp::ReelStereoPictureAsset (stereo, 0)); } } else { - /* We don't have a picture asset of our own; maybe we need to reference one */ - /* XXX: this is all a hack */ - BOOST_FOREACH (shared_ptr j, _reel_assets) { - shared_ptr k = dynamic_pointer_cast (j); - if (k) { + /* We don't have a picture asset of our own; hopefully we have one to reference */ + BOOST_FOREACH (ReferencedReelAsset j, _reel_assets) { + shared_ptr k = dynamic_pointer_cast (j.asset); + if (k && j.period == i.period) { reel_picture_asset = k; } } @@ -618,11 +618,11 @@ Writer::finish () /* We have made a sound asset of our own. Put it into the reel */ reel->add (shared_ptr (new dcp::ReelSoundAsset (i.sound_asset, 0))); } else { - /* We don't have a sound asset of our own; maybe we need to reference one */ - /* XXX: this is all a hack */ - BOOST_FOREACH (shared_ptr j, _reel_assets) { - if (dynamic_pointer_cast (j)) { - reel->add (j); + /* We don't have a sound asset of our own; hopefully we have one to reference */ + BOOST_FOREACH (ReferencedReelAsset j, _reel_assets) { + shared_ptr k = dynamic_pointer_cast (j.asset); + if (k && j.period == i.period) { + reel->add (k); } } } @@ -668,11 +668,11 @@ Writer::finish () ) )); } else { - /* We don't have a subtitle asset of our own; maybe we need to reference one */ - /* XXX: this is all a hack */ - BOOST_FOREACH (shared_ptr j, _reel_assets) { - if (dynamic_pointer_cast (j)) { - reel->add (j); + /* We don't have a subtitle asset of our own; hopefully we have one to reference */ + BOOST_FOREACH (ReferencedReelAsset j, _reel_assets) { + shared_ptr k = dynamic_pointer_cast (j.asset); + if (k && j.period == i.period) { + reel->add (k); } } } @@ -911,7 +911,7 @@ Writer::read_frame_info (FILE* file, int frame, Eyes eyes) const } void -Writer::write (shared_ptr asset) +Writer::write (ReferencedReelAsset asset) { _reel_assets.push_back (asset); } diff --git a/src/lib/writer.h b/src/lib/writer.h index 23596cefc..8f1e71278 100644 --- a/src/lib/writer.h +++ b/src/lib/writer.h @@ -37,6 +37,7 @@ class Data; class AudioBuffers; class Job; class Font; +class ReferencedReelAsset; namespace dcp { class MonoPictureAsset; @@ -108,7 +109,7 @@ public: void write (boost::shared_ptr); void write (PlayerSubtitles subs); void write (std::list > fonts); - void write (boost::shared_ptr reel_asset); + void write (ReferencedReelAsset asset); void finish (); void set_encoder_threads (int threads); @@ -182,7 +183,7 @@ private: */ int _pushed_to_disk; - std::list > _reel_assets; + std::list _reel_assets; std::list > _fonts; diff --git a/src/wx/dcp_panel.cc b/src/wx/dcp_panel.cc index b0cbd8941..4190526d7 100644 --- a/src/wx/dcp_panel.cc +++ b/src/wx/dcp_panel.cc @@ -171,7 +171,7 @@ DCPPanel::DCPPanel (wxNotebook* n, boost::shared_ptr film) } _reel_type->Append (_("Single reel")); - _reel_type->Append (_("One per video content")); + _reel_type->Append (_("Split by video content")); _reel_type->Append (_("Custom")); _reel_length->SetRange (1, 64); diff --git a/test/data b/test/data index 4af76b996..ecadd276b 160000 --- a/test/data +++ b/test/data @@ -1 +1 @@ -Subproject commit 4af76b996ec91ea4db61f001a6f1b676907dc3a4 +Subproject commit ecadd276b6af06022a0cb2a35bd1330eaa025c11