From 8b28cc4a101cb31ca3067a26e9e1d0e220724c59 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 01:05:45 +0200 Subject: Build fixes. --- test/kdm_cli_test.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/kdm_cli_test.cc b/test/kdm_cli_test.cc index 107a6210a..e300d82a5 100644 --- a/test/kdm_cli_test.cc +++ b/test/kdm_cli_test.cc @@ -25,6 +25,7 @@ #include "lib/screen.h" #include "lib/trusted_device.h" #include "test.h" +#include #include #include #include @@ -128,7 +129,7 @@ BOOST_AUTO_TEST_CASE(kdm_cli_select_cinema) auto error = run(args, output); BOOST_CHECK(!error); - BOOST_REQUIRE_EQUAL(output.size(), 2); + BOOST_REQUIRE_EQUAL(output.size(), 2U); BOOST_CHECK(boost::algorithm::starts_with(output[0], "Making KDMs valid from")); BOOST_CHECK_EQUAL(output[1], "Wrote 2 KDM files to build/test"); @@ -164,7 +165,7 @@ BOOST_AUTO_TEST_CASE(kdm_cli_select_screen) auto error = run(args, output); BOOST_CHECK(!error); - BOOST_REQUIRE_EQUAL(output.size(), 2); + BOOST_REQUIRE_EQUAL(output.size(), 2U); BOOST_CHECK(boost::algorithm::starts_with(output[0], "Making KDMs valid from")); BOOST_CHECK_EQUAL(output[1], "Wrote 1 KDM files to build/test"); -- cgit v1.2.3 From 4b102c1fdee4a68533415a759c6f47be33bf2626 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 00:42:20 +0200 Subject: const correctness for AudioMerger. --- src/lib/audio_merger.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/audio_merger.h b/src/lib/audio_merger.h index a6b7637f6..0201fcd4b 100644 --- a/src/lib/audio_merger.h +++ b/src/lib/audio_merger.h @@ -73,5 +73,5 @@ private: }; std::list _buffers; - int _frame_rate; + int const _frame_rate; }; -- cgit v1.2.3 From fea1b7402588644f107874a0102c8f3f428123f3 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 00:43:59 +0200 Subject: Some const-correctness for Player. --- src/lib/player.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/player.h b/src/lib/player.h index 694ee70b7..71b3cc464 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -163,9 +163,9 @@ private: */ mutable boost::mutex _mutex; - std::shared_ptr _film; + std::shared_ptr const _film; /** Playlist, or 0 if we are using the one from the _film */ - std::shared_ptr _playlist; + std::shared_ptr const _playlist; /** > 0 if we are suspended (i.e. pass() and seek() do nothing) */ boost::atomic _suspended; @@ -186,7 +186,7 @@ private: /** true if we should try to be fast rather than high quality */ bool _fast = false; /** true if we should keep going in the face of `survivable' errors */ - bool _tolerant = false; + bool const _tolerant; /** true if we should `play' (i.e output) referenced DCP data (e.g. for preview) */ bool _play_referenced = false; @@ -230,7 +230,7 @@ private: dcpomatic::DCPTime _playback_length; /** Alignment for subtitle images that we create */ - Image::Alignment _subtitle_alignment = Image::Alignment::PADDED; + Image::Alignment const _subtitle_alignment = Image::Alignment::PADDED; boost::signals2::scoped_connection _film_changed_connection; boost::signals2::scoped_connection _playlist_change_connection; -- cgit v1.2.3 From 6917c511507bee74297845267811e7bcc042e62e Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 00:45:11 +0200 Subject: Some improved logging. --- src/lib/ffmpeg_decoder.cc | 16 ++++++++++++++-- src/lib/player.cc | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index 331ab313d..250bce955 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -452,6 +452,8 @@ FFmpegDecoder::process_audio_frame (shared_ptr stream) auto frame = audio_frame (stream); auto data = deinterleave_audio (frame); + auto const time_base = stream->stream(_format_context)->time_base; + ContentTime ct; if (frame->pts == AV_NOPTS_VALUE) { /* In some streams we see not every frame coming through with a timestamp; for those @@ -464,8 +466,16 @@ FFmpegDecoder::process_audio_frame (shared_ptr stream) } else { ct = ContentTime::from_seconds ( frame->best_effort_timestamp * - av_q2d (stream->stream(_format_context)->time_base)) + av_q2d(time_base)) + _pts_offset; + LOG_DEBUG_PLAYER( + "Process audio with timestamp %1 (BET %2, timebase %3/%4, (PTS offset %5)", + to_string(ct), + frame->best_effort_timestamp, + time_base.num, + time_base.den, + to_string(_pts_offset) + ); } _next_time[stream] = ct + ContentTime::from_frames(data->frames(), stream->frame_rate()); @@ -485,7 +495,7 @@ FFmpegDecoder::process_audio_frame (shared_ptr stream) data->frames(), stream->id(), frame->best_effort_timestamp, - av_q2d(stream->stream(_format_context)->time_base), + av_q2d(time_base), to_string(_pts_offset) ); } @@ -508,6 +518,7 @@ FFmpegDecoder::decode_and_process_audio_packet (AVPacket* packet) auto context = _codec_context[stream->index(_format_context)]; auto frame = audio_frame (stream); + LOG_DEBUG_PLAYER("Send audio packet on stream %1", stream->index(_format_context)); int r = avcodec_send_packet (context, packet); if (r < 0) { LOG_WARNING("avcodec_send_packet returned %1 for an audio packet", r); @@ -516,6 +527,7 @@ FFmpegDecoder::decode_and_process_audio_packet (AVPacket* packet) r = avcodec_receive_frame (context, frame); if (r == AVERROR(EAGAIN)) { /* More input is required */ + LOG_DEBUG_PLAYER_NC("EAGAIN after trying to receive auido frame"); return; } diff --git a/src/lib/player.cc b/src/lib/player.cc index de9be2b71..b7088f1d2 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -778,7 +778,7 @@ Player::pass () ); if (latest_last_push_end != _stream_states.end()) { - LOG_DEBUG_PLAYER("Leading stream is in %1 at %2", latest_last_push_end->second.piece->content->path(0), to_string(latest_last_push_end->second.last_push_end)); + LOG_DEBUG_PLAYER("Leading audio stream is in %1 at %2", latest_last_push_end->second.piece->content->path(0), to_string(latest_last_push_end->second.last_push_end)); } /* Now make a list of those streams that are less than ignore_streams_behind behind the leader */ -- cgit v1.2.3 From 82c6dfe9f286e07bdaf3434593ce1c9bd0ee2677 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 15:29:17 +0200 Subject: Trim some includes. --- src/lib/j2k_encoder.cc | 1 - src/wx/closed_captions_dialog.h | 1 - 2 files changed, 2 deletions(-) diff --git a/src/lib/j2k_encoder.cc b/src/lib/j2k_encoder.cc index 53e1c272f..e6dab5828 100644 --- a/src/lib/j2k_encoder.cc +++ b/src/lib/j2k_encoder.cc @@ -34,7 +34,6 @@ #include "film.h" #include "j2k_encoder.h" #include "log.h" -#include "player.h" #include "player_video.h" #include "util.h" #include "writer.h" diff --git a/src/wx/closed_captions_dialog.h b/src/wx/closed_captions_dialog.h index 700b8922a..d31218526 100644 --- a/src/wx/closed_captions_dialog.h +++ b/src/wx/closed_captions_dialog.h @@ -20,7 +20,6 @@ #include "lib/dcpomatic_time.h" -#include "lib/player.h" #include "lib/text_ring_buffers.h" #include LIBDCP_DISABLE_WARNINGS -- cgit v1.2.3 From 7b4d4a6c2bc3f5a0f9216fdb8d96bbe952aa49ee Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 15:32:24 +0200 Subject: Use atomic for _ignore_video. --- src/lib/player.cc | 5 +++-- src/lib/player.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/lib/player.cc b/src/lib/player.cc index b7088f1d2..c04a43369 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -99,6 +99,7 @@ int const PlayerProperty::PLAYBACK_LENGTH = 705; Player::Player (shared_ptr film, Image::Alignment subtitle_alignment) : _film (film) , _suspended (0) + , _ignore_video(false) , _tolerant (film->tolerant()) , _audio_merger (_film->audio_frame_rate()) , _subtitle_alignment (subtitle_alignment) @@ -111,6 +112,7 @@ Player::Player (shared_ptr film, shared_ptr playlist : _film (film) , _playlist (playlist_) , _suspended (0) + , _ignore_video(false) , _tolerant (film->tolerant()) , _audio_merger (_film->audio_frame_rate()) { @@ -498,9 +500,8 @@ Player::get_subtitle_fonts () void Player::set_ignore_video () { - boost::mutex::scoped_lock lm (_mutex); _ignore_video = true; - setup_pieces_unlocked (); + setup_pieces(); } diff --git a/src/lib/player.h b/src/lib/player.h index 71b3cc464..c65ec40fe 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -178,7 +178,7 @@ private: std::shared_ptr _black_image; /** true if the player should ignore all video; i.e. never produce any */ - bool _ignore_video = false; + boost::atomic _ignore_video; bool _ignore_audio = false; /** true if the player should ignore all text; i.e. never produce any */ bool _ignore_text = false; -- cgit v1.2.3 From d3251244d0794414001eef5beafa22b67d650863 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 15:34:14 +0200 Subject: Use atomic for _ignore_audio. --- src/lib/player.cc | 5 +++-- src/lib/player.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/lib/player.cc b/src/lib/player.cc index c04a43369..ae76db5c4 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -100,6 +100,7 @@ Player::Player (shared_ptr film, Image::Alignment subtitle_alignment : _film (film) , _suspended (0) , _ignore_video(false) + , _ignore_audio(false) , _tolerant (film->tolerant()) , _audio_merger (_film->audio_frame_rate()) , _subtitle_alignment (subtitle_alignment) @@ -113,6 +114,7 @@ Player::Player (shared_ptr film, shared_ptr playlist , _playlist (playlist_) , _suspended (0) , _ignore_video(false) + , _ignore_audio(false) , _tolerant (film->tolerant()) , _audio_merger (_film->audio_frame_rate()) { @@ -508,9 +510,8 @@ Player::set_ignore_video () void Player::set_ignore_audio () { - boost::mutex::scoped_lock lm (_mutex); _ignore_audio = true; - setup_pieces_unlocked (); + setup_pieces(); } diff --git a/src/lib/player.h b/src/lib/player.h index c65ec40fe..03b7ffebd 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -179,7 +179,7 @@ private: /** true if the player should ignore all video; i.e. never produce any */ boost::atomic _ignore_video; - bool _ignore_audio = false; + boost::atomic _ignore_audio; /** true if the player should ignore all text; i.e. never produce any */ bool _ignore_text = false; bool _always_burn_open_subtitles = false; -- cgit v1.2.3 From d41c3bb9ebfb450316e6c79fdf0281ac2e155aa1 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 15:37:31 +0200 Subject: Use atomic for _ignore_text. --- src/lib/player.cc | 5 +++-- src/lib/player.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/lib/player.cc b/src/lib/player.cc index ae76db5c4..05e47b149 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -101,6 +101,7 @@ Player::Player (shared_ptr film, Image::Alignment subtitle_alignment , _suspended (0) , _ignore_video(false) , _ignore_audio(false) + , _ignore_text(false) , _tolerant (film->tolerant()) , _audio_merger (_film->audio_frame_rate()) , _subtitle_alignment (subtitle_alignment) @@ -115,6 +116,7 @@ Player::Player (shared_ptr film, shared_ptr playlist , _suspended (0) , _ignore_video(false) , _ignore_audio(false) + , _ignore_text(false) , _tolerant (film->tolerant()) , _audio_merger (_film->audio_frame_rate()) { @@ -518,9 +520,8 @@ Player::set_ignore_audio () void Player::set_ignore_text () { - boost::mutex::scoped_lock lm (_mutex); _ignore_text = true; - setup_pieces_unlocked (); + setup_pieces(); } diff --git a/src/lib/player.h b/src/lib/player.h index 03b7ffebd..18be9d40c 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -181,7 +181,7 @@ private: boost::atomic _ignore_video; boost::atomic _ignore_audio; /** true if the player should ignore all text; i.e. never produce any */ - bool _ignore_text = false; + boost::atomic _ignore_text; bool _always_burn_open_subtitles = false; /** true if we should try to be fast rather than high quality */ bool _fast = false; -- cgit v1.2.3 From c2febf6895f80b2d75cceb01bf0f9b0970c1b7d5 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 15:40:07 +0200 Subject: Use atomic for _always_burn_open_subtitles. --- src/lib/player.cc | 3 ++- src/lib/player.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lib/player.cc b/src/lib/player.cc index 05e47b149..eb92bbab1 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -102,6 +102,7 @@ Player::Player (shared_ptr film, Image::Alignment subtitle_alignment , _ignore_video(false) , _ignore_audio(false) , _ignore_text(false) + , _always_burn_open_subtitles(false) , _tolerant (film->tolerant()) , _audio_merger (_film->audio_frame_rate()) , _subtitle_alignment (subtitle_alignment) @@ -117,6 +118,7 @@ Player::Player (shared_ptr film, shared_ptr playlist , _ignore_video(false) , _ignore_audio(false) , _ignore_text(false) + , _always_burn_open_subtitles(false) , _tolerant (film->tolerant()) , _audio_merger (_film->audio_frame_rate()) { @@ -529,7 +531,6 @@ Player::set_ignore_text () void Player::set_always_burn_open_subtitles () { - boost::mutex::scoped_lock lm (_mutex); _always_burn_open_subtitles = true; } diff --git a/src/lib/player.h b/src/lib/player.h index 18be9d40c..bbc49c738 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -182,7 +182,7 @@ private: boost::atomic _ignore_audio; /** true if the player should ignore all text; i.e. never produce any */ boost::atomic _ignore_text; - bool _always_burn_open_subtitles = false; + boost::atomic _always_burn_open_subtitles; /** true if we should try to be fast rather than high quality */ bool _fast = false; /** true if we should keep going in the face of `survivable' errors */ -- cgit v1.2.3 From de522946acfd022b5084434fbcfd225499a17293 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 15:41:14 +0200 Subject: Use atomic for _fast. --- src/lib/player.cc | 5 +++-- src/lib/player.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/lib/player.cc b/src/lib/player.cc index eb92bbab1..6361d7b2a 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -103,6 +103,7 @@ Player::Player (shared_ptr film, Image::Alignment subtitle_alignment , _ignore_audio(false) , _ignore_text(false) , _always_burn_open_subtitles(false) + , _fast(false) , _tolerant (film->tolerant()) , _audio_merger (_film->audio_frame_rate()) , _subtitle_alignment (subtitle_alignment) @@ -119,6 +120,7 @@ Player::Player (shared_ptr film, shared_ptr playlist , _ignore_audio(false) , _ignore_text(false) , _always_burn_open_subtitles(false) + , _fast(false) , _tolerant (film->tolerant()) , _audio_merger (_film->audio_frame_rate()) { @@ -539,9 +541,8 @@ Player::set_always_burn_open_subtitles () void Player::set_fast () { - boost::mutex::scoped_lock lm (_mutex); _fast = true; - setup_pieces_unlocked (); + setup_pieces(); } diff --git a/src/lib/player.h b/src/lib/player.h index bbc49c738..d16666bc5 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -184,7 +184,7 @@ private: boost::atomic _ignore_text; boost::atomic _always_burn_open_subtitles; /** true if we should try to be fast rather than high quality */ - bool _fast = false; + boost::atomic _fast; /** true if we should keep going in the face of `survivable' errors */ bool const _tolerant; /** true if we should `play' (i.e output) referenced DCP data (e.g. for preview) */ -- cgit v1.2.3 From 167b5edb8a1760a8532b2973cd7cca70333249f1 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 15:43:18 +0200 Subject: Use atomic for _play_referenced. --- src/lib/player.cc | 5 +++-- src/lib/player.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/lib/player.cc b/src/lib/player.cc index 6361d7b2a..af963d50d 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -105,6 +105,7 @@ Player::Player (shared_ptr film, Image::Alignment subtitle_alignment , _always_burn_open_subtitles(false) , _fast(false) , _tolerant (film->tolerant()) + , _play_referenced(false) , _audio_merger (_film->audio_frame_rate()) , _subtitle_alignment (subtitle_alignment) { @@ -122,6 +123,7 @@ Player::Player (shared_ptr film, shared_ptr playlist , _always_burn_open_subtitles(false) , _fast(false) , _tolerant (film->tolerant()) + , _play_referenced(false) , _audio_merger (_film->audio_frame_rate()) { construct (); @@ -549,9 +551,8 @@ Player::set_fast () void Player::set_play_referenced () { - boost::mutex::scoped_lock lm (_mutex); _play_referenced = true; - setup_pieces_unlocked (); + setup_pieces(); } diff --git a/src/lib/player.h b/src/lib/player.h index d16666bc5..511a579a0 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -188,7 +188,7 @@ private: /** true if we should keep going in the face of `survivable' errors */ bool const _tolerant; /** true if we should `play' (i.e output) referenced DCP data (e.g. for preview) */ - bool _play_referenced = false; + boost::atomic _play_referenced; /** Time of the next video that we will emit, or the time of the last accurate seek */ boost::optional _next_video_time; -- cgit v1.2.3 From bd9098f7fa9f8415da12ac0f08a1087c68f6baf6 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 17:52:20 +0200 Subject: Use atomic for _video_container_size. --- src/lib/player.cc | 26 ++++++++++++-------------- src/lib/player.h | 3 +-- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/lib/player.cc b/src/lib/player.cc index af963d50d..a6cfd9367 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -345,17 +345,15 @@ Player::set_video_container_size (dcp::Size s) { Change (ChangeType::PENDING, PlayerProperty::VIDEO_CONTAINER_SIZE, false); - { - boost::mutex::scoped_lock lm (_mutex); - - if (s == _video_container_size) { - lm.unlock (); - Change (ChangeType::CANCELLED, PlayerProperty::VIDEO_CONTAINER_SIZE, false); - return; - } + if (s == _video_container_size) { + Change(ChangeType::CANCELLED, PlayerProperty::VIDEO_CONTAINER_SIZE, false); + return; + } - _video_container_size = s; + _video_container_size = s; + { + boost::mutex::scoped_lock lm (_mutex); _black_image = make_shared(AV_PIX_FMT_RGB24, _video_container_size, Image::Alignment::PADDED); _black_image->make_black (); } @@ -870,14 +868,14 @@ Player::open_subtitles_for_frame (DCPTime time) const } /* i.image will already have been scaled to fit _video_container_size */ - dcp::Size scaled_size (i.rectangle.width * _video_container_size.width, i.rectangle.height * _video_container_size.height); + dcp::Size scaled_size (i.rectangle.width * _video_container_size.load().width, i.rectangle.height * _video_container_size.load().height); captions.push_back ( PositionImage ( i.image, Position ( - lrint(_video_container_size.width * i.rectangle.x), - lrint(_video_container_size.height * i.rectangle.y) + lrint(_video_container_size.load().width * i.rectangle.x), + lrint(_video_container_size.load().height * i.rectangle.y) ) ) ); @@ -1140,8 +1138,8 @@ Player::bitmap_text_start (weak_ptr weak_piece, weak_ptr> get_subtitle_fonts (); std::list get_reel_assets (); dcp::Size video_container_size () const { - boost::mutex::scoped_lock lm (_mutex); return _video_container_size; } @@ -174,7 +173,7 @@ private: /** Size of the image we are rendering to; this may be the DCP frame size, or * the size of preview in a window. */ - dcp::Size _video_container_size; + boost::atomic _video_container_size; std::shared_ptr _black_image; /** true if the player should ignore all video; i.e. never produce any */ -- cgit v1.2.3 From 959034cec386965f41a781c3ae6929bf7b14318c Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 18:18:45 +0200 Subject: Use atomic for _dcp_decode_reduction. --- src/lib/player.cc | 17 ++++++----------- src/lib/player.h | 2 +- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/lib/player.cc b/src/lib/player.cc index a6cfd9367..c3fee45b4 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -1414,19 +1414,14 @@ Player::set_dcp_decode_reduction (optional reduction) { Change (ChangeType::PENDING, PlayerProperty::DCP_DECODE_REDUCTION, false); - { - boost::mutex::scoped_lock lm (_mutex); - - if (reduction == _dcp_decode_reduction) { - lm.unlock (); - Change (ChangeType::CANCELLED, PlayerProperty::DCP_DECODE_REDUCTION, false); - return; - } - - _dcp_decode_reduction = reduction; - setup_pieces_unlocked (); + if (reduction == _dcp_decode_reduction.load()) { + Change(ChangeType::CANCELLED, PlayerProperty::DCP_DECODE_REDUCTION, false); + return; } + _dcp_decode_reduction = reduction; + setup_pieces(); + Change (ChangeType::DONE, PlayerProperty::DCP_DECODE_REDUCTION, false); } diff --git a/src/lib/player.h b/src/lib/player.h index d586622c4..ce8b7cc5a 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -196,7 +196,7 @@ private: /** Time of the next audio that we will emit, or the time of the last accurate seek */ boost::optional _next_audio_time; - boost::optional _dcp_decode_reduction; + boost::atomic> _dcp_decode_reduction; typedef std::map, std::shared_ptr, std::owner_less>> LastVideoMap; LastVideoMap _last_video; -- cgit v1.2.3 From 64a27cef84b97edd665d4891efb8ba5c9d78b70f Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 18:32:08 +0200 Subject: Remove now-unused setup_pieces_unlocked() --- src/lib/player.cc | 12 +++--------- src/lib/player.h | 1 - 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/lib/player.cc b/src/lib/player.cc index c3fee45b4..0c0c68b3a 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -148,14 +148,6 @@ Player::construct () } -void -Player::setup_pieces () -{ - boost::mutex::scoped_lock lm (_mutex); - setup_pieces_unlocked (); -} - - bool have_video (shared_ptr content) { @@ -171,8 +163,10 @@ have_audio (shared_ptr content) void -Player::setup_pieces_unlocked () +Player::setup_pieces () { + boost::mutex::scoped_lock lm (_mutex); + _playback_length = _playlist ? _playlist->length(_film) : _film->length(); auto old_pieces = _pieces; diff --git a/src/lib/player.h b/src/lib/player.h index ce8b7cc5a..e52ca3ffe 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -126,7 +126,6 @@ private: void construct (); void setup_pieces (); - void setup_pieces_unlocked (); void film_change (ChangeType, Film::Property); void playlist_change (ChangeType); void playlist_content_change (ChangeType, int, bool); -- cgit v1.2.3 From 1c09ae94a4b94395ce2c13020a71526a65b9ce7e Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 18:39:12 +0200 Subject: const correctness. --- src/lib/player.cc | 4 ++-- src/lib/player.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/player.cc b/src/lib/player.cc index 0c0c68b3a..2793bd62a 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -1421,7 +1421,7 @@ Player::set_dcp_decode_reduction (optional reduction) optional -Player::content_time_to_dcp (shared_ptr content, ContentTime t) +Player::content_time_to_dcp (shared_ptr content, ContentTime t) const { boost::mutex::scoped_lock lm (_mutex); @@ -1437,7 +1437,7 @@ Player::content_time_to_dcp (shared_ptr content, ContentTime t) optional -Player::dcp_to_content_time (shared_ptr content, DCPTime t) +Player::dcp_to_content_time (shared_ptr content, DCPTime t) const { boost::mutex::scoped_lock lm (_mutex); diff --git a/src/lib/player.h b/src/lib/player.h index e52ca3ffe..31628941f 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -95,8 +95,8 @@ public: void set_play_referenced (); void set_dcp_decode_reduction (boost::optional reduction); - boost::optional content_time_to_dcp (std::shared_ptr content, dcpomatic::ContentTime t); - boost::optional dcp_to_content_time (std::shared_ptr content, dcpomatic::DCPTime t); + boost::optional content_time_to_dcp (std::shared_ptr content, dcpomatic::ContentTime t) const; + boost::optional dcp_to_content_time (std::shared_ptr content, dcpomatic::DCPTime t) const; boost::signals2::signal Change; -- cgit v1.2.3 From c8bd4ead4c9e757d88136a7fdd556272f36be793 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 19:09:07 +0200 Subject: Move get_reel_assets() out of Player, as it doesn't need to be there. --- src/lib/dcp_encoder.cc | 2 +- src/lib/player.cc | 93 -------------------------- src/lib/player.h | 2 +- src/lib/referenced_reel_asset.cc | 136 +++++++++++++++++++++++++++++++++++++++ src/lib/referenced_reel_asset.h | 12 ++++ src/lib/wscript | 1 + test/vf_test.cc | 3 +- 7 files changed, 152 insertions(+), 97 deletions(-) create mode 100644 src/lib/referenced_reel_asset.cc diff --git a/src/lib/dcp_encoder.cc b/src/lib/dcp_encoder.cc index e3443c1ad..e4cb76d79 100644 --- a/src/lib/dcp_encoder.cc +++ b/src/lib/dcp_encoder.cc @@ -109,7 +109,7 @@ DCPEncoder::go () while (!_player->pass ()) {} - for (auto i: _player->get_reel_assets()) { + for (auto i: get_referenced_reel_assets(_film, _film->playlist())) { _writer->write (i); } diff --git a/src/lib/player.cc b/src/lib/player.cc index 2793bd62a..13cd8f11b 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -47,7 +47,6 @@ #include "playlist.h" #include "ratio.h" #include "raw_image_proxy.h" -#include "referenced_reel_asset.h" #include "render_text.h" #include "shuffler.h" #include "text_content.h" @@ -548,98 +547,6 @@ Player::set_play_referenced () } -static void -maybe_add_asset (list& a, shared_ptr 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); - if (r->actual_duration() > 0) { - a.push_back ( - ReferencedReelAsset(r, DCPTimePeriod(from, from + DCPTime::from_frames(r->actual_duration(), ffr))) - ); - } -} - - -list -Player::get_reel_assets () -{ - /* Does not require a lock on _mutex as it's only called from DCPEncoder */ - - list reel_assets; - - for (auto content: playlist()->content()) { - auto dcp = dynamic_pointer_cast(content); - if (!dcp) { - continue; - } - - if (!dcp->reference_video() && !dcp->reference_audio() && !dcp->reference_text(TextType::OPEN_SUBTITLE) && !dcp->reference_text(TextType::CLOSED_CAPTION)) { - continue; - } - - scoped_ptr decoder; - try { - decoder.reset (new DCPDecoder(_film, dcp, false, false, shared_ptr())); - } catch (...) { - return reel_assets; - } - - auto const frame_rate = _film->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); - - Frame const trim_start = dcp->trim_start().frames_round(frame_rate); - Frame const trim_end = dcp->trim_end().frames_round(frame_rate); - - /* position in the asset from the start */ - int64_t offset_from_start = 0; - /* position i the asset from the end */ - int64_t offset_from_end = 0; - for (auto reel: decoder->reels()) { - /* Assume that main picture duration is the length of the reel */ - offset_from_end += reel->main_picture()->actual_duration(); - } - - for (auto reel: decoder->reels()) { - - /* Assume that main picture duration is the length of the reel */ - int64_t const reel_duration = reel->main_picture()->actual_duration(); - - /* See doc/design/trim_reels.svg */ - Frame const reel_trim_start = min(reel_duration, max(int64_t(0), trim_start - offset_from_start)); - Frame const reel_trim_end = min(reel_duration, max(int64_t(0), reel_duration - (offset_from_end - trim_end))); - - 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); - } - - if (dcp->reference_audio()) { - maybe_add_asset (reel_assets, reel->main_sound(), reel_trim_start, reel_trim_end, from, frame_rate); - } - - if (dcp->reference_text(TextType::OPEN_SUBTITLE)) { - 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); - } - } - - offset_from_start += reel_duration; - offset_from_end -= reel_duration; - } - } - - return reel_assets; -} - - bool Player::pass () { diff --git a/src/lib/player.h b/src/lib/player.h index 31628941f..e07cc8200 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -81,7 +81,7 @@ public: void seek (dcpomatic::DCPTime time, bool accurate); std::vector> get_subtitle_fonts (); - std::list get_reel_assets (); + dcp::Size video_container_size () const { return _video_container_size; } diff --git a/src/lib/referenced_reel_asset.cc b/src/lib/referenced_reel_asset.cc new file mode 100644 index 000000000..bd87b905a --- /dev/null +++ b/src/lib/referenced_reel_asset.cc @@ -0,0 +1,136 @@ +/* + Copyright (C) 2015 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + + +#include "dcp_content.h" +#include "dcp_decoder.h" +#include "dcpomatic_assert.h" +#include "film.h" +#include "playlist.h" +#include "referenced_reel_asset.h" +#include +#include +#include +#include +#include +#include +#include + + +using std::list; +using std::max; +using std::min; +using std::shared_ptr; +using boost::dynamic_pointer_cast; +using boost::scoped_ptr; +using namespace dcpomatic; + + +static void +maybe_add_asset (list& a, shared_ptr 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); + if (r->actual_duration() > 0) { + a.push_back ( + ReferencedReelAsset(r, DCPTimePeriod(from, from + DCPTime::from_frames(r->actual_duration(), ffr))) + ); + } +} + + + +/** @return Details of all the DCP assets in a playlist that are marked to refer to */ +list +get_referenced_reel_assets(shared_ptr film, shared_ptr playlist) +{ + list reel_assets; + + for (auto content: playlist->content()) { + auto dcp = dynamic_pointer_cast(content); + if (!dcp) { + continue; + } + + if (!dcp->reference_video() && !dcp->reference_audio() && !dcp->reference_text(TextType::OPEN_SUBTITLE) && !dcp->reference_text(TextType::CLOSED_CAPTION)) { + continue; + } + + scoped_ptr decoder; + try { + decoder.reset(new DCPDecoder(film, dcp, false, false, shared_ptr())); + } catch (...) { + return reel_assets; + } + + auto const frame_rate = film->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); + + Frame const trim_start = dcp->trim_start().frames_round(frame_rate); + Frame const trim_end = dcp->trim_end().frames_round(frame_rate); + + /* position in the asset from the start */ + int64_t offset_from_start = 0; + /* position i the asset from the end */ + int64_t offset_from_end = 0; + for (auto reel: decoder->reels()) { + /* Assume that main picture duration is the length of the reel */ + offset_from_end += reel->main_picture()->actual_duration(); + } + + for (auto reel: decoder->reels()) { + + /* Assume that main picture duration is the length of the reel */ + int64_t const reel_duration = reel->main_picture()->actual_duration(); + + /* See doc/design/trim_reels.svg */ + Frame const reel_trim_start = min(reel_duration, max(int64_t(0), trim_start - offset_from_start)); + Frame const reel_trim_end = min(reel_duration, max(int64_t(0), reel_duration - (offset_from_end - trim_end))); + + 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); + } + + if (dcp->reference_audio()) { + maybe_add_asset (reel_assets, reel->main_sound(), reel_trim_start, reel_trim_end, from, frame_rate); + } + + if (dcp->reference_text(TextType::OPEN_SUBTITLE)) { + 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); + } + } + + offset_from_start += reel_duration; + offset_from_end -= reel_duration; + } + } + + return reel_assets; +} + diff --git a/src/lib/referenced_reel_asset.h b/src/lib/referenced_reel_asset.h index 813d32148..23da7c028 100644 --- a/src/lib/referenced_reel_asset.h +++ b/src/lib/referenced_reel_asset.h @@ -18,11 +18,19 @@ */ + #ifndef DCPOMATIC_REFERENCED_REEL_ASSET_H #define DCPOMATIC_REFERENCED_REEL_ASSET_H + +#include "dcpomatic_time.h" #include + +class Film; +class Playlist; + + class ReferencedReelAsset { public: @@ -37,4 +45,8 @@ public: dcpomatic::DCPTimePeriod period; }; + +std::list get_referenced_reel_assets(std::shared_ptr film, std::shared_ptr playlist); + + #endif diff --git a/src/lib/wscript b/src/lib/wscript index b566a960c..55c4e735f 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -152,6 +152,7 @@ sources = """ ratio.cc raw_image_proxy.cc reel_writer.cc + referenced_reel_asset.cc release_notes.cc render_text.cc resampler.cc diff --git a/test/vf_test.cc b/test/vf_test.cc index f3ba156a1..32e7ae431 100644 --- a/test/vf_test.cc +++ b/test/vf_test.cc @@ -291,8 +291,7 @@ BOOST_AUTO_TEST_CASE (vf_test5) make_and_verify_dcp (vf, {dcp::VerificationNote::Code::EXTERNAL_ASSET}); /* Check that the selected reel assets are right */ - auto player = make_shared(vf, Image::Alignment::COMPACT); - auto a = player->get_reel_assets(); + auto a = get_referenced_reel_assets(vf, vf->playlist()); BOOST_REQUIRE_EQUAL (a.size(), 4U); auto i = a.begin(); BOOST_CHECK (i->period == DCPTimePeriod(DCPTime(0), DCPTime(960000))); -- cgit v1.2.3 From 6e168c52f2165c026c149581e2dfe3b2cd5c5298 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 19:13:58 +0200 Subject: It's now safe to get _video_container_size without the lock. --- src/lib/player.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib/player.cc b/src/lib/player.cc index 13cd8f11b..b3f11c800 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -307,10 +307,9 @@ Player::playlist_content_change (ChangeType type, int property, bool frequent) { if (property == VideoContentProperty::CROP) { if (type == ChangeType::DONE) { - auto const vcs = video_container_size(); boost::mutex::scoped_lock lm (_mutex); for (auto const& i: _delay) { - i.first->reset_metadata (_film, vcs); + i.first->reset_metadata(_film, _video_container_size); } } } else { -- cgit v1.2.3 From 78b87aaa0fc6ac7ba2b79409a38e472bd50d24a9 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 19:14:04 +0200 Subject: Use atomic for _playback_length. --- src/lib/player.cc | 4 ++-- src/lib/player.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/player.cc b/src/lib/player.cc index b3f11c800..9cc7e5d25 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -557,7 +557,7 @@ Player::pass () return false; } - if (_playback_length == DCPTime()) { + if (_playback_length.load() == DCPTime()) { /* Special; just give one black frame */ emit_video (black_player_video_frame(Eyes::BOTH), DCPTime()); return true; @@ -695,7 +695,7 @@ Player::pass () } } - auto pull_to = _playback_length; + auto pull_to = _playback_length.load(); for (auto const& i: alive_stream_states) { if (!i.second.piece->done && i.second.last_push_end < pull_to) { pull_to = i.second.last_push_end; diff --git a/src/lib/player.h b/src/lib/player.h index e07cc8200..388a160c7 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -225,7 +225,7 @@ private: ActiveText _active_texts[static_cast(TextType::COUNT)]; std::shared_ptr _audio_processor; - dcpomatic::DCPTime _playback_length; + boost::atomic _playback_length; /** Alignment for subtitle images that we create */ Image::Alignment const _subtitle_alignment = Image::Alignment::PADDED; -- cgit v1.2.3 From 3005c17f626e739b2f8d63f203a0b0a3240eb530 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 10 Sep 2022 20:14:27 +0200 Subject: Use atomic shared_ptr stuff for _black_frame. --- src/lib/player.cc | 12 ++++++------ src/lib/player.h | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/lib/player.cc b/src/lib/player.cc index 9cc7e5d25..0ff2c4032 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -344,11 +344,9 @@ Player::set_video_container_size (dcp::Size s) _video_container_size = s; - { - boost::mutex::scoped_lock lm (_mutex); - _black_image = make_shared(AV_PIX_FMT_RGB24, _video_container_size, Image::Alignment::PADDED); - _black_image->make_black (); - } + auto black = make_shared(AV_PIX_FMT_RGB24, _video_container_size, Image::Alignment::PADDED); + black->make_black (); + std::atomic_store(&_black_image, black); Change (ChangeType::DONE, PlayerProperty::VIDEO_CONTAINER_SIZE, false); } @@ -399,8 +397,10 @@ Player::film_change (ChangeType type, Film::Property p) shared_ptr Player::black_player_video_frame (Eyes eyes) const { + auto black = std::atomic_load(&_black_image); + return std::make_shared ( - std::make_shared(_black_image), + std::make_shared(black), Crop(), optional(), _video_container_size, diff --git a/src/lib/player.h b/src/lib/player.h index 388a160c7..5abd59de2 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -173,6 +173,7 @@ private: * the size of preview in a window. */ boost::atomic _video_container_size; + /** Should be accessed using the std::atomic... methods */ std::shared_ptr _black_image; /** true if the player should ignore all video; i.e. never produce any */ -- cgit v1.2.3