+
+Frame
+FilmViewer::average_latency () const
+{
+ boost::mutex::scoped_lock lm (_latency_history_mutex);
+ if (_latency_history.empty()) {
+ return 0;
+ }
+
+ Frame total = 0;
+ BOOST_FOREACH (Frame i, _latency_history) {
+ total += i;
+ }
+
+ return total / _latency_history.size();
+}
+
+void
+FilmViewer::set_dcp_decode_reduction (optional<int> reduction)
+{
+ _dcp_decode_reduction = reduction;
+ if (_player) {
+ _player->set_dcp_decode_reduction (reduction);
+ }
+}
+
+optional<int>
+FilmViewer::dcp_decode_reduction () const
+{
+ return _dcp_decode_reduction;
+}
+
+DCPTime
+FilmViewer::one_video_frame () const
+{
+ return DCPTime::from_frames (1, _film->video_frame_rate());
+}