}
pair<shared_ptr<PlayerVideo>, DCPTime> const r = _video.get ();
+ cout << "BGV " << to_string(r.second) << " " << _video.size() << "\n";
_summon.notify_all ();
return r;
}
void
Butler::video (shared_ptr<PlayerVideo> video, DCPTime time)
{
+ cout << "BV: " << to_string(time) << " " << _video.size() << " " << (float(_video.size()) / 24) << "\n";
boost::mutex::scoped_lock lm (_mutex);
if (_pending_seek_position) {
/* Don't store any video while a seek is pending */
void
Butler::audio (shared_ptr<AudioBuffers> audio)
{
+ cout << "BA: " << audio->frames() << " " << _audio.size() << " " << (float(_audio.size()) / 48000) << "\n";
{
boost::mutex::scoped_lock lm (_mutex);
if (_pending_seek_position || _disable_audio) {
Butler::get_audio (float* out, Frame frames)
{
bool const underrun = _audio.get (out, _audio_channels, frames);
+ cout << "BGA: " << frames << " " << _audio.size() << " " << (float(_audio.size()) / 48000) << "\n";
_summon.notify_all ();
return underrun;
}
void
Player::set_video_container_size (dcp::Size s)
{
- if (s == _video_container_size) {
- return;
- }
+ {
+ boost::mutex::scoped_lock lm (_mutex);
+
+ if (s == _video_container_size) {
+ return;
+ }
- _video_container_size = s;
+ _video_container_size = s;
- _black_image.reset (new Image (AV_PIX_FMT_RGB24, _video_container_size, true));
- _black_image->make_black ();
+ _black_image.reset (new Image (AV_PIX_FMT_RGB24, _video_container_size, true));
+ _black_image->make_black ();
+ }
Changed (PlayerProperty::VIDEO_CONTAINER_SIZE, false);
}
list<shared_ptr<Font> >
Player::get_subtitle_fonts ()
{
+ /* Does not require a lock on _mutex as it's only called from DCPEncoder */
+
if (!_have_valid_pieces) {
setup_pieces ();
}
void
Player::set_ignore_video ()
{
+ boost::mutex::scoped_lock lm (_mutex);
_ignore_video = true;
}
void
Player::set_ignore_text ()
{
+ boost::mutex::scoped_lock lm (_mutex);
_ignore_text = true;
}
void
Player::set_always_burn_open_subtitles ()
{
+ boost::mutex::scoped_lock lm (_mutex);
_always_burn_open_subtitles = true;
}
void
Player::set_fast ()
{
+ boost::mutex::scoped_lock lm (_mutex);
_fast = true;
_have_valid_pieces = false;
}
void
Player::set_play_referenced ()
{
+ boost::mutex::scoped_lock lm (_mutex);
_play_referenced = true;
_have_valid_pieces = false;
}
list<ReferencedReelAsset>
Player::get_reel_assets ()
{
+ /* Does not require a lock on _mutex as it's only called from DCPEncoder */
+
list<ReferencedReelAsset> a;
BOOST_FOREACH (shared_ptr<Content> i, _playlist->content ()) {
bool
Player::pass ()
{
+ boost::mutex::scoped_lock lm (_mutex);
+
if (!_have_valid_pieces) {
setup_pieces ();
}
list<PlayerText>
Player::closed_captions_for_frame (DCPTime time) const
{
+ boost::mutex::scoped_lock _lm (_mutex);
return _active_texts[TEXT_CLOSED_CAPTION].get (
DCPTimePeriod(time, time + DCPTime::from_frames(1, _film->video_frame_rate()))
);
void
Player::seek (DCPTime time, bool accurate)
{
+ boost::mutex::scoped_lock lm (_mutex);
+
if (!_have_valid_pieces) {
setup_pieces ();
}
void
Player::set_dcp_decode_reduction (optional<int> reduction)
{
- if (reduction == _dcp_decode_reduction) {
- return;
+ {
+ boost::mutex::scoped_lock lm (_mutex);
+
+ if (reduction == _dcp_decode_reduction) {
+ return;
+ }
+
+ _dcp_decode_reduction = reduction;
+ _have_valid_pieces = false;
}
- _dcp_decode_reduction = reduction;
- _have_valid_pieces = false;
Changed (PlayerProperty::DCP_DECODE_REDUCTION, false);
}
DCPTime
Player::content_time_to_dcp (shared_ptr<Content> content, ContentTime t)
{
+ boost::mutex::scoped_lock lm (_mutex);
+
if (_have_valid_pieces) {
setup_pieces ();
}
std::list<boost::shared_ptr<Font> > get_subtitle_fonts ();
std::list<ReferencedReelAsset> get_reel_assets ();
dcp::Size video_container_size () const {
+ boost::mutex::scoped_lock lm (_mutex);
return _video_container_size;
}
void do_emit_video (boost::shared_ptr<PlayerVideo> pv, DCPTime time);
void emit_audio (boost::shared_ptr<AudioBuffers> data, DCPTime time);
+ /** Mutex to protect the whole Player state. When it's used for the preview we have
+ seek() and pass() called from the Butler thread and lots of other stuff called
+ from the GUI thread.
+ */
+ mutable boost::mutex _mutex;
+
boost::shared_ptr<const Film> _film;
boost::shared_ptr<const Playlist> _playlist;