summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2020-04-15 16:17:01 +0200
committerCarl Hetherington <cth@carlh.net>2020-04-15 16:17:01 +0200
commit4219d4b76c5cd5690b1f4fa0c248d93ced26d05a (patch)
tree6266573a3a26dd9f432d6bd096a2c6bbd85bf6c4 /src/lib
parent39dcdd18487d5d1e20f0343fe617ed5bf44c1387 (diff)
Fix length of player output so it can be either the film's length or playlist's length, as appropriate.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/analyse_audio_job.cc2
-rw-r--r--src/lib/empty.cc4
-rw-r--r--src/lib/empty.h2
-rw-r--r--src/lib/encoder.cc2
-rw-r--r--src/lib/hints.cc2
-rw-r--r--src/lib/player.cc17
-rw-r--r--src/lib/player.h5
7 files changed, 15 insertions, 19 deletions
diff --git a/src/lib/analyse_audio_job.cc b/src/lib/analyse_audio_job.cc
index ad28dcfd4..1fc09b905 100644
--- a/src/lib/analyse_audio_job.cc
+++ b/src/lib/analyse_audio_job.cc
@@ -107,7 +107,7 @@ AnalyseAudioJob::json_name () const
void
AnalyseAudioJob::run ()
{
- shared_ptr<Player> player (new Player (_film, _playlist));
+ shared_ptr<Player> player (new Player(_film, _playlist, _playlist->length(_film)));
player->set_ignore_video ();
player->set_ignore_text ();
player->set_fast ();
diff --git a/src/lib/empty.cc b/src/lib/empty.cc
index 71bf3aa95..c145c231b 100644
--- a/src/lib/empty.cc
+++ b/src/lib/empty.cc
@@ -36,7 +36,7 @@ using boost::dynamic_pointer_cast;
using boost::function;
using namespace dcpomatic;
-Empty::Empty (shared_ptr<const Film> film, shared_ptr<const Playlist> playlist, function<bool (shared_ptr<const Content>)> part)
+Empty::Empty (shared_ptr<const Film> film, shared_ptr<const Playlist> playlist, function<bool (shared_ptr<const Content>)> part, DCPTime length)
{
list<DCPTimePeriod> full;
BOOST_FOREACH (shared_ptr<Content> i, playlist->content()) {
@@ -45,7 +45,7 @@ Empty::Empty (shared_ptr<const Film> film, shared_ptr<const Playlist> playlist,
}
}
- _periods = subtract (DCPTimePeriod(DCPTime(), playlist->length(film)), coalesce(full));
+ _periods = subtract (DCPTimePeriod(DCPTime(), length), coalesce(full));
if (!_periods.empty ()) {
_position = _periods.front().from;
diff --git a/src/lib/empty.h b/src/lib/empty.h
index abd6fdef0..2368c4491 100644
--- a/src/lib/empty.h
+++ b/src/lib/empty.h
@@ -35,7 +35,7 @@ class Empty
{
public:
Empty () {}
- Empty (boost::shared_ptr<const Film> film, boost::shared_ptr<const Playlist> playlist, boost::function<bool (boost::shared_ptr<const Content>)> part);
+ Empty (boost::shared_ptr<const Film> film, boost::shared_ptr<const Playlist> playlist, boost::function<bool (boost::shared_ptr<const Content>)> part, dcpomatic::DCPTime length);
dcpomatic::DCPTime position () const {
return _position;
diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc
index 535389a94..b52507ed1 100644
--- a/src/lib/encoder.cc
+++ b/src/lib/encoder.cc
@@ -41,7 +41,7 @@ using boost::shared_ptr;
Encoder::Encoder (shared_ptr<const Film> film, weak_ptr<Job> job)
: _film (film)
, _job (job)
- , _player (new Player (film, film->playlist ()))
+ , _player (new Player(film, film->playlist(), film->length()))
{
}
diff --git a/src/lib/hints.cc b/src/lib/hints.cc
index 3edceeee3..68cf82b84 100644
--- a/src/lib/hints.cc
+++ b/src/lib/hints.cc
@@ -259,7 +259,7 @@ Hints::thread ()
emit (bind(boost::ref(Progress), _("Examining closed captions")));
- shared_ptr<Player> player (new Player (film, film->playlist ()));
+ shared_ptr<Player> player (new Player(film, film->playlist(), film->length()));
player->set_ignore_video ();
player->set_ignore_audio ();
player->Text.connect (bind(&Hints::text, this, _1, _2, _4));
diff --git a/src/lib/player.cc b/src/lib/player.cc
index 3202c1b85..ab05d42ad 100644
--- a/src/lib/player.cc
+++ b/src/lib/player.cc
@@ -84,7 +84,7 @@ int const PlayerProperty::FILM_CONTAINER = 702;
int const PlayerProperty::FILM_VIDEO_FRAME_RATE = 703;
int const PlayerProperty::DCP_DECODE_REDUCTION = 704;
-Player::Player (shared_ptr<const Film> film, shared_ptr<const Playlist> playlist)
+Player::Player (shared_ptr<const Film> film, shared_ptr<const Playlist> playlist, DCPTime playback_length)
: _film (film)
, _playlist (playlist)
, _suspended (0)
@@ -97,6 +97,7 @@ Player::Player (shared_ptr<const Film> film, shared_ptr<const Playlist> playlist
, _play_referenced (false)
, _audio_merger (_film->audio_frame_rate())
, _shuffler (0)
+ , _playback_length (playback_length)
{
_film_changed_connection = _film->Change.connect (bind (&Player::film_change, this, _1, _2));
/* The butler must hear about this first, so since we are proxying this through to the butler we must
@@ -237,15 +238,12 @@ Player::setup_pieces_unlocked ()
}
}
- _black = Empty (_film, _playlist, bind(&have_video, _1));
- _silent = Empty (_film, _playlist, bind(&have_audio, _1));
+ _black = Empty (_film, _playlist, bind(&have_video, _1), _playback_length);
+ _silent = Empty (_film, _playlist, bind(&have_audio, _1), _playback_length);
_last_video_time = DCPTime ();
_last_video_eyes = EYES_BOTH;
_last_audio_time = DCPTime ();
-
- /* Cached value to save recalculating it on every ::pass */
- _film_length = _film->length ();
}
void
@@ -566,15 +564,14 @@ bool
Player::pass ()
{
boost::mutex::scoped_lock lm (_mutex);
- DCPOMATIC_ASSERT (_film_length);
if (_suspended) {
/* We can't pass in this state */
return false;
}
- if (*_film_length == DCPTime()) {
- /* Special case of an empty Film; just give one black frame */
+ if (_playback_length == DCPTime()) {
+ /* Special; just give one black frame */
emit_video (black_player_video_frame(EYES_BOTH), DCPTime());
return true;
}
@@ -680,7 +677,7 @@ Player::pass ()
/* Work out the time before which the audio is definitely all here. This is the earliest last_push_end of one
of our streams, or the position of the _silent.
*/
- DCPTime pull_to = *_film_length;
+ DCPTime pull_to = _playback_length;
for (map<AudioStreamPtr, StreamState>::const_iterator i = _stream_states.begin(); i != _stream_states.end(); ++i) {
if (!i->second.piece->done && i->second.last_push_end < pull_to) {
pull_to = i->second.last_push_end;
diff --git a/src/lib/player.h b/src/lib/player.h
index c2911bf10..5a1b08ecf 100644
--- a/src/lib/player.h
+++ b/src/lib/player.h
@@ -68,7 +68,7 @@ public:
class Player : public boost::enable_shared_from_this<Player>, public boost::noncopyable
{
public:
- Player (boost::shared_ptr<const Film>, boost::shared_ptr<const Playlist> playlist);
+ Player (boost::shared_ptr<const Film>, boost::shared_ptr<const Playlist> playlist, dcpomatic::DCPTime playback_length);
~Player ();
bool pass ();
@@ -207,8 +207,7 @@ private:
ActiveText _active_texts[TEXT_COUNT];
boost::shared_ptr<AudioProcessor> _audio_processor;
- /* Cached stuff */
- boost::optional<dcpomatic::DCPTime> _film_length;
+ dcpomatic::DCPTime _playback_length;
boost::signals2::scoped_connection _film_changed_connection;
boost::signals2::scoped_connection _playlist_change_connection;