Basics of forced reduction of JPEG2000 decode resolution.
[dcpomatic.git] / src / lib / player.cc
index 3d191a302db213f651e8a3a02bfb3b8d5ed5b375..7e21ef937b82a98f5ff3198ac07c2ea0a469cbfb 100644 (file)
@@ -127,7 +127,10 @@ Player::setup_pieces ()
 
                shared_ptr<DCPDecoder> dcp = dynamic_pointer_cast<DCPDecoder> (decoder);
                if (dcp && _play_referenced) {
-                       dcp->set_decode_referenced ();
+                       if (_play_referenced) {
+                               dcp->set_decode_referenced ();
+                       }
+                       dcp->set_forced_reduction (_dcp_decode_reduction);
                }
 
                shared_ptr<Piece> piece (new Piece (i, decoder, frc));
@@ -850,6 +853,10 @@ Player::subtitle_stop (weak_ptr<Piece> wp, ContentTime to)
 void
 Player::seek (DCPTime time, bool accurate)
 {
+       if (!_have_valid_pieces) {
+               setup_pieces ();
+       }
+
        if (_audio_processor) {
                _audio_processor->flush ();
        }
@@ -950,3 +957,15 @@ Player::discard_audio (shared_ptr<const AudioBuffers> audio, DCPTime time, DCPTi
        cut->copy_from (audio.get(), remaining_frames, discard_frames, 0);
        return make_pair(cut, time + discard_time);
 }
+
+void
+Player::set_dcp_decode_reduction (optional<int> reduction)
+{
+       if (reduction == _dcp_decode_reduction) {
+               return;
+       }
+
+       _dcp_decode_reduction = reduction;
+       _have_valid_pieces = false;
+       Changed (false);
+}