Build fixes.
[dcpomatic.git] / test / ffmpeg_seek_test.cc
index f587d6cc6d91c69b64af555c80c561e7c1b56807..ccc59e0642c7a10bbf2af85b483c5d0065e3e85b 100644 (file)
 
 */
 
+/** @file  test/ffmpeg_seek_test.cc
+ *  @brief Test seek using Player with an FFmpegDecoder; note that the player
+ *  can hide problems with FFmpegDecoder seeking as it will skip frames / insert
+ *  black as it sees fit.
+ */
+
 #include <boost/test/unit_test.hpp>
 #include "lib/player.h"
 #include "lib/ffmpeg_decoder.h"
@@ -28,11 +34,13 @@ using std::cout;
 using std::string;
 using std::stringstream;
 using boost::shared_ptr;
+using boost::optional;
 
 #define FFMPEG_SEEK_TEST_DEBUG 1
 
-boost::optional<DCPTime> first_video;
-boost::optional<DCPTime> first_audio;
+optional<DCPTime> first_video;
+optional<DCPTime> first_audio;
+shared_ptr<Film> film;
 
 static void
 process_video (shared_ptr<PlayerImage>, Eyes, ColourConversion, bool, DCPTime t)
@@ -54,7 +62,7 @@ static string
 print_time (DCPTime t, float fps)
 {
        stringstream s;
-       s << t << " " << (float(t) / TIME_HZ) << "s " << (float(t) * fps / TIME_HZ) << "f";
+       s << t << " " << t.seconds() << "s " << t.frames (fps) << "f";
        return s.str ();
 }
 
@@ -77,18 +85,23 @@ check (shared_ptr<Player> p, DCPTime t)
        cout << "First video " << print_time (first_video.get(), 24) << "\n";
        cout << "First audio " << print_time (first_audio.get(), 24) << "\n";
 #endif 
-       
+
+       /* Outputs should be on or after seek time */
        BOOST_CHECK (first_video.get() >= t);
        BOOST_CHECK (first_audio.get() >= t);
+       /* And should be rounded to frame boundaries */
+       BOOST_CHECK (first_video.get() == first_video.get().round_up (film->video_frame_rate()));
+       BOOST_CHECK (first_audio.get() == first_audio.get().round_up (film->audio_frame_rate()));
 }
 
+/* Test basic seeking */
 BOOST_AUTO_TEST_CASE (ffmpeg_seek_test)
 {
-       shared_ptr<Film> film = new_test_film ("ffmpeg_audio_test");
-       film->set_name ("ffmpeg_audio_test");
+       film = new_test_film ("ffmpeg_seek_test");
+       film->set_name ("ffmpeg_seek_test");
        film->set_container (Ratio::from_id ("185"));
        shared_ptr<FFmpegContent> c (new FFmpegContent (film, "test/data/staircase.mov"));
-       c->set_ratio (Ratio::from_id ("185"));
+       c->set_scale (VideoContentScale (Ratio::from_id ("185")));
        film->examine_and_add_content (c);
 
        wait_for_jobs ();
@@ -97,10 +110,8 @@ BOOST_AUTO_TEST_CASE (ffmpeg_seek_test)
        player->Video.connect (boost::bind (&process_video, _1, _2, _3, _4, _5));
        player->Audio.connect (boost::bind (&process_audio, _1, _2));
 
-       check (player, 0);
-       check (player, 0.1 * TIME_HZ);
-       check (player, 0.2 * TIME_HZ);
-       check (player, 0.3 * TIME_HZ);
+       check (player, DCPTime::from_seconds (0));
+       check (player, DCPTime::from_seconds (0.1));
+       check (player, DCPTime::from_seconds (0.2));
+       check (player, DCPTime::from_seconds (0.3));
 }
-
-