Implement Film::reels().
authorCarl Hetherington <cth@carlh.net>
Mon, 21 Sep 2015 09:42:39 +0000 (10:42 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 12 Oct 2015 10:05:26 +0000 (11:05 +0100)
src/lib/film.cc
test/wscript

index c0060b0400d9b4676bd86b783ef141b32e30e6b6..8cf46815020d82eb14e6b419ea3100d1e62e94f5 100644 (file)
@@ -1291,7 +1291,43 @@ list<DCPTimePeriod>
 Film::reels () const
 {
        list<DCPTimePeriod> p;
-       p.push_back (DCPTimePeriod (DCPTime (), length ()));
+       DCPTime const len = length ();
+
+       switch (reel_type ()) {
+       case REELTYPE_SINGLE:
+               p.push_back (DCPTimePeriod (DCPTime (), len));
+               break;
+       case REELTYPE_ONE_PER_VIDEO:
+       {
+               optional<DCPTime> last;
+               BOOST_FOREACH (shared_ptr<Content> c, content ()) {
+                       shared_ptr<VideoContent> v = dynamic_pointer_cast<VideoContent> (c);
+                       if (v) {
+                               if (last) {
+                                       p.push_back (DCPTimePeriod (last.get(), v->position ()));
+                               }
+                               last = v->position ();
+                       }
+               }
+               if (last) {
+                       p.push_back (DCPTimePeriod (last.get(), len));
+               }
+               break;
+       }
+       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);
+               while (current < len) {
+                       DCPTime end = min (len, current + DCPTime::from_frames (reel_in_frames, video_frame_rate ()));
+                       p.push_back (DCPTimePeriod (current, end));
+                       current = end;
+               }
+               break;
+       }
+       }
+
        return p;
 }
 
index 6ee995e36c114de49a6eb77fd2bdf1c6d069769b..89f84e836e87bf6d01f952751089dd9d648817f5 100644 (file)
@@ -71,6 +71,7 @@ def build(bld):
                  ratio_test.cc
                  repeat_frame_test.cc
                  recover_test.cc
+                 reels_test.cc
                  resampler_test.cc
                  scaling_test.cc
                  seek_zero_test.cc