From 457ae1e940e6f9bee3b701dbb3062712bbe1ca6f Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 20 Oct 2022 00:27:15 +0200 Subject: [PATCH] Expand Player to support main and sign language video types. --- src/lib/butler.cc | 2 +- src/lib/dcp_film_encoder.cc | 6 +- src/lib/player.cc | 205 +++++++++++++++++++++++------------- src/lib/player.h | 34 +++--- src/lib/player_video.cc | 5 + src/lib/player_video.h | 7 ++ src/lib/util.cc | 12 +++ src/lib/util.h | 1 + test/client_server_test.cc | 4 + test/j2k_encoder_test.cc | 1 + test/low_bitrate_test.cc | 1 + test/overlap_video_test.cc | 2 +- test/player_test.cc | 10 +- 13 files changed, 194 insertions(+), 96 deletions(-) diff --git a/src/lib/butler.cc b/src/lib/butler.cc index dd9874587..fbbd84408 100644 --- a/src/lib/butler.cc +++ b/src/lib/butler.cc @@ -410,7 +410,7 @@ Butler::player_change (ChangeType type, int property) if (type == ChangeType::DONE) { auto film = _film.lock(); if (film) { - _video.reset_metadata(film, _player.video_container_size()); + _video.reset_metadata(film, _player.video_container_size(VideoType::MAIN)); } } return; diff --git a/src/lib/dcp_film_encoder.cc b/src/lib/dcp_film_encoder.cc index 83da57756..60b2198ca 100644 --- a/src/lib/dcp_film_encoder.cc +++ b/src/lib/dcp_film_encoder.cc @@ -156,12 +156,16 @@ DCPFilmEncoder::resume() _encoder->resume(); } + void DCPFilmEncoder::video(shared_ptr data, DCPTime time) { - _encoder->encode(data, time); + if (data->type() == VideoType::MAIN) { + _encoder->encode(data, time); + } } + void DCPFilmEncoder::audio(shared_ptr data, DCPTime time) { diff --git a/src/lib/player.cc b/src/lib/player.cc index 14cd95906..41c9d4cfe 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -28,6 +28,7 @@ #include "config.h" #include "content_audio.h" #include "content_video.h" +#include "constants.h" #include "dcp_content.h" #include "dcp_decoder.h" #include "dcpomatic_log.h" @@ -132,14 +133,32 @@ Player::Player (shared_ptr film, shared_ptr playlist } +dcp::Size +Player::full_size(VideoType type) const +{ + switch (type) { + case VideoType::MAIN: + { + auto film = _film.lock(); + DCPOMATIC_ASSERT(film); + return film->frame_size(); + } + case VideoType::SIGN_LANGUAGE: + return { 480, 640 }; + default: + DCPOMATIC_ASSERT(false); + } +} + + void Player::construct () { - auto film = _film.lock(); - DCPOMATIC_ASSERT(film); - connect(); - set_video_container_size(film->frame_size()); + set_video_container_size(VideoType::MAIN, full_size(VideoType::MAIN)); + set_video_container_size(VideoType::SIGN_LANGUAGE, full_size(VideoType::SIGN_LANGUAGE)); + + _black_image[VideoType::SIGN_LANGUAGE] = make_shared(AV_PIX_FMT_RGB24, dcp::Size(SIGN_LANGUAGE_WIDTH, SIGN_LANGUAGE_HEIGHT), Image::Alignment::PADDED); film_change(ChangeType::DONE, FilmProperty::AUDIO_PROCESSOR); @@ -168,7 +187,7 @@ Player::Player(Player&& other) , _playlist(std::move(other._playlist)) , _suspended(other._suspended.load()) , _pieces(std::move(other._pieces)) - , _video_container_size(other._video_container_size.load()) + , _video_container_size(other._video_container_size) , _black_image(std::move(other._black_image)) , _ignore_video(other._ignore_video.load()) , _ignore_audio(other._ignore_audio.load()) @@ -208,7 +227,7 @@ Player::operator=(Player&& other) _playlist = std::move(other._playlist); _suspended = other._suspended.load(); _pieces = std::move(other._pieces); - _video_container_size = other._video_container_size.load(); + _video_container_size = other._video_container_size; _black_image = std::move(other._black_image); _ignore_video = other._ignore_video.load(); _ignore_audio = other._ignore_audio.load(); @@ -240,9 +259,12 @@ Player::operator=(Player&& other) bool -have_video (shared_ptr content) +have_video(shared_ptr content, VideoType type) { - return static_cast(content->video) && content->video->use() && content->can_be_played(); + return static_cast(content->video) + && content->video->use() + && content->can_be_played() + && content->video->type() == type; } @@ -406,10 +428,15 @@ Player::setup_pieces () } } - _black = Empty(film, playlist(), bind(&have_video, _1), _playback_length); + _have_sign_language = contains_sign_language(playlist_content); + + _black[VideoType::MAIN] = Empty(film, playlist(), bind(&have_video, _1, VideoType::MAIN), _playback_length); + if (_have_sign_language) { + _black[VideoType::SIGN_LANGUAGE] = Empty(film, playlist(), bind(&have_video, _1, VideoType::SIGN_LANGUAGE), _playback_length); + } _silent = Empty(film, playlist(), bind(&have_audio, _1), _playback_length); - _next_video_time = boost::none; + _next_video_time[VideoType::MAIN] = _next_video_time[VideoType::SIGN_LANGUAGE] = boost::none; _next_audio_time = boost::none; } @@ -426,7 +453,7 @@ Player::playlist_content_change (ChangeType type, int property, bool frequent) if (type == ChangeType::DONE) { boost::mutex::scoped_lock lm (_mutex); for (auto const& i: _delay) { - i.first->reset_metadata(film, _video_container_size); + i.first->reset_metadata(film, video_container_size(VideoType::MAIN)); } } } else { @@ -450,21 +477,22 @@ Player::playlist_content_change (ChangeType type, int property, bool frequent) void -Player::set_video_container_size (dcp::Size s) +Player::set_video_container_size(VideoType type, dcp::Size size) { ChangeSignaller cc(this, PlayerProperty::VIDEO_CONTAINER_SIZE); - if (s == _video_container_size) { + if (size == video_container_size(type)) { cc.abort(); return; } - _video_container_size = s; + boost::mutex::scoped_lock lm(_video_container_size_mutex); + _video_container_size[type] = size; { boost::mutex::scoped_lock lm(_black_image_mutex); - _black_image = make_shared(AV_PIX_FMT_RGB24, _video_container_size, Image::Alignment::PADDED); - _black_image->make_black (); + _black_image[type] = make_shared(AV_PIX_FMT_RGB24, _video_container_size[type], Image::Alignment::PADDED); + _black_image[type]->make_black(); } } @@ -517,16 +545,19 @@ Player::film_change(ChangeType type, FilmProperty p) shared_ptr -Player::black_player_video_frame (Eyes eyes) const +Player::black_player_video_frame(VideoType type, Eyes eyes) const { boost::mutex::scoped_lock lm(_black_image_mutex); + auto const image = _black_image[type]; + return std::make_shared ( - make_shared(_black_image), + make_shared(image), Crop(), optional(), - _video_container_size, - _video_container_size, + image->size(), + image->size(), + type, eyes, Part::WHOLE, PresetColourConversion::all().front().conversion, @@ -733,7 +764,8 @@ Player::pass () if (_playback_length.load() == DCPTime() || !film) { /* Special; just give one black frame */ - use_video(black_player_video_frame(Eyes::BOTH), DCPTime(), one_video_frame()); + use_video(black_player_video_frame(VideoType::MAIN, Eyes::BOTH), DCPTime(), one_video_frame()); + use_video(black_player_video_frame(VideoType::SIGN_LANGUAGE, Eyes::BOTH), DCPTime(), one_video_frame()); return true; } @@ -752,14 +784,22 @@ Player::pass () SILENT } which = NONE; + optional black_type; + if (earliest_content) { which = CONTENT; } - if (!_black.done() && !_ignore_video && (!earliest_time || _black.position() < *earliest_time)) { - earliest_time = _black.position (); - which = BLACK; - } + auto check_black = [this, &earliest_time, &which, &black_type](VideoType type) { + if (!_black[type].done() && !_ignore_video && (!earliest_time || _black[type].position() < *earliest_time)) { + earliest_time = _black[type].position(); + which = BLACK; + black_type = type; + } + }; + + check_black(VideoType::MAIN); + check_black(VideoType::SIGN_LANGUAGE); if (!_silent.done() && !_ignore_audio && (!earliest_time || _silent.position() < *earliest_time)) { earliest_time = _silent.position (); @@ -774,7 +814,7 @@ Player::pass () auto dcp = dynamic_pointer_cast(earliest_content->content); if (dcp && !_play_referenced) { if (dcp->reference_video()) { - _next_video_time = dcp->end(film); + _next_video_time[earliest_content->content->video->type()] = dcp->end(film); } if (dcp->reference_audio()) { /* We are skipping some referenced DCP audio content, so we need to update _next_audio_time @@ -787,21 +827,25 @@ Player::pass () break; } case BLACK: - LOG_DEBUG_PLAYER ("Emit black for gap at %1", to_string(_black.position())); - if (!_next_video_time) { + { + DCPOMATIC_ASSERT(black_type); + auto& black = _black[*black_type]; + LOG_DEBUG_PLAYER("Emit black for gap at %1", to_string(black.position())); + if (!_next_video_time[*black_type]) { /* Deciding to emit black has the same effect as getting some video from the content * when we are inaccurately seeking. */ - _next_video_time = _black.position(); + _next_video_time[*black_type] = black.position(); } if (film->three_d()) { - use_video(black_player_video_frame(Eyes::LEFT), _black.position(), _black.period_at_position().to); - use_video(black_player_video_frame(Eyes::RIGHT), _black.position(), _black.period_at_position().to); + use_video(black_player_video_frame(*black_type, Eyes::LEFT), black.position(), black.period_at_position().to); + use_video(black_player_video_frame(*black_type, Eyes::RIGHT), black.position(), black.period_at_position().to); } else { - use_video(black_player_video_frame(Eyes::BOTH), _black.position(), _black.period_at_position().to); + use_video(black_player_video_frame(*black_type, Eyes::BOTH), black.position(), black.period_at_position().to); } - _black.set_position (_black.position() + one_video_frame()); + black.set_position(black.position() + one_video_frame()); break; + } case SILENT: { LOG_DEBUG_PLAYER ("Emit silence for gap at %1", to_string(_silent.position())); @@ -901,9 +945,12 @@ Player::pass () } if (done) { - if (_next_video_time) { + if (_next_video_time[VideoType::MAIN]) { LOG_DEBUG_PLAYER("Done: emit video until end of film at %1", to_string(film->length())); - emit_video_until(film->length()); + emit_video_until(VideoType::MAIN, film->length()); + } + if (_next_video_time[VideoType::SIGN_LANGUAGE] && _have_sign_language) { + emit_video_until(VideoType::SIGN_LANGUAGE, film->length()); } if (_shuffler) { @@ -929,6 +976,7 @@ Player::open_subtitles_for_frame (DCPTime time) const list captions; int const vfr = film->video_frame_rate(); + auto const container = video_container_size(VideoType::MAIN); for ( auto j: @@ -941,15 +989,15 @@ Player::open_subtitles_for_frame (DCPTime time) const continue; } - /* i.image will already have been scaled to fit _video_container_size */ - dcp::Size scaled_size (i.rectangle.width * _video_container_size.load().width, i.rectangle.height * _video_container_size.load().height); + /* i.image will already have been scaled to fit video_container_size */ + dcp::Size scaled_size(i.rectangle.width * container.width, i.rectangle.height * container.height); captions.push_back ( PositionImage ( i.image, Position ( - lrint(_video_container_size.load().width * i.rectangle.x), - lrint(_video_container_size.load().height * i.rectangle.y) + lrint(container.width * i.rectangle.x), + lrint(container.height * i.rectangle.y) ) ) ); @@ -957,7 +1005,7 @@ Player::open_subtitles_for_frame (DCPTime time) const /* String subtitles (rendered to an image) */ if (!j.string.empty()) { - auto s = render_text(j.string, _video_container_size, time, vfr); + auto s = render_text(j.string, container, time, vfr); copy_if(s.begin(), s.end(), back_inserter(captions), [](PositionImage const& image) { return image.image->size().width && image.image->size().height; }); @@ -974,17 +1022,17 @@ Player::open_subtitles_for_frame (DCPTime time) const void -Player::emit_video_until(DCPTime time) +Player::emit_video_until(VideoType type, DCPTime time) { - LOG_DEBUG_PLAYER("emit_video_until %1; next video time is %2", to_string(time), to_string(_next_video_time.get_value_or({}))); - auto frame = [this](shared_ptr pv, DCPTime time) { + LOG_DEBUG_PLAYER("emit_video_until %1; next video time is %2", to_string(time), to_string(_next_video_time[type].get_value_or({}))); + auto frame = [this, type](shared_ptr pv, DCPTime time) { /* We need a delay to give a little wiggle room to ensure that relevant subtitles arrive at the player before the video that requires them. */ _delay.push_back(make_pair(pv, time)); if (pv->eyes() == Eyes::BOTH || pv->eyes() == Eyes::RIGHT) { - _next_video_time = time + one_video_frame(); + _next_video_time[type] = time + one_video_frame(); } if (_delay.size() < 3) { @@ -998,12 +1046,12 @@ Player::emit_video_until(DCPTime time) auto const age_threshold = one_video_frame() * 2; - while (_next_video_time.get_value_or({}) < time) { - auto left = _last_video[Eyes::LEFT]; - auto right = _last_video[Eyes::RIGHT]; - auto both = _last_video[Eyes::BOTH]; + while (_next_video_time[type].get_value_or({}) < time) { + auto left = _last_video[type][Eyes::LEFT]; + auto right = _last_video[type][Eyes::RIGHT]; + auto both = _last_video[type][Eyes::BOTH]; - auto const next = _next_video_time.get_value_or({}); + auto const next = _next_video_time[type].get_value_or({}); if ( left.first && @@ -1020,10 +1068,10 @@ Player::emit_video_until(DCPTime time) } else { auto film = _film.lock(); if (film && film->three_d()) { - frame(black_player_video_frame(Eyes::LEFT), next); - frame(black_player_video_frame(Eyes::RIGHT), next); + frame(black_player_video_frame(type, Eyes::LEFT), next); + frame(black_player_video_frame(type, Eyes::RIGHT), next); } else { - frame(black_player_video_frame(Eyes::BOTH), next); + frame(black_player_video_frame(type, Eyes::BOTH), next); } LOG_DEBUG_PLAYER("Black selected for DCP %1", to_string(next)); } @@ -1043,7 +1091,8 @@ Player::video (weak_ptr weak_piece, ContentVideo video) return; } - if (!piece->content->video->use()) { + auto const content_video = piece->content->video; + if (!content_video->use()) { return; } @@ -1053,6 +1102,7 @@ Player::video (weak_ptr weak_piece, ContentVideo video) } vector eyes_to_emit; + auto const type = content_video->type(); if (!film->three_d()) { if (video.eyes == Eyes::RIGHT) { @@ -1091,12 +1141,11 @@ Player::video (weak_ptr weak_piece, ContentVideo video) return; } - if (!_next_video_time) { - _next_video_time = time.round(film->video_frame_rate()); + if (!_next_video_time[type]) { + /* XXX: round to 24fps for SL? */ + _next_video_time[type] = time.round(film->video_frame_rate()); } - auto const content_video = piece->content->video; - auto scaled_size = content_video->scaled_size(film->frame_size()); DCPOMATIC_ASSERT(scaled_size); @@ -1108,11 +1157,12 @@ Player::video (weak_ptr weak_piece, ContentVideo video) content_video->fade(film, video.time), scale_for_display( *scaled_size, - _video_container_size, - film->frame_size(), + video_container_size(type), + full_size(type), content_video->pixel_quanta() ), - _video_container_size, + video_container_size(type), + type, eyes, video.part, content_video->colour_conversion(), @@ -1130,9 +1180,9 @@ Player::video (weak_ptr weak_piece, ContentVideo video) void Player::use_video(shared_ptr pv, DCPTime time, DCPTime end) { - _last_video[pv->eyes()] = { pv, time }; + _last_video[pv->type()][pv->eyes()] = { pv, time }; if (pv->eyes() != Eyes::LEFT) { - emit_video_until(std::min(time + one_video_frame() / 2, end)); + emit_video_until(pv->type(), std::min(time + one_video_frame() / 2, end)); } } @@ -1263,8 +1313,9 @@ Player::bitmap_text_start (weak_ptr weak_piece, weak_ptr pv, DCPTime time) { - if (pv->eyes() == Eyes::BOTH || pv->eyes() == Eyes::RIGHT) { - std::for_each(_active_texts.begin(), _active_texts.end(), [time](ActiveText& a) { a.clear_before(time); }); - } + if (pv->type() == VideoType::MAIN) { + if (pv->eyes() == Eyes::BOTH || pv->eyes() == Eyes::RIGHT) { + std::for_each(_active_texts.begin(), _active_texts.end(), [time](ActiveText& a) { a.clear_before(time); }); + } - auto subtitles = open_subtitles_for_frame (time); - if (subtitles) { - pv->set_text (subtitles.get ()); + auto subtitles = open_subtitles_for_frame (time); + if (subtitles) { + pv->set_text (subtitles.get ()); + } } Video (pv, time); diff --git a/src/lib/player.h b/src/lib/player.h index 314031698..fc734e035 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -39,6 +39,7 @@ #include "player_text.h" #include "position_image.h" #include "shuffler.h" +#include "video_type.h" #include #include @@ -95,11 +96,16 @@ public: std::vector> get_subtitle_fonts (); - dcp::Size video_container_size () const { - return _video_container_size; + dcp::Size video_container_size(VideoType type) const { + boost::mutex::scoped_lock lm(_video_container_size_mutex); + return _video_container_size[type]; } - void set_video_container_size (dcp::Size); + bool have_sign_language() const { + return _have_sign_language; + } + + void set_video_container_size(VideoType type, dcp::Size size); void set_ignore_video (); void set_ignore_audio (); void set_ignore_text (); @@ -156,10 +162,11 @@ private: dcpomatic::DCPTime resampled_audio_to_dcp (std::shared_ptr piece, Frame f) const; dcpomatic::ContentTime dcp_to_content_time (std::shared_ptr piece, dcpomatic::DCPTime t) const; dcpomatic::DCPTime content_time_to_dcp (std::shared_ptr piece, dcpomatic::ContentTime t) const; - std::shared_ptr black_player_video_frame (Eyes eyes) const; - void emit_video_until(dcpomatic::DCPTime time); + std::shared_ptr black_player_video_frame(VideoType type, Eyes eyes) const; + void emit_video_until(VideoType type, dcpomatic::DCPTime time); void insert_video(std::shared_ptr pv, dcpomatic::DCPTime time, dcpomatic::DCPTime end); std::pair, boost::optional> earliest_piece_and_time() const; + dcp::Size full_size(VideoType type) const; void video (std::weak_ptr, ContentVideo); void audio (std::weak_ptr, AudioStreamPtr, ContentAudio); @@ -193,13 +200,16 @@ private: boost::atomic _suspended; std::vector> _pieces; - /** Size of the image we are rendering to; this may be the DCP frame size, or - * the size of preview in a window. + boost::atomic _have_sign_language; + + mutable boost::mutex _video_container_size_mutex; + /** Size of the images we are rendering to; for the MAIN video this + * may be the DCP frame size, or the size of preview in a window. */ - boost::atomic _video_container_size; + EnumIndexedVector _video_container_size; mutable boost::mutex _black_image_mutex; - std::shared_ptr _black_image; + EnumIndexedVector, VideoType> _black_image; /** true if the player should ignore all video; i.e. never produce any */ boost::atomic _ignore_video; @@ -215,13 +225,13 @@ private: 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; + EnumIndexedVector, VideoType> _next_video_time; /** Time of the next audio that we will emit, or the time of the last accurate seek */ boost::optional _next_audio_time; boost::atomic> _dcp_decode_reduction; - EnumIndexedVector, dcpomatic::DCPTime>, Eyes> _last_video; + EnumIndexedVector, dcpomatic::DCPTime>, Eyes>, VideoType> _last_video; AudioMerger _audio_merger; std::unique_ptr _shuffler; @@ -241,7 +251,7 @@ private: }; std::map _stream_states; - Empty _black; + EnumIndexedVector _black; Empty _silent; EnumIndexedVector _active_texts; diff --git a/src/lib/player_video.cc b/src/lib/player_video.cc index 247301d58..76a512f09 100644 --- a/src/lib/player_video.cc +++ b/src/lib/player_video.cc @@ -54,6 +54,7 @@ PlayerVideo::PlayerVideo ( boost::optional fade, dcp::Size inter_size, dcp::Size out_size, + VideoType type, Eyes eyes, Part part, optional colour_conversion, @@ -67,6 +68,7 @@ PlayerVideo::PlayerVideo ( , _fade (fade) , _inter_size (inter_size) , _out_size (out_size) + , _type(type) , _eyes (eyes) , _part (part) , _colour_conversion (colour_conversion) @@ -87,6 +89,7 @@ PlayerVideo::PlayerVideo (shared_ptr node, shared_ptr socket _inter_size = dcp::Size (node->number_child ("InterWidth"), node->number_child ("InterHeight")); _out_size = dcp::Size (node->number_child ("OutWidth"), node->number_child ("OutHeight")); _eyes = static_cast(node->number_child("Eyes")); + _type = static_cast(node->number_child("Type")); _part = static_cast(node->number_child("Part")); _video_range = static_cast(node->number_child("VideoRange")); _error = node->optional_bool_child("Error").get_value_or (false); @@ -212,6 +215,7 @@ PlayerVideo::add_metadata(xmlpp::Element* element) const cxml::add_text_child(element, "OutWidth", raw_convert(_out_size.width)); cxml::add_text_child(element, "OutHeight", raw_convert(_out_size.height)); cxml::add_text_child(element, "Eyes", raw_convert(static_cast(_eyes))); + cxml::add_text_child(element, "Type", raw_convert(static_cast(_type))); cxml::add_text_child(element, "Part", raw_convert(static_cast(_part))); cxml::add_text_child(element, "VideoRange", raw_convert(static_cast(_video_range))); cxml::add_text_child(element, "Error", _error ? "1" : "0"); @@ -339,6 +343,7 @@ PlayerVideo::shallow_copy () const _fade, _inter_size, _out_size, + _type, _eyes, _part, _colour_conversion, diff --git a/src/lib/player_video.h b/src/lib/player_video.h index e2968749c..f15adeaed 100644 --- a/src/lib/player_video.h +++ b/src/lib/player_video.h @@ -29,6 +29,7 @@ #include "position.h" #include "position_image.h" #include "types.h" +#include "video_type.h" extern "C" { #include } @@ -54,6 +55,7 @@ public: boost::optional fade, dcp::Size inter_size, dcp::Size out_size, + VideoType type, Eyes eyes, Part part, boost::optional colour_conversion, @@ -98,6 +100,10 @@ public: _eyes = e; } + VideoType type() const { + return _type; + } + boost::optional colour_conversion () const { return _colour_conversion; } @@ -134,6 +140,7 @@ private: boost::optional _fade; dcp::Size _inter_size; dcp::Size _out_size; + VideoType _type; Eyes _eyes; Part _part; boost::optional _colour_conversion; diff --git a/src/lib/util.cc b/src/lib/util.cc index 172b8d763..2b03f8d79 100644 --- a/src/lib/util.cc +++ b/src/lib/util.cc @@ -1199,3 +1199,15 @@ join_strings(vector const& in, string const& separator) }); } + +bool +contains_sign_language(ContentList const& content) +{ + return std::any_of( + content.begin(), + content.end(), + [](shared_ptr c) { + return c->video && c->video->type() == VideoType::SIGN_LANGUAGE; + }); +} + diff --git a/src/lib/util.h b/src/lib/util.h index 7c40c5ce8..0a89bc9fc 100644 --- a/src/lib/util.h +++ b/src/lib/util.h @@ -102,6 +102,7 @@ extern void capture_ffmpeg_logs(); extern void setup_grok_library_path(); #endif extern std::string join_strings(std::vector const& in, std::string const& separator = " "); +extern bool contains_sign_language(ContentList const& content); template diff --git a/test/client_server_test.cc b/test/client_server_test.cc index 43084bf31..c1b77caee 100644 --- a/test/client_server_test.cc +++ b/test/client_server_test.cc @@ -100,6 +100,7 @@ BOOST_AUTO_TEST_CASE (client_server_test_rgb) optional (), dcp::Size (1998, 1080), dcp::Size (1998, 1080), + VideoType::MAIN, Eyes::BOTH, Part::WHOLE, ColourConversion(), @@ -179,6 +180,7 @@ BOOST_AUTO_TEST_CASE (client_server_test_yuv) optional(), dcp::Size(1998, 1080), dcp::Size(1998, 1080), + VideoType::MAIN, Eyes::BOTH, Part::WHOLE, ColourConversion(), @@ -245,6 +247,7 @@ BOOST_AUTO_TEST_CASE (client_server_test_j2k) optional(), dcp::Size(1998, 1080), dcp::Size(1998, 1080), + VideoType::MAIN, Eyes::BOTH, Part::WHOLE, ColourConversion(), @@ -270,6 +273,7 @@ BOOST_AUTO_TEST_CASE (client_server_test_j2k) optional(), dcp::Size(1998, 1080), dcp::Size(1998, 1080), + VideoType::MAIN, Eyes::BOTH, Part::WHOLE, PresetColourConversion::all().front().conversion, diff --git a/test/j2k_encoder_test.cc b/test/j2k_encoder_test.cc index 083a61cf8..9bcbcd51a 100644 --- a/test/j2k_encoder_test.cc +++ b/test/j2k_encoder_test.cc @@ -66,6 +66,7 @@ BOOST_AUTO_TEST_CASE(j2k_encoder_deadlock_test) optional(), dcp::Size(1998, 1080), dcp::Size(1998, 1080), + VideoType::MAIN, Eyes::BOTH, Part::WHOLE, optional(), diff --git a/test/low_bitrate_test.cc b/test/low_bitrate_test.cc index 52b8d54be..575b12d27 100644 --- a/test/low_bitrate_test.cc +++ b/test/low_bitrate_test.cc @@ -47,6 +47,7 @@ BOOST_AUTO_TEST_CASE (low_bitrate_test) boost::optional(), dcp::Size(1998, 1080), dcp::Size(1998, 1080), + VideoType::MAIN, Eyes::BOTH, Part::WHOLE, boost::optional(), diff --git a/test/overlap_video_test.cc b/test/overlap_video_test.cc index 01d7a9fcb..516a6fb0e 100644 --- a/test/overlap_video_test.cc +++ b/test/overlap_video_test.cc @@ -76,7 +76,7 @@ BOOST_AUTO_TEST_CASE (overlap_video_test1) BOOST_CHECK(pieces[0]->ignore_video[0] == dcpomatic::DCPTimePeriod(dcpomatic::DCPTime::from_seconds(1), dcpomatic::DCPTime::from_seconds(1) + B->length_after_trim(film))); BOOST_CHECK(pieces[0]->ignore_video[1] == dcpomatic::DCPTimePeriod(dcpomatic::DCPTime::from_seconds(3), dcpomatic::DCPTime::from_seconds(3) + C->length_after_trim(film))); - BOOST_CHECK (player->_black.done()); + BOOST_CHECK(player->_black[VideoType::MAIN].done()); make_and_verify_dcp (film); diff --git a/test/player_test.cc b/test/player_test.cc index cac5dffe9..bb1f0df71 100644 --- a/test/player_test.cc +++ b/test/player_test.cc @@ -155,11 +155,11 @@ BOOST_AUTO_TEST_CASE (player_subframe_test) BOOST_CHECK (film->length() == DCPTime::from_frames(3 * 24 + 1, 24)); Player player(film, Image::Alignment::COMPACT); - player.setup_pieces(); - BOOST_REQUIRE_EQUAL(player._black._periods.size(), 1U); - BOOST_CHECK(player._black._periods.front() == DCPTimePeriod(DCPTime::from_frames(3 * 24, 24), DCPTime::from_frames(3 * 24 + 1, 24))); - BOOST_REQUIRE_EQUAL(player._silent._periods.size(), 1U); - BOOST_CHECK(player._silent._periods.front() == DCPTimePeriod(DCPTime(289920), DCPTime::from_frames(3 * 24 + 1, 24))); + player.setup_pieces (); + BOOST_REQUIRE_EQUAL(player._black[VideoType::MAIN]._periods.size(), 1U); + BOOST_CHECK(player._black[VideoType::MAIN]._periods.front() == DCPTimePeriod(DCPTime::from_frames(3 * 24, 24), DCPTime::from_frames(3 * 24 + 1, 24))); + BOOST_REQUIRE_EQUAL (player._silent._periods.size(), 1U); + BOOST_CHECK (player._silent._periods.front() == DCPTimePeriod(DCPTime(289920), DCPTime::from_frames(3 * 24 + 1, 24))); } -- 2.30.2