Enforce minimum reel length when using REELTYPE_BY_LENGTH.
[dcpomatic.git] / src / lib / film.cc
index 90b18ea707eb3e20c043160e482b18a8704c9688..5556c8e680ebd39595db3a4748aef4b81e14692b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2020 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -475,6 +475,10 @@ Film::read_metadata (optional<boost::filesystem::path> path)
                path = file (metadata_file);
        }
 
+       if (!boost::filesystem::exists(*path)) {
+               throw FileNotFoundError(*path);
+       }
+
        cxml::Document f ("Metadata");
        f.read_file (path.get ());
 
@@ -1650,8 +1654,10 @@ Film::reels () const
        case REELTYPE_BY_LENGTH:
        {
                DCPTime current;
-               /* Integer-divide reel length by the size of one frame to give the number of frames per reel */
-               Frame const reel_in_frames = _reel_length / ((j2k_bandwidth() / video_frame_rate()) / 8);
+               /* Integer-divide reel length by the size of one frame to give the number of frames per reel,
+                * making sure we don't go less than 1s long.
+                */
+               Frame const reel_in_frames = max(_reel_length / ((j2k_bandwidth() / video_frame_rate()) / 8), static_cast<Frame>(video_frame_rate()));
                while (current < len) {
                        DCPTime end = min (len, current + DCPTime::from_frames (reel_in_frames, video_frame_rate ()));
                        p.push_back (DCPTimePeriod (current, end));