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));
}
}
- _black = Empty (_film, bind(&Content::video, _1));
- _silent = Empty (_film, bind(&Content::audio, _1));
+ _black = Empty (_film->content(), _film->length(), bind(&Content::video, _1));
+ _silent = Empty (_film->content(), _film->length(), bind(&Content::audio, _1));
_last_video_time = DCPTime ();
_last_audio_time = DCPTime ();
return;
}
- /* Time and period of the frame we will emit */
+ /* Time of the first frame we will emit */
DCPTime const time = content_video_to_dcp (piece, video.frame);
- DCPTimePeriod const period (time, time + one_video_frame());
/* Discard if it's outside the content's period or if it's before the last accurate seek */
if (
)
);
- emit_video (_last_video[wp], time);
+ DCPTime t = time;
+ for (int i = 0; i < frc.repeat; ++i) {
+ emit_video (_last_video[wp], t);
+ t += one_video_frame ();
+ }
}
void
void
Player::seek (DCPTime time, bool accurate)
{
+ if (!_have_valid_pieces) {
+ setup_pieces ();
+ }
+
if (_audio_processor) {
_audio_processor->flush ();
}
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);
+}