#include "writer.h"
#include "compose.hpp"
#include "referenced_reel_asset.h"
-#include "subtitle_content.h"
+#include "caption_content.h"
#include "player_video.h"
#include <boost/signals2.hpp>
#include <boost/foreach.hpp>
*/
DCPEncoder::DCPEncoder (shared_ptr<const Film> film, weak_ptr<Job> job)
: Encoder (film, job)
- , _writer (new Writer (film, job))
- , _j2k_encoder (new J2KEncoder (film, _writer))
, _finishing (false)
, _non_burnt_subtitles (false)
{
- BOOST_FOREACH (shared_ptr<const Content> c, _film->content ()) {
- if (c->subtitle && c->subtitle->use() && !c->subtitle->burn()) {
+ _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_caption_connection = _player->Caption.connect (bind (&DCPEncoder::caption, this, _1, _2, _3));
+
+ BOOST_FOREACH (shared_ptr<const Content> c, film->content ()) {
+ if (c->caption && c->caption->use() && !c->caption->burn()) {
_non_burnt_subtitles = true;
}
}
}
+DCPEncoder::~DCPEncoder ()
+{
+ /* We must stop receiving more video data before we die */
+ _player_video_connection.release ();
+ _player_audio_connection.release ();
+ _player_caption_connection.release ();
+}
+
void
DCPEncoder::go ()
{
+ _writer.reset (new Writer (_film, _job));
_writer->start ();
+
+ _j2k_encoder.reset (new J2KEncoder (_film, _writer));
_j2k_encoder->begin ();
{
}
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::caption (PlayerCaption data, CaptionType type, DCPTimePeriod period)
{
- if (_non_burnt_subtitles) {
- _writer->write (data, period);
+ if (type == CAPTION_CLOSED || _non_burnt_subtitles) {
+ _writer->write (data, type, period);
}
}
float
DCPEncoder::current_rate () const
{
+ if (!_j2k_encoder) {
+ return 0;
+ }
+
return _j2k_encoder->current_encoding_rate ();
}
Frame
DCPEncoder::frames_done () const
{
+ if (!_j2k_encoder) {
+ return 0;
+ }
+
return _j2k_encoder->video_frames_enqueued ();
}