From 11fe3ab56ad59b8b5525fa795d44d2323ef6d5b8 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 19 Jul 2018 21:33:52 +0100 Subject: [PATCH] Get types into ReelWriter. --- src/lib/dcp_encoder.cc | 10 +++++----- src/lib/dcp_encoder.h | 4 ++-- src/lib/player.cc | 2 +- src/lib/player.h | 4 ++-- src/lib/reel_writer.cc | 4 +++- src/lib/reel_writer.h | 2 +- src/lib/writer.cc | 20 +++++++++++--------- src/lib/writer.h | 4 ++-- 8 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/lib/dcp_encoder.cc b/src/lib/dcp_encoder.cc index c38d73276..cfc7da903 100644 --- a/src/lib/dcp_encoder.cc +++ b/src/lib/dcp_encoder.cc @@ -61,7 +61,7 @@ DCPEncoder::DCPEncoder (shared_ptr film, weak_ptr job) { _player_video_connection = _player->Video.connect (bind (&DCPEncoder::video, this, _1, _2)); _player_audio_connection = _player->Audio.connect (bind (&DCPEncoder::audio, this, _1, _2)); - _player_subtitle_connection = _player->Subtitle.connect (bind (&DCPEncoder::subtitle, this, _1, _2)); + _player_text_connection = _player->Text.connect (bind (&DCPEncoder::text, this, _1, _2, _3)); BOOST_FOREACH (shared_ptr c, film->content ()) { if (c->subtitle && c->subtitle->use() && !c->subtitle->burn()) { @@ -75,7 +75,7 @@ DCPEncoder::~DCPEncoder () /* We must stop receiving more video data before we die */ _player_video_connection.release (); _player_audio_connection.release (); - _player_subtitle_connection.release (); + _player_text_connection.release (); } void @@ -141,10 +141,10 @@ DCPEncoder::audio (shared_ptr data, DCPTime time) } void -DCPEncoder::subtitle (PlayerText data, DCPTimePeriod period) +DCPEncoder::text (PlayerText data, TextType type, DCPTimePeriod period) { - if (_non_burnt_subtitles) { - _writer->write (data, period); + if (type == TEXT_CLOSED_CAPTION || _non_burnt_subtitles) { + _writer->write (data, type, period); } } diff --git a/src/lib/dcp_encoder.h b/src/lib/dcp_encoder.h index 7fbb076f3..8a2ad947d 100644 --- a/src/lib/dcp_encoder.h +++ b/src/lib/dcp_encoder.h @@ -52,7 +52,7 @@ private: void video (boost::shared_ptr, DCPTime); void audio (boost::shared_ptr, DCPTime); - void subtitle (PlayerText, DCPTimePeriod); + void text (PlayerText, TextType, DCPTimePeriod); boost::shared_ptr _writer; boost::shared_ptr _j2k_encoder; @@ -61,5 +61,5 @@ private: boost::signals2::scoped_connection _player_video_connection; boost::signals2::scoped_connection _player_audio_connection; - boost::signals2::scoped_connection _player_subtitle_connection; + boost::signals2::scoped_connection _player_text_connection; }; diff --git a/src/lib/player.cc b/src/lib/player.cc index 36ffd1868..e300b5448 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -929,7 +929,7 @@ Player::subtitle_stop (weak_ptr wp, ContentTime to, TextType type) pair from = _active_text[type].add_to (wp, dcp_to); if (piece->content->subtitle->use() && !_always_burn_subtitles && !piece->content->subtitle->burn()) { - Subtitle (from.first, DCPTimePeriod (from.second, dcp_to)); + Text (from.first, type, DCPTimePeriod (from.second, dcp_to)); } } diff --git a/src/lib/player.h b/src/lib/player.h index a4170f83e..c936524a2 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -98,10 +98,10 @@ public: /** Emitted when a video frame is ready. These emissions happen in the correct order. */ boost::signals2::signal, DCPTime)> Video; boost::signals2::signal, DCPTime)> Audio; - /** Emitted when a subtitle is ready. This signal may be emitted considerably + /** Emitted when a caption is ready. This signal may be emitted considerably * after the corresponding Video. */ - boost::signals2::signal Subtitle; + boost::signals2::signal Text; private: friend class PlayerWrapper; diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc index d23ac76d1..8eb0461bc 100644 --- a/src/lib/reel_writer.cc +++ b/src/lib/reel_writer.cc @@ -528,8 +528,10 @@ ReelWriter::write (shared_ptr audio) } void -ReelWriter::write (PlayerText subs, DCPTimePeriod period) +ReelWriter::write (PlayerText subs, TextType type, DCPTimePeriod period) { + /* XXX: we need separate libdcp asset types here and to know how different they are */ + if (!_subtitle_asset) { string lang = _film->subtitle_language (); if (lang.empty ()) { diff --git a/src/lib/reel_writer.h b/src/lib/reel_writer.h index 37e950ae6..6de1de68d 100644 --- a/src/lib/reel_writer.h +++ b/src/lib/reel_writer.h @@ -60,7 +60,7 @@ public: void fake_write (Frame frame, Eyes eyes, int size); void repeat_write (Frame frame, Eyes eyes); void write (boost::shared_ptr audio); - void write (PlayerText subs, DCPTimePeriod period); + void write (PlayerText text, TextType type, DCPTimePeriod period); void finish (); boost::shared_ptr create_reel (std::list const & refs, std::list > const & fonts); diff --git a/src/lib/writer.cc b/src/lib/writer.cc index a5e8cd9d2..7b2944d32 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -91,11 +91,13 @@ Writer::Writer (shared_ptr film, weak_ptr j) _reels.push_back (ReelWriter (film, p, job, reel_index++, reels.size(), _film->content_summary(p))); } - /* We can keep track of the current audio and subtitle reels easily because audio - and subs arrive to the Writer in sequence. This is not so for video. + /* We can keep track of the current audio, subtitle and closed caption reels easily because audio + and captions arrive to the Writer in sequence. This is not so for video. */ _audio_reel = _reels.begin (); - _subtitle_reel = _reels.begin (); + for (int i = 0; i < TEXT_COUNT; ++i) { + _text_reel[i] = _reels.begin (); + } /* Check that the signer is OK if we need one */ string reason; @@ -663,16 +665,16 @@ Writer::can_fake_write (Frame frame) const } void -Writer::write (PlayerText subs, DCPTimePeriod period) +Writer::write (PlayerText text, TextType type, DCPTimePeriod period) { - while (_subtitle_reel->period().to <= period.from) { - ++_subtitle_reel; - DCPOMATIC_ASSERT (_subtitle_reel != _reels.end()); + while (_text_reel[type]->period().to <= period.from) { + ++_text_reel[type]; + DCPOMATIC_ASSERT (_text_reel[type] != _reels.end()); } - DCPOMATIC_ASSERT (_subtitle_reel != _reels.end()); + DCPOMATIC_ASSERT (_text_reel[type] != _reels.end()); - _subtitle_reel->write (subs, period); + _text_reel[type]->write (text, type, period); } void diff --git a/src/lib/writer.h b/src/lib/writer.h index c8d188834..484ca1285 100644 --- a/src/lib/writer.h +++ b/src/lib/writer.h @@ -104,7 +104,7 @@ public: bool can_repeat (Frame) const; void repeat (Frame, Eyes); void write (boost::shared_ptr, DCPTime time); - void write (PlayerText subs, DCPTimePeriod period); + void write (PlayerText text, TextType type, DCPTimePeriod period); void write (std::list > fonts); void write (ReferencedReelAsset asset); void finish (); @@ -124,7 +124,7 @@ private: boost::weak_ptr _job; std::vector _reels; std::vector::iterator _audio_reel; - std::vector::iterator _subtitle_reel; + std::vector::iterator _text_reel[TEXT_COUNT]; /** our thread, or 0 */ boost::thread* _thread; -- 2.30.2