diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/dcpomatic_time.h | 200 | ||||
| -rw-r--r-- | src/lib/grok/util.cc | 40 | ||||
| -rw-r--r-- | src/lib/hints.cc | 10 | ||||
| -rw-r--r-- | src/lib/hints.h | 2 | ||||
| -rw-r--r-- | src/lib/job.cc | 13 | ||||
| -rw-r--r-- | src/lib/reel_writer.cc | 68 | ||||
| -rw-r--r-- | src/lib/referenced_reel_asset.cc | 22 | ||||
| -rw-r--r-- | src/lib/referenced_reel_asset.h | 6 |
8 files changed, 198 insertions, 163 deletions
diff --git a/src/lib/dcpomatic_time.h b/src/lib/dcpomatic_time.h index 2adfef87b..fbbf473af 100644 --- a/src/lib/dcpomatic_time.h +++ b/src/lib/dcpomatic_time.h @@ -47,9 +47,9 @@ namespace dcpomatic { class HMSF { public: - HMSF () {} + HMSF() {} - HMSF (int h_, int m_, int s_, int f_) + HMSF(int h_, int m_, int s_, int f_) : h(h_) , m(m_) , s(s_) @@ -77,136 +77,136 @@ template <class S, class O> class Time { public: - Time () - : _t (0) + Time() + : _t(0) {} typedef int64_t Type; - explicit Time (Type t) - : _t (t) + explicit Time(Type t) + : _t(t) {} - explicit Time (Type n, Type d) - : _t (n * HZ / d) + explicit Time(Type n, Type d) + : _t(n * HZ / d) {} /* Explicit conversion from type O */ - Time (Time<O, S> d, FrameRateChange f); + Time(Time<O, S> d, FrameRateChange f); /** @param hmsf Hours, minutes, seconds, frames. * @param fps Frame rate */ - Time (HMSF const& hmsf, float fps) { - *this = from_seconds (hmsf.h * 3600) - + from_seconds (hmsf.m * 60) - + from_seconds (hmsf.s) - + from_frames (hmsf.f, fps); + Time(HMSF const& hmsf, float fps) { + *this = from_seconds(hmsf.h * 3600) + + from_seconds(hmsf.m * 60) + + from_seconds(hmsf.s) + + from_frames(hmsf.f, fps); } - Type get () const { + Type get() const { return _t; } - bool operator< (Time<S, O> const & o) const { + bool operator<(Time<S, O> const & o) const { return _t < o._t; } - bool operator<= (Time<S, O> const & o) const { + bool operator<=(Time<S, O> const & o) const { return _t <= o._t; } - bool operator== (Time<S, O> const & o) const { + bool operator==(Time<S, O> const & o) const { return _t == o._t; } - bool operator!= (Time<S, O> const & o) const { + bool operator!=(Time<S, O> const & o) const { return _t != o._t; } - bool operator>= (Time<S, O> const & o) const { + bool operator>=(Time<S, O> const & o) const { return _t >= o._t; } - bool operator> (Time<S, O> const & o) const { + bool operator>(Time<S, O> const & o) const { return _t > o._t; } - Time<S, O> operator+ (Time<S, O> const & o) const { - return Time<S, O> (_t + o._t); + Time<S, O> operator+(Time<S, O> const & o) const { + return Time<S, O>(_t + o._t); } - Time<S, O> & operator+= (Time<S, O> const & o) { + Time<S, O> & operator+=(Time<S, O> const & o) { _t += o._t; return *this; } - Time<S, O> operator- () const { - return Time<S, O> (-_t); + Time<S, O> operator-() const { + return Time<S, O>(-_t); } - Time<S, O> operator- (Time<S, O> const & o) const { - return Time<S, O> (_t - o._t); + Time<S, O> operator-(Time<S, O> const & o) const { + return Time<S, O>(_t - o._t); } - Time<S, O> & operator-= (Time<S, O> const & o) { + Time<S, O> & operator-=(Time<S, O> const & o) { _t -= o._t; return *this; } - Time<S, O> operator* (int o) const { - return Time<S, O> (_t * o); + Time<S, O> operator*(int o) const { + return Time<S, O>(_t * o); } - Time<S, O> operator/ (int o) const { - return Time<S, O> (_t / o); + Time<S, O> operator/(int o) const { + return Time<S, O>(_t / o); } /** Round up to the nearest sampling interval * at some sampling rate. * @param r Sampling rate. */ - Time<S, O> ceil (double r) const { - return Time<S, O> (llrint(HZ * frames_ceil(r) / r)); + Time<S, O> ceil(double r) const { + return Time<S, O>(llrint(HZ * frames_ceil(r) / r)); } - Time<S, O> floor (double r) const { - return Time<S, O> (llrint(HZ * frames_floor(r) / r)); + Time<S, O> floor(double r) const { + return Time<S, O>(llrint(HZ * frames_floor(r) / r)); } - Time<S, O> round (double r) const { - return Time<S, O> (llrint(HZ * frames_round(r) / r)); + Time<S, O> round(double r) const { + return Time<S, O>(llrint(HZ * frames_round(r) / r)); } - double seconds () const { - return double (_t) / HZ; + double seconds() const { + return double(_t) / HZ; } - Time<S, O> abs () const { - return Time<S, O> (std::abs(_t)); + Time<S, O> abs() const { + return Time<S, O>(std::abs(_t)); } template <typename T> - int64_t frames_round (T r) const { + int64_t frames_round(T r) const { /* We must cast to double here otherwise if T is integer the calculation will round down before we get the chance to llrint(). */ - return llrint (_t * double(r) / HZ); + return llrint(_t * double(r) / HZ); } template <typename T> - int64_t frames_floor (T r) const { - return ::floor (_t * r / HZ); + int64_t frames_floor(T r) const { + return ::floor(_t * r / HZ); } template <typename T> - int64_t frames_ceil (T r) const { + int64_t frames_ceil(T r) const { /* We must cast to double here otherwise if T is integer the calculation will round down before we get the chance to ceil(). */ - return ::ceil (_t * double(r) / HZ); + return ::ceil(_t * double(r) / HZ); } /** Split a time into hours, minutes, seconds and frames. @@ -214,12 +214,12 @@ public: * @return Split time. */ template <typename T> - HMSF split (T r) const + HMSF split(T r) const { /* Do this calculation with frames so that we can round to a frame boundary at the start rather than the end. */ - auto ff = frames_round (r); + auto ff = frames_round(r); HMSF hmsf; hmsf.h = ff / (3600 * r); @@ -229,39 +229,39 @@ public: hmsf.s = ff / r; ff -= static_cast<int64_t>(hmsf.s) * r; - hmsf.f = static_cast<int> (ff); + hmsf.f = static_cast<int>(ff); return hmsf; } template <typename T> - std::string timecode (T r) const { - auto hmsf = split (r); + std::string timecode(T r) const { + auto hmsf = split(r); char buffer[128]; - snprintf (buffer, sizeof(buffer), "%02d:%02d:%02d:%02d", hmsf.h, hmsf.m, hmsf.s, hmsf.f); + snprintf(buffer, sizeof(buffer), "%02d:%02d:%02d:%02d", hmsf.h, hmsf.m, hmsf.s, hmsf.f); return buffer; } - static Time<S, O> from_seconds (double s) { - return Time<S, O> (llrint (s * HZ)); + static Time<S, O> from_seconds(double s) { + return Time<S, O>(llrint(s * HZ)); } template <class T> - static Time<S, O> from_frames (int64_t f, T r) { - DCPOMATIC_ASSERT (r > 0); - return Time<S, O> (f * HZ / r); + static Time<S, O> from_frames(int64_t f, T r) { + DCPOMATIC_ASSERT(r > 0); + return Time<S, O>(f * HZ / r); } - static Time<S, O> delta () { - return Time<S, O> (1); + static Time<S, O> delta() { + return Time<S, O>(1); } - static Time<S, O> min () { - return Time<S, O> (-INT64_MAX); + static Time<S, O> min() { + return Time<S, O>(-INT64_MAX); } - static Time<S, O> max () { - return Time<S, O> (INT64_MAX); + static Time<S, O> max() { + return Time<S, O>(INT64_MAX); } static const int HZ = 96000; @@ -281,10 +281,10 @@ class DCPTimeDifferentiator {}; /* Specializations for the two allowed explicit conversions */ template<> -Time<ContentTimeDifferentiator, DCPTimeDifferentiator>::Time (Time<DCPTimeDifferentiator, ContentTimeDifferentiator> d, FrameRateChange f); +Time<ContentTimeDifferentiator, DCPTimeDifferentiator>::Time(Time<DCPTimeDifferentiator, ContentTimeDifferentiator> d, FrameRateChange f); template<> -Time<DCPTimeDifferentiator, ContentTimeDifferentiator>::Time (Time<ContentTimeDifferentiator, DCPTimeDifferentiator> d, FrameRateChange f); +Time<DCPTimeDifferentiator, ContentTimeDifferentiator>::Time(Time<ContentTimeDifferentiator, DCPTimeDifferentiator> d, FrameRateChange f); /** Time relative to the start or position of a piece of content in its native frame rate */ @@ -296,11 +296,11 @@ template <class T> class TimePeriod { public: - TimePeriod () {} + TimePeriod() {} - TimePeriod (T f, T t) - : from (f) - , to (t) + TimePeriod(T f, T t) + : from(f) + , to(t) {} /** start time of sampling interval that the period is from */ @@ -308,41 +308,45 @@ public: /** start time of next sampling interval after the period */ T to; - T duration () const { + T duration() const { return to - from; } - TimePeriod<T> operator+ (T const & o) const { - return TimePeriod<T> (from + o, to + o); + TimePeriod<T> operator+(T const & o) const { + return TimePeriod<T>(from + o, to + o); } - boost::optional<TimePeriod<T>> overlap (TimePeriod<T> const & other) const { - T const max_from = std::max (from, other.from); - T const min_to = std::min (to, other.to); + boost::optional<TimePeriod<T>> overlap(TimePeriod<T> const & other) const { + T const max_from = std::max(from, other.from); + T const min_to = std::min(to, other.to); if (max_from >= min_to) { return {}; } - return TimePeriod<T> (max_from, min_to); + return TimePeriod<T>(max_from, min_to); } - bool contains (T const & other) const { + bool contains(T const & other) const { return (from <= other && other < to); } - bool operator< (TimePeriod<T> const & o) const { + bool contains(TimePeriod<T> const& other) const { + return from <= other.from && to >= other.to; + } + + bool operator<(TimePeriod<T> const & o) const { if (from != o.from) { return from < o.from; } return to < o.to; } - bool operator== (TimePeriod<T> const & other) const { + bool operator==(TimePeriod<T> const & other) const { return from == other.from && to == other.to; } - bool operator!= (TimePeriod<T> const & other) const { + bool operator!=(TimePeriod<T> const & other) const { return !(*this == other); } }; @@ -352,35 +356,35 @@ public: * @param B Periods to subtract from `A', must be in ascending order of start time and must not overlap. */ template <class T> -std::list<TimePeriod<T>> subtract (TimePeriod<T> A, std::list<TimePeriod<T>> const & B) +std::list<TimePeriod<T>> subtract(TimePeriod<T> A, std::list<TimePeriod<T>> const & B) { std::list<TimePeriod<T>> result; - result.push_back (A); + result.push_back(A); for (auto i: B) { std::list<TimePeriod<T>> new_result; for (auto j: result) { - auto ov = i.overlap (j); + auto ov = i.overlap(j); if (ov) { if (*ov == i) { /* A contains all of B */ if (i.from != j.from) { - new_result.push_back (TimePeriod<T>(j.from, i.from)); + new_result.push_back(TimePeriod<T>(j.from, i.from)); } if (i.to != j.to) { - new_result.push_back (TimePeriod<T>(i.to, j.to)); + new_result.push_back(TimePeriod<T>(i.to, j.to)); } } else if (*ov == j) { /* B contains all of A */ } else if (i.from < j.from) { /* B overlaps start of A */ - new_result.push_back (TimePeriod<T>(i.to, j.to)); + new_result.push_back(TimePeriod<T>(i.to, j.to)); } else if (i.to > j.to) { /* B overlaps end of A */ - new_result.push_back (TimePeriod<T>(j.from, i.from)); + new_result.push_back(TimePeriod<T>(j.from, i.from)); } } else { - new_result.push_back (j); + new_result.push_back(j); } } result = new_result; @@ -394,13 +398,13 @@ typedef TimePeriod<ContentTime> ContentTimePeriod; typedef TimePeriod<DCPTime> DCPTimePeriod; -DCPTime min (DCPTime a, DCPTime b); -DCPTime max (DCPTime a, DCPTime b); -ContentTime min (ContentTime a, ContentTime b); -ContentTime max (ContentTime a, ContentTime b); -std::string to_string (ContentTime t); -std::string to_string (DCPTime t); -std::string to_string (DCPTimePeriod p); +DCPTime min(DCPTime a, DCPTime b); +DCPTime max(DCPTime a, DCPTime b); +ContentTime min(ContentTime a, ContentTime b); +ContentTime max(ContentTime a, ContentTime b); +std::string to_string(ContentTime t); +std::string to_string(DCPTime t); +std::string to_string(DCPTimePeriod p); } diff --git a/src/lib/grok/util.cc b/src/lib/grok/util.cc index 33847e8bb..a8ac9943d 100644 --- a/src/lib/grok/util.cc +++ b/src/lib/grok/util.cc @@ -64,28 +64,28 @@ get_gpu_names() namespace bp = boost::process::v2; try { - boost::asio::io_context context; - boost::asio::readable_pipe out{context}; - bp::process child(context, binary, {}, bp::process_stdio{{}, out, {}}); - - string output; - boost::system::error_code ec; - while (child.running()) { - string block; - boost::asio::read(out, boost::asio::dynamic_buffer(block), ec); - output += block; - if (ec && ec == boost::asio::error::eof) { - break; - } - } - - vector<string> lines; - boost::algorithm::split(lines, output, boost::is_any_of("\n")); - return lines; - } catch (std::exception& e) { + boost::asio::io_context context; + boost::asio::readable_pipe out{context}; + bp::process child(context, binary, {}, bp::process_stdio{{}, out, {}}); + + string output; + boost::system::error_code ec; + while (child.running()) { + string block; + boost::asio::read(out, boost::asio::dynamic_buffer(block), ec); + output += block; + if (ec && ec == boost::asio::error::eof) { + break; + } + } + + vector<string> lines; + boost::algorithm::split(lines, output, boost::is_any_of("\n")); + return lines; + } catch (std::exception& e) { LOG_ERROR("Could not fetch GPU names: {}", e.what()); return {}; - } + } #endif } diff --git a/src/lib/hints.cc b/src/lib/hints.cc index 533b56975..aa87d37b4 100644 --- a/src/lib/hints.cc +++ b/src/lib/hints.cc @@ -446,6 +446,10 @@ Hints::scan_content(shared_ptr<const Film> film) _analyser.get().write(film->audio_analysis_path(film->playlist())); check_loudness(); } + + if (_too_many_smpte_image_subtitles) { + hint(_("At least one reel contains too may image (PNG) subtitles, and making a DCP will fail. You need to split the DCP into more reels.")); + } } @@ -565,7 +569,11 @@ Hints::audio(shared_ptr<AudioBuffers> audio, DCPTime time) void Hints::text(PlayerText text, TextType type, optional<DCPTextTrack> track, DCPTimePeriod period) { - _writer->write(text, type, track, period); + try { + _writer->write(text, type, track, period); + } catch (dcp::SMPTETextAssetFullError&) { + _too_many_smpte_image_subtitles = true; + } switch (type) { case TextType::CLOSED_CAPTION: diff --git a/src/lib/hints.h b/src/lib/hints.h index 78cc615d3..ae6961eea 100644 --- a/src/lib/hints.h +++ b/src/lib/hints.h @@ -111,6 +111,8 @@ private: bool _very_long_subtitle = false; boost::optional<dcpomatic::DCPTimePeriod> _last_subtitle; + bool _too_many_smpte_image_subtitles = false; + std::atomic<bool> _stop; bool _disable_audio_analysis = false; diff --git a/src/lib/job.cc b/src/lib/job.cc index ab4f5c37a..8ab55dc92 100644 --- a/src/lib/job.cc +++ b/src/lib/job.cc @@ -288,6 +288,19 @@ Job::run_wrapper() set_progress(1); set_state(FINISHED_ERROR); + } catch (dcp::SMPTETextAssetFullError&) { + + set_error( + _("A bitmap (PNG) subtitle or font could not be written as its asset became full. Split the project up into more reels, " + "or set the subtitles to be 'burnt in', and try again." + ), + _("SMPTE text assets have a limit of 4096 'resources', which include PNG subtitles and fonts. " + "The limit is less likely to be hit if you use more reels." + )); + + set_progress(1); + set_state(FINISHED_ERROR); + } catch (std::exception& e) { set_error( diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc index 76c1f8124..1291207c4 100644 --- a/src/lib/reel_writer.cc +++ b/src/lib/reel_writer.cc @@ -21,17 +21,13 @@ #include "audio_buffers.h" #include "config.h" -#include "constants.h" -#include "cross.h" #include "dcpomatic_log.h" #include "digester.h" #include "film.h" #include "film_util.h" #include "frame_info.h" -#include "image.h" #include "image_png.h" #include "job.h" -#include "log.h" #include "reel_writer.h" #include "remembered_asset.h" #include <dcp/atmos_asset.h> @@ -61,10 +57,8 @@ using std::dynamic_pointer_cast; -using std::exception; using std::list; using std::make_shared; -using std::map; using std::set; using std::shared_ptr; using std::string; @@ -471,13 +465,19 @@ maybe_add_text( } else { /* We don't have a subtitle asset of our own; hopefully we have one to reference */ - for (auto j: refs) { - auto k = dynamic_pointer_cast<Result>(j.asset); - if (k && j.period == period) { - reel_asset = k; - /* If we have a hash for this asset in the CPL, assume that it is correct */ - if (k->hash()) { - k->asset_ref()->set_hash(k->hash().get()); + for (auto ref: refs) { + if (auto text = dynamic_pointer_cast<Result>(ref.asset)) { + if (ref.period.contains(period)) { + auto const vfr = film->video_frame_rate(); + reel_asset = text->clone(); + reel_asset->set_entry_point( + reel_asset->entry_point().get_value_or(0) + dcpomatic::DCPTime(period.from - ref.period.from).frames_round(vfr) + ); + reel_asset->set_duration(period.duration().frames_round(vfr)); + /* If we have a hash for this asset in the CPL, assume that it is correct */ + if (text->hash()) { + text->asset_ref()->set_hash(text->hash().get()); + } } } } @@ -516,13 +516,17 @@ ReelWriter::create_reel_picture(shared_ptr<dcp::Reel> reel, list<ReferencedReelA } else { LOG_GENERAL("no picture asset of our own; look through {}", refs.size()); /* We don't have a picture asset of our own; hopefully we have one to reference */ - for (auto j: refs) { - auto k = dynamic_pointer_cast<dcp::ReelPictureAsset>(j.asset); - if (k) { - LOG_GENERAL("candidate picture asset period is {}-{}", j.period.from.get(), j.period.to.get()); - } - if (k && j.period == _period) { - reel_asset = k; + for (auto ref: refs) { + if (auto picture = dynamic_pointer_cast<dcp::ReelPictureAsset>(ref.asset)) { + LOG_GENERAL("candidate picture asset period is {}-{}", ref.period.from.get(), ref.period.to.get()); + if (ref.period.contains(_period)) { + auto const vfr = film()->video_frame_rate(); + reel_asset = picture->clone(); + reel_asset->set_entry_point( + reel_asset->entry_point().get_value_or(0) + dcpomatic::DCPTime(_period.from - ref.period.from).frames_round(vfr) + ); + reel_asset->set_duration(_period.duration().frames_round(vfr)); + } } } } @@ -558,16 +562,20 @@ ReelWriter::create_reel_sound(shared_ptr<dcp::Reel> reel, list<ReferencedReelAss } else { LOG_GENERAL("no sound asset of our own; look through {}", refs.size()); /* We don't have a sound asset of our own; hopefully we have one to reference */ - for (auto j: refs) { - auto k = dynamic_pointer_cast<dcp::ReelSoundAsset>(j.asset); - if (k) { - LOG_GENERAL("candidate sound asset period is {}-{}", j.period.from.get(), j.period.to.get()); - } - if (k && j.period == _period) { - reel_asset = k; - /* If we have a hash for this asset in the CPL, assume that it is correct */ - if (k->hash()) { - k->asset_ref()->set_hash(k->hash().get()); + for (auto ref: refs) { + if (auto sound = dynamic_pointer_cast<dcp::ReelSoundAsset>(ref.asset)) { + LOG_GENERAL("candidate sound asset period is {}-{}", ref.period.from.get(), ref.period.to.get()); + if (ref.period.contains(_period)) { + auto const vfr = film()->video_frame_rate(); + reel_asset = sound->clone(); + reel_asset->set_entry_point( + reel_asset->entry_point().get_value_or(0) + dcpomatic::DCPTime(_period.from - ref.period.from).frames_round(vfr) + ); + reel_asset->set_duration(_period.duration().frames_round(vfr)); + /* If we have a hash for this asset in the CPL, assume that it is correct */ + if (sound->hash()) { + sound->asset_ref()->set_hash(sound->hash().get()); + } } } } diff --git a/src/lib/referenced_reel_asset.cc b/src/lib/referenced_reel_asset.cc index 5ef3b9ae7..afc6f4c06 100644 --- a/src/lib/referenced_reel_asset.cc +++ b/src/lib/referenced_reel_asset.cc @@ -43,13 +43,13 @@ using namespace dcpomatic; static void -maybe_add_asset (list<ReferencedReelAsset>& a, shared_ptr<dcp::ReelAsset> r, Frame reel_trim_start, Frame reel_trim_end, DCPTime from, int const ffr) +maybe_add_asset(list<ReferencedReelAsset>& a, shared_ptr<dcp::ReelAsset> r, Frame reel_trim_start, Frame reel_trim_end, DCPTime from, int const ffr) { - DCPOMATIC_ASSERT (r); - r->set_entry_point (r->entry_point().get_value_or(0) + reel_trim_start); - r->set_duration (r->actual_duration() - reel_trim_start - reel_trim_end); + DCPOMATIC_ASSERT(r); + r->set_entry_point(r->entry_point().get_value_or(0) + reel_trim_start); + r->set_duration(r->actual_duration() - reel_trim_start - reel_trim_end); if (r->actual_duration() > 0) { - a.push_back ( + a.push_back( ReferencedReelAsset(r, DCPTimePeriod(from, from + DCPTime::from_frames(r->actual_duration(), ffr))) ); } @@ -81,9 +81,9 @@ get_referenced_reel_assets(shared_ptr<const Film> film, shared_ptr<const Playlis } auto const frame_rate = film->video_frame_rate(); - DCPOMATIC_ASSERT (dcp->video_frame_rate()); + DCPOMATIC_ASSERT(dcp->video_frame_rate()); /* We should only be referencing if the DCP rate is the same as the film rate */ - DCPOMATIC_ASSERT (std::round(dcp->video_frame_rate().get()) == frame_rate); + DCPOMATIC_ASSERT(std::round(dcp->video_frame_rate().get()) == frame_rate); Frame const trim_start = dcp->trim_start().frames_round(frame_rate); Frame const trim_end = dcp->trim_end().frames_round(frame_rate); @@ -108,20 +108,20 @@ get_referenced_reel_assets(shared_ptr<const Film> film, shared_ptr<const Playlis auto const from = content->position() + std::max(DCPTime(), DCPTime::from_frames(offset_from_start - trim_start, frame_rate)); if (dcp->reference_video()) { - maybe_add_asset (reel_assets, reel->main_picture(), reel_trim_start, reel_trim_end, from, frame_rate); + maybe_add_asset(reel_assets, reel->main_picture(), reel_trim_start, reel_trim_end, from, frame_rate); } if (dcp->reference_audio()) { - maybe_add_asset (reel_assets, reel->main_sound(), reel_trim_start, reel_trim_end, from, frame_rate); + maybe_add_asset(reel_assets, reel->main_sound(), reel_trim_start, reel_trim_end, from, frame_rate); } if (dcp->reference_text(TextType::OPEN_SUBTITLE) && reel->main_subtitle()) { - maybe_add_asset (reel_assets, reel->main_subtitle(), reel_trim_start, reel_trim_end, from, frame_rate); + maybe_add_asset(reel_assets, reel->main_subtitle(), reel_trim_start, reel_trim_end, from, frame_rate); } if (dcp->reference_text(TextType::CLOSED_CAPTION)) { for (auto caption: reel->closed_captions()) { - maybe_add_asset (reel_assets, caption, reel_trim_start, reel_trim_end, from, frame_rate); + maybe_add_asset(reel_assets, caption, reel_trim_start, reel_trim_end, from, frame_rate); } } diff --git a/src/lib/referenced_reel_asset.h b/src/lib/referenced_reel_asset.h index 23da7c028..8e3cf847e 100644 --- a/src/lib/referenced_reel_asset.h +++ b/src/lib/referenced_reel_asset.h @@ -34,9 +34,9 @@ class Playlist; class ReferencedReelAsset { public: - ReferencedReelAsset (std::shared_ptr<dcp::ReelAsset> asset_, dcpomatic::DCPTimePeriod period_) - : asset (asset_) - , period (period_) + ReferencedReelAsset(std::shared_ptr<dcp::ReelAsset> asset_, dcpomatic::DCPTimePeriod period_) + : asset(asset_) + , period(period_) {} /** The asset */ |
