- int64_t offset = 0;
- BOOST_FOREACH (shared_ptr<dcp::Reel> k, decoder->reels()) {
-
- DCPOMATIC_ASSERT (j->video_frame_rate ());
- double const cfr = j->video_frame_rate().get();
- Frame const trim_start = j->trim_start().frames_round (cfr);
- Frame const trim_end = j->trim_end().frames_round (cfr);
- int const ffr = _film->video_frame_rate ();
-
- DCPTime const from = i->position() + DCPTime::from_frames (offset, _film->video_frame_rate());
- if (j->reference_video ()) {
- shared_ptr<dcp::ReelAsset> ra = k->main_picture ();
- DCPOMATIC_ASSERT (ra);
- ra->set_entry_point (ra->entry_point() + trim_start);
- ra->set_duration (ra->duration() - trim_start - trim_end);
- a.push_back (
- ReferencedReelAsset (ra, DCPTimePeriod (from, from + DCPTime::from_frames (ra->duration(), ffr)))
- );
+ DCPOMATIC_ASSERT (dcp->video_frame_rate());
+ double const cfr = dcp->video_frame_rate().get();
+ Frame const trim_start = dcp->trim_start().frames_round(cfr);
+ Frame const trim_end = dcp->trim_end().frames_round(cfr);
+ int const ffr = _film->video_frame_rate ();
+
+ /* position in the asset from the start */
+ int64_t offset_from_start = 0;
+ /* position i the asset from the end */
+ int64_t offset_from_end = 0;
+ for (auto k: decoder->reels()) {
+ /* Assume that main picture duration is the length of the reel */
+ offset_from_end += k->main_picture()->actual_duration();
+ }
+
+ for (auto reel: decoder->reels()) {
+
+ /* Assume that main picture duration is the length of the reel */
+ int64_t const reel_duration = reel->main_picture()->actual_duration();
+
+ /* See doc/design/trim_reels.svg */
+ Frame const reel_trim_start = min(reel_duration, max(int64_t(0), trim_start - offset_from_start));
+ Frame const reel_trim_end = min(reel_duration, max(int64_t(0), reel_duration - (offset_from_end - trim_end)));
+
+ auto const from = content->position() + DCPTime::from_frames(offset_from_start, ffr);
+ if (dcp->reference_video()) {
+ maybe_add_asset (reel_assets, reel->main_picture(), reel_trim_start, reel_trim_end, from, ffr);