+
+ for (auto i: _closed_captions) {
+ i->asset_ref().resolve(assets);
+
+ /* Interop subtitle handling is all special cases */
+ if (i->asset_ref().resolved()) {
+ auto iop = dynamic_pointer_cast<InteropSubtitleAsset> (i->asset_ref().asset());
+ if (iop) {
+ iop->resolve_fonts (assets);
+ }
+ }
+ }
+
+ if (_atmos) {
+ _atmos->asset_ref().resolve (assets);
+ }
+}
+
+
+int64_t
+Reel::duration () const
+{
+ if (_main_picture) {
+ return _main_picture->actual_duration();
+ }
+
+ int64_t d = INT64_MAX;
+
+ if (_main_sound) {
+ d = min (d, _main_sound->actual_duration());
+ }
+ if (_main_subtitle) {
+ d = min (d, _main_subtitle->actual_duration());
+ }
+ if (_main_markers) {
+ d = min (d, _main_markers->actual_duration());
+ }
+ for (auto i: _closed_captions) {
+ d = min (d, i->actual_duration());
+ }
+ if (_atmos) {
+ d = min (d, _atmos->actual_duration());
+ }
+
+ DCP_ASSERT (d < INT64_MAX);
+
+ return d;