diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-07-15 16:36:49 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-07-15 16:36:49 +0100 |
| commit | 1bb4bd728a445de0728c897211bf079c714d4f41 (patch) | |
| tree | b4d606dafac8a3fc99d8ce362238c0e14bc9459b /test | |
| parent | 49c7639efbd0c7e014e9ddf3380b6d7f1fed9285 (diff) | |
Add some player tests. Fix seek with content at non-DCP frame rate. A few other small fixes.
Diffstat (limited to 'test')
| -rw-r--r-- | test/play_test.cc | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/test/play_test.cc b/test/play_test.cc new file mode 100644 index 000000000..12f80a282 --- /dev/null +++ b/test/play_test.cc @@ -0,0 +1,123 @@ +/* + Copyright (C) 2013 Carl Hetherington <cth@carlh.net> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "player.h" + +/* This test needs stuff in Player that is only included in debug mode */ +#ifdef DCPOMATIC_DEBUG + +using boost::optional; + +struct Video +{ + boost::shared_ptr<Content> content; + boost::shared_ptr<const Image> image; + Time time; +}; + +class PlayerWrapper +{ +public: + PlayerWrapper (shared_ptr<Player> p) + : _player (p) + { + _player->Video.connect (bind (&PlayerWrapper::process_video, this, _1, _2, _3)); + } + + void process_video (shared_ptr<const Image> i, bool, Time t) + { + Video v; + v.content = _player->_last_video; + v.image = i; + v.time = t; + _queue.push_front (v); + } + + optional<Video> get_video () + { + while (_queue.empty() && !_player->pass ()) {} + if (_queue.empty ()) { + return optional<Video> (); + } + + Video v = _queue.back (); + _queue.pop_back (); + return v; + } + + void seek (Time t, bool ac) + { + _player->seek (t, ac); + _queue.clear (); + } + +private: + shared_ptr<Player> _player; + std::list<Video> _queue; +}; + +BOOST_AUTO_TEST_CASE (play_test) +{ + shared_ptr<Film> film = new_test_film ("play_test"); + film->set_dcp_content_type (DCPContentType::from_dci_name ("FTR")); + film->set_container (Ratio::from_id ("185")); + film->set_name ("play_test"); + + shared_ptr<FFmpegContent> A (new FFmpegContent (film, "test/data/red_24.mp4")); + film->examine_and_add_content (A); + wait_for_jobs (); + + BOOST_CHECK_EQUAL (A->video_length(), 16); + + shared_ptr<FFmpegContent> B (new FFmpegContent (film, "test/data/red_30.mp4")); + film->examine_and_add_content (B); + wait_for_jobs (); + + BOOST_CHECK_EQUAL (B->video_length(), 16); + + /* Film should have been set to 25fps */ + BOOST_CHECK_EQUAL (film->dcp_video_frame_rate(), 25); + + BOOST_CHECK_EQUAL (A->start(), 0); + /* A is 16 frames long at 25 fps */ + BOOST_CHECK_EQUAL (B->start(), 16 * TIME_HZ / 25); + + shared_ptr<Player> player = film->player (); + PlayerWrapper wrap (player); + /* Seek and audio don't get on at the moment */ + player->disable_audio (); + + for (int i = 0; i < 32; ++i) { + optional<Video> v = wrap.get_video (); + BOOST_CHECK (v); + if (i < 16) { + BOOST_CHECK (v.get().content == A); + } else { + BOOST_CHECK (v.get().content == B); + } + } + + player->seek (10 * TIME_HZ / 25, true); + optional<Video> v = wrap.get_video (); + BOOST_CHECK (v); + cout << (v.get().time * 25 / TIME_HZ) << "\n"; + BOOST_CHECK_EQUAL (v.get().time, 10 * TIME_HZ / 25); +} + +#endif |
