Change how video timing is done.
[dcpomatic.git] / test / ffmpeg_decoder_seek_test.cc
index 87ac5040fffa642ec259fee463235434ec134765..f38ef3564a2004a0b49efb2fda7c929563c2fd39 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014-2015 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 
 */
 
+
 /** @file  test/ffmpeg_decoder_seek_test.cc
  *  @brief Check seek() with FFmpegDecoder.
- *  @ingroup specific
+ *  @ingroup selfcontained
  *
  *  This doesn't check that the contents of those frames are right, which
  *  it probably should.
  */
 
+
+#include "lib/content_video.h"
 #include "lib/ffmpeg_content.h"
 #include "lib/ffmpeg_decoder.h"
-#include "lib/null_log.h"
 #include "lib/film.h"
-#include "lib/content_video.h"
+#include "lib/null_log.h"
 #include "lib/video_decoder.h"
 #include "test.h"
-#include <boost/test/unit_test.hpp>
 #include <boost/filesystem.hpp>
-#include <vector>
+#include <boost/test/unit_test.hpp>
 #include <iostream>
+#include <vector>
+
 
 using std::cerr;
-using std::vector;
-using std::list;
 using std::cout;
-using boost::shared_ptr;
+using std::list;
+using std::make_shared;
+using std::shared_ptr;
+using std::vector;
 using boost::optional;
+#if BOOST_VERSION >= 106100
+using namespace boost::placeholders;
+#endif
+using namespace dcpomatic;
+
 
 static optional<ContentVideo> stored;
 static bool
@@ -53,53 +62,76 @@ store (ContentVideo v)
        return true;
 }
 
+
 static void
-check (shared_ptr<FFmpegDecoder> decoder, int frame)
+check (shared_ptr<FFmpegDecoder> decoder, ContentTime time)
 {
        BOOST_REQUIRE (decoder->ffmpeg_content()->video_frame_rate ());
-       decoder->seek (ContentTime::from_frames (frame, decoder->ffmpeg_content()->video_frame_rate().get()), true);
+       decoder->seek(time, true);
        stored = optional<ContentVideo> ();
        while (!decoder->pass() && !stored) {}
-       BOOST_CHECK (stored->frame <= frame);
+       BOOST_CHECK(stored->time <= time);
 }
 
+
 static void
-test (boost::filesystem::path file, vector<int> frames)
+test (boost::filesystem::path file, vector<ContentTime> times)
 {
-       boost::filesystem::path path = private_data / file;
+       auto path = TestPaths::private_data() / file;
        BOOST_REQUIRE (boost::filesystem::exists (path));
 
-       shared_ptr<Film> film = new_test_film ("ffmpeg_decoder_seek_test_" + file.string());
-       shared_ptr<FFmpegContent> content (new FFmpegContent (film, path));
+       auto film = new_test_film ("ffmpeg_decoder_seek_test_" + file.string());
+       auto content = make_shared<FFmpegContent>(path);
        film->examine_and_add_content (content);
-       wait_for_jobs ();
-       shared_ptr<Log> log (new NullLog);
-       shared_ptr<FFmpegDecoder> decoder (new FFmpegDecoder (content, log));
+       BOOST_REQUIRE (!wait_for_jobs());
+       auto decoder = make_shared<FFmpegDecoder>(film, content, false);
        decoder->video->Data.connect (bind (&store, _1));
 
-       for (vector<int>::const_iterator i = frames.begin(); i != frames.end(); ++i) {
-               check (decoder, *i);
+       for (auto i: times) {
+               check (decoder, i);
        }
 }
 
+
 BOOST_AUTO_TEST_CASE (ffmpeg_decoder_seek_test)
 {
-       vector<int> frames;
-
-       frames.clear ();
-       frames.push_back (0);
-       frames.push_back (42);
-       frames.push_back (999);
-       frames.push_back (0);
-
-       test ("boon_telly.mkv", frames);
-       test ("Sintel_Trailer1.480p.DivX_Plus_HD.mkv", frames);
-
-       frames.clear ();
-       frames.push_back (15);
-       frames.push_back (42);
-       frames.push_back (999);
-       frames.push_back (15);
-
-       test ("prophet_long_clip.mkv", frames);
+       test(
+               "boon_telly.mkv",
+               {
+                       ContentTime::from_frames(0, 29.97),
+                       ContentTime::from_frames(42, 29.97),
+                       ContentTime::from_frames(999, 29.97),
+                       ContentTime::from_frames(0, 29.97),
+               }
+           );
+
+       test(
+               "Sintel_Trailer1.480p.DivX_Plus_HD.mkv",
+               {
+                       ContentTime::from_frames(0, 24),
+                       ContentTime::from_frames(42, 24),
+                       ContentTime::from_frames(999, 24),
+                       ContentTime::from_frames(0, 24),
+               }
+           );
+
+       test(
+               "prophet_long_clip.mkv",
+               {
+                       ContentTime::from_frames(15, 23.976),
+                       ContentTime::from_frames(42, 23.976),
+                       ContentTime::from_frames(999, 23.976),
+                       ContentTime::from_frames(15, 23.976)
+               }
+           );
+
+       test(
+               "dolby_aurora.vob",
+               {
+                       ContentTime::from_frames(0, 25),
+                       ContentTime::from_frames(125, 25),
+                       ContentTime::from_frames(250, 25),
+                       ContentTime::from_frames(41, 25)
+               }
+           );
 }