summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2020-04-14 23:11:08 +0200
committerCarl Hetherington <cth@carlh.net>2020-04-14 23:11:08 +0200
commit67775a6d0d28131b98ae284c7be23d79ccdab685 (patch)
tree6ba20512690d66685600a0fd7d6850ad03ba784b /src
parent4ab86ef0295bcd6bb9297996a06006f371d22bae (diff)
Fix Empty/Player behaviour when using a playlist that is not the same as the Film's.
Previously Empty would use the length of the film for its end point. Now it takes a Playlist (rather than a list of Pieces) and uses the length of that playlist for its end point. This fixes #1543, in which single-content audio analysis jobs would run for the whole length of the film, rather than the length of the content, producing strange graphs and incorrect progress reports.
Diffstat (limited to 'src')
-rw-r--r--src/lib/empty.cc8
-rw-r--r--src/lib/empty.h5
-rw-r--r--src/lib/player.cc12
-rw-r--r--src/wx/audio_dialog.h1
4 files changed, 14 insertions, 12 deletions
diff --git a/src/lib/empty.cc b/src/lib/empty.cc
index 206acfdb0..71bf3aa95 100644
--- a/src/lib/empty.cc
+++ b/src/lib/empty.cc
@@ -36,16 +36,16 @@ using boost::dynamic_pointer_cast;
using boost::function;
using namespace dcpomatic;
-Empty::Empty (shared_ptr<const Film> film, list<shared_ptr<Piece> > pieces, function<bool (shared_ptr<Piece>)> part)
+Empty::Empty (shared_ptr<const Film> film, shared_ptr<const Playlist> playlist, function<bool (shared_ptr<const Content>)> part)
{
list<DCPTimePeriod> full;
- BOOST_FOREACH (shared_ptr<Piece> i, pieces) {
+ BOOST_FOREACH (shared_ptr<Content> i, playlist->content()) {
if (part(i)) {
- full.push_back (DCPTimePeriod (i->content->position(), i->content->end(film)));
+ full.push_back (DCPTimePeriod (i->position(), i->end(film)));
}
}
- _periods = subtract (DCPTimePeriod(DCPTime(), film->length()), coalesce(full));
+ _periods = subtract (DCPTimePeriod(DCPTime(), playlist->length(film)), coalesce(full));
if (!_periods.empty ()) {
_position = _periods.front().from;
diff --git a/src/lib/empty.h b/src/lib/empty.h
index bd295206e..abd6fdef0 100644
--- a/src/lib/empty.h
+++ b/src/lib/empty.h
@@ -28,14 +28,14 @@
struct empty_test1;
struct empty_test2;
+struct empty_test3;
struct player_subframe_test;
-class Piece;
class Empty
{
public:
Empty () {}
- Empty (boost::shared_ptr<const Film> film, std::list<boost::shared_ptr<Piece> > pieces, boost::function<bool (boost::shared_ptr<Piece>)> 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 position () const {
return _position;
@@ -50,6 +50,7 @@ public:
private:
friend struct ::empty_test1;
friend struct ::empty_test2;
+ friend struct ::empty_test3;
friend struct ::player_subframe_test;
std::list<dcpomatic::DCPTimePeriod> _periods;
diff --git a/src/lib/player.cc b/src/lib/player.cc
index d5a558184..3202c1b85 100644
--- a/src/lib/player.cc
+++ b/src/lib/player.cc
@@ -125,15 +125,15 @@ Player::setup_pieces ()
}
bool
-have_video (shared_ptr<Piece> piece)
+have_video (shared_ptr<const Content> content)
{
- return piece->decoder && piece->decoder->video;
+ return static_cast<bool>(content->video);
}
bool
-have_audio (shared_ptr<Piece> piece)
+have_audio (shared_ptr<const Content> content)
{
- return piece->decoder && piece->decoder->audio;
+ return static_cast<bool>(content->audio);
}
void
@@ -237,8 +237,8 @@ Player::setup_pieces_unlocked ()
}
}
- _black = Empty (_film, _pieces, bind(&have_video, _1));
- _silent = Empty (_film, _pieces, bind(&have_audio, _1));
+ _black = Empty (_film, _playlist, bind(&have_video, _1));
+ _silent = Empty (_film, _playlist, bind(&have_audio, _1));
_last_video_time = DCPTime ();
_last_video_eyes = EYES_BOTH;
diff --git a/src/wx/audio_dialog.h b/src/wx/audio_dialog.h
index e866aca3f..3a02fd87f 100644
--- a/src/wx/audio_dialog.h
+++ b/src/wx/audio_dialog.h
@@ -49,6 +49,7 @@ private:
boost::shared_ptr<AudioAnalysis> _analysis;
boost::weak_ptr<Film> _film;
+ /** content to analyse, or 0 to analyse all the film's content */
boost::weak_ptr<Content> _content;
int _channels;
boost::shared_ptr<const Playlist> _playlist;