{
_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()) {
/* 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
}
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);
}
}
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;
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;
};
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));
}
}
/** 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;
}
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 ()) {
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);
_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;
}
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
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 ();
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;