/*
- Copyright (C) 2012-2017 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
#include "writer.h"
#include "compose.hpp"
#include "referenced_reel_asset.h"
-#include "subtitle_content.h"
+#include "text_content.h"
#include "player_video.h"
#include <boost/signals2.hpp>
#include <boost/foreach.hpp>
using boost::shared_ptr;
using boost::weak_ptr;
using boost::dynamic_pointer_cast;
+using boost::optional;
/** Construct a DCP encoder.
* @param film Film that we are encoding.
*/
DCPEncoder::DCPEncoder (shared_ptr<const Film> film, weak_ptr<Job> job)
: Encoder (film, job)
- , _film (film)
- , _job (job)
, _finishing (false)
, _non_burnt_subtitles (false)
{
+ _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_text_connection = _player->Text.connect (bind (&DCPEncoder::text, this, _1, _2, _3, _4));
+
BOOST_FOREACH (shared_ptr<const Content> c, film->content ()) {
- if (c->subtitle && c->subtitle->use() && !c->subtitle->burn()) {
- _non_burnt_subtitles = true;
+ BOOST_FOREACH (shared_ptr<TextContent> i, c->text) {
+ if (i->use() && !i->burn()) {
+ _non_burnt_subtitles = true;
+ }
}
}
}
/* 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
}
if (_non_burnt_subtitles) {
- _writer->write (_player->get_subtitle_fonts ());
+ list<shared_ptr<Font> > fonts = _player->get_subtitle_fonts ();
+
+ if (fonts.size() > 1 && _film->interop()) {
+ /* Interop will ignore second and subsequent <LoadFont>s so don't even
+ write them as they upset some validators.
+ */
+ shared_ptr<Font> first = fonts.front ();
+ fonts.clear ();
+ fonts.push_back (first);
+ }
+
+ _writer->write (fonts);
}
while (!_player->pass ()) {}
void
DCPEncoder::audio (shared_ptr<AudioBuffers> data, DCPTime time)
{
- _writer->write (data);
+ _writer->write (data, time);
shared_ptr<Job> job = _job.lock ();
DCPOMATIC_ASSERT (job);
}
void
-DCPEncoder::subtitle (PlayerSubtitles data, DCPTimePeriod period)
+DCPEncoder::text (PlayerText data, TextType type, optional<DCPTextTrack> track, DCPTimePeriod period)
{
- if (_non_burnt_subtitles) {
- _writer->write (data, period);
+ if (type == TEXT_CLOSED_CAPTION || _non_burnt_subtitles) {
+ _writer->write (data, type, track, period);
}
}