Give Butler a weak_ptr<Film>
authorCarl Hetherington <cth@carlh.net>
Mon, 30 Nov 2020 22:49:04 +0000 (23:49 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 30 Nov 2020 23:20:51 +0000 (00:20 +0100)
src/lib/butler.cc
src/lib/butler.h
src/lib/ffmpeg_encoder.cc
src/wx/film_viewer.cc
test/butler_test.cc
test/dcp_playback_test.cc
test/player_test.cc

index d27778b70b0a909b1d8aae0626dece75d8d41108..4ab0092c4d0f819bbc625a3d18f66da4a0ec2c9a 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2016-2018 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2016-2020 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -58,6 +58,7 @@ using namespace boost::placeholders;
  *  @param fast Same as above for the `fast' flag.
  */
 Butler::Butler (
+       weak_ptr<const Film> film,
        shared_ptr<Player> player,
        AudioMapping audio_mapping,
        int audio_channels,
@@ -66,7 +67,8 @@ Butler::Butler (
        bool aligned,
        bool fast
        )
-       : _player (player)
+       : _film (film)
+       , _player (player)
        , _prepare_work (new boost::asio::io_service::work (_prepare_service))
        , _pending_seek_accurate (false)
        , _suspended (0)
index 6b933be4b85a4e98814297e4d4cf6bcdbd9ec14a..1fe05742f107821e65c63ab34650849e3f883c60 100644 (file)
@@ -37,6 +37,7 @@ class Butler : public ExceptionStore, public boost::noncopyable
 {
 public:
        Butler (
+               boost::weak_ptr<const Film> film,
                boost::shared_ptr<Player> player,
                AudioMapping map,
                int audio_channels,
@@ -87,6 +88,7 @@ private:
        void player_change (ChangeType type);
        void seek_unlocked (dcpomatic::DCPTime position, bool accurate);
 
+       boost::weak_ptr<const Film> _film;
        boost::shared_ptr<Player> _player;
        boost::thread _thread;
 
index 1d8feffa8f4ed369ae177eabc85ce91d1511c9a3..443e169395425a4e7c3773979c94087501762f84 100644 (file)
@@ -107,7 +107,7 @@ FFmpegEncoder::FFmpegEncoder (
        }
 
        _butler.reset (
-               new Butler(_player, map, _output_audio_channels, bind(&PlayerVideo::force, _1, FFmpegFileEncoder::pixel_format(format)), VIDEO_RANGE_VIDEO, true, false)
+               new Butler(_film, _player, map, _output_audio_channels, bind(&PlayerVideo::force, _1, FFmpegFileEncoder::pixel_format(format)), VIDEO_RANGE_VIDEO, true, false)
                );
 }
 
index e91cdc9a063c90bb2da61492771e6404b506f7ff..bca3631ab07a5ab811997948d3b7bc1c9503d22d 100644 (file)
@@ -212,6 +212,7 @@ FilmViewer::recreate_butler ()
 
        _butler.reset(
                new Butler(
+                       _film,
                        _player,
                        Config::instance()->audio_mapping(_audio_channels),
                        _audio_channels,
index 8e3e7222f0aac0695b3e6a1d6a7210d652aeb9d2..9340ebe75862336dc3315273f0ea569ac926e1be 100644 (file)
@@ -55,7 +55,7 @@ BOOST_AUTO_TEST_CASE (butler_test1)
                map.set (i, i, 1);
        }
 
-       Butler butler (shared_ptr<Player>(new Player(film)), map, 6, bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VIDEO_RANGE_FULL, false, false);
+       Butler butler (film, shared_ptr<Player>(new Player(film)), map, 6, bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VIDEO_RANGE_FULL, false, false);
 
        BOOST_CHECK (butler.get_video(true, 0).second == DCPTime());
        BOOST_CHECK (butler.get_video(true, 0).second == DCPTime::from_frames(1, 24));
index a2cf37866d18805bb7e404d8bdc2cbb9788329ba..05554f4edd82538079761cf2ca7db86220579196 100644 (file)
@@ -43,6 +43,7 @@ BOOST_AUTO_TEST_CASE (dcp_playback_test)
 
        shared_ptr<Butler> butler (
                new Butler(
+                       film,
                        shared_ptr<Player>(new Player(film)),
                        AudioMapping(6, 6),
                        6,
index 15fb4161deb1b3fa7e9e34b784d14b42b59b89ef..b5f082e743a7ddb4580ca716c3ed7f5a0a5fb79c 100644 (file)
@@ -218,7 +218,7 @@ BOOST_AUTO_TEST_CASE (player_seek_test)
        player->set_always_burn_open_subtitles ();
        player->set_play_referenced ();
 
-       shared_ptr<Butler> butler (new Butler (player, AudioMapping(), 2, bind(PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VIDEO_RANGE_FULL, false, true));
+       shared_ptr<Butler> butler (new Butler (film, player, AudioMapping(), 2, bind(PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VIDEO_RANGE_FULL, false, true));
        butler->disable_audio();
 
        for (int i = 0; i < 10; ++i) {
@@ -249,7 +249,7 @@ BOOST_AUTO_TEST_CASE (player_seek_test2)
        player->set_always_burn_open_subtitles ();
        player->set_play_referenced ();
 
-       shared_ptr<Butler> butler (new Butler(player, AudioMapping(), 2, bind(PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VIDEO_RANGE_FULL, false, true));
+       shared_ptr<Butler> butler (new Butler(film, player, AudioMapping(), 2, bind(PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VIDEO_RANGE_FULL, false, true));
        butler->disable_audio();
 
        butler->seek(DCPTime::from_seconds(5), true);
@@ -336,7 +336,7 @@ BOOST_AUTO_TEST_CASE (player_trim_crash)
 
        shared_ptr<Player> player (new Player(film));
        player->set_fast ();
-       shared_ptr<Butler> butler (new Butler(player, AudioMapping(), 6, bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VIDEO_RANGE_FULL, false, true));
+       shared_ptr<Butler> butler (new Butler(film, player, AudioMapping(), 6, bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VIDEO_RANGE_FULL, false, true));
 
        /* Wait for the butler to fill */
        dcpomatic_sleep_seconds (5);