Get types into ReelWriter.
authorCarl Hetherington <cth@carlh.net>
Thu, 19 Jul 2018 20:33:52 +0000 (21:33 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 19 Jul 2018 22:45:23 +0000 (23:45 +0100)
src/lib/dcp_encoder.cc
src/lib/dcp_encoder.h
src/lib/player.cc
src/lib/player.h
src/lib/reel_writer.cc
src/lib/reel_writer.h
src/lib/writer.cc
src/lib/writer.h

index c38d73276066e44e6204fc2ba7437bc2a687c1ff..cfc7da903dd6d55538d17d4f9a2707bf1ebddb06 100644 (file)
@@ -61,7 +61,7 @@ DCPEncoder::DCPEncoder (shared_ptr<const Film> film, weak_ptr<Job> 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<const Content> 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<AudioBuffers> 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);
        }
 }
 
index 7fbb076f3d313cceb550fd5c3104e26ce5ca4092..8a2ad947dcc95d3f391d878f7ef18cad0a9ed2e6 100644 (file)
@@ -52,7 +52,7 @@ private:
 
        void video (boost::shared_ptr<PlayerVideo>, DCPTime);
        void audio (boost::shared_ptr<AudioBuffers>, DCPTime);
-       void subtitle (PlayerText, DCPTimePeriod);
+       void text (PlayerText, TextType, DCPTimePeriod);
 
        boost::shared_ptr<Writer> _writer;
        boost::shared_ptr<J2KEncoder> _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;
 };
index 36ffd186839b4d2a287128bae228be02fb904f58..e300b5448b51f00834ec08f07cf9a6f777ca2431 100644 (file)
@@ -929,7 +929,7 @@ Player::subtitle_stop (weak_ptr<Piece> wp, ContentTime to, TextType type)
        pair<PlayerText, DCPTime> 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));
        }
 }
 
index a4170f83e7dd5b4e23e7e54b340c79973e98aff7..c936524a218177098681eda3ffe1a25396cc8557 100644 (file)
@@ -98,10 +98,10 @@ public:
        /** Emitted when a video frame is ready.  These emissions happen in the correct order. */
        boost::signals2::signal<void (boost::shared_ptr<PlayerVideo>, DCPTime)> Video;
        boost::signals2::signal<void (boost::shared_ptr<AudioBuffers>, 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<void (PlayerText, DCPTimePeriod)> Subtitle;
+       boost::signals2::signal<void (PlayerText, TextType, DCPTimePeriod)> Text;
 
 private:
        friend class PlayerWrapper;
index d23ac76d1059482b48124be30b7e53f7fb566ca6..8eb0461bc211463e0e7609469fc9f70475f83a2d 100644 (file)
@@ -528,8 +528,10 @@ ReelWriter::write (shared_ptr<const AudioBuffers> 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 ()) {
index 37e950ae6c0aa1e0dc8069638c9bbc630b424f67..6de1de68dbb9e8e63fc92ff55d92bc95436f839f 100644 (file)
@@ -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<const AudioBuffers> audio);
-       void write (PlayerText subs, DCPTimePeriod period);
+       void write (PlayerText text, TextType type, DCPTimePeriod period);
 
        void finish ();
        boost::shared_ptr<dcp::Reel> create_reel (std::list<ReferencedReelAsset> const & refs, std::list<boost::shared_ptr<Font> > const & fonts);
index a5e8cd9d225850694ccaa49d16e61619ce014e1e..7b2944d32bb048f4717be0263b96272046bec6c1 100644 (file)
@@ -91,11 +91,13 @@ Writer::Writer (shared_ptr<const Film> film, weak_ptr<Job> 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
index c8d1888349809d2bb4b2d52c14cca8862aa0d8ca..484ca1285043073f9f2a64af74fd2c91d10244c3 100644 (file)
@@ -104,7 +104,7 @@ public:
        bool can_repeat (Frame) const;
        void repeat (Frame, Eyes);
        void write (boost::shared_ptr<const AudioBuffers>, DCPTime time);
-       void write (PlayerText subs, DCPTimePeriod period);
+       void write (PlayerText text, TextType type, DCPTimePeriod period);
        void write (std::list<boost::shared_ptr<Font> > fonts);
        void write (ReferencedReelAsset asset);
        void finish ();
@@ -124,7 +124,7 @@ private:
        boost::weak_ptr<Job> _job;
        std::vector<ReelWriter> _reels;
        std::vector<ReelWriter>::iterator _audio_reel;
-       std::vector<ReelWriter>::iterator _subtitle_reel;
+       std::vector<ReelWriter>::iterator _text_reel[TEXT_COUNT];
 
        /** our thread, or 0 */
        boost::thread* _thread;