/*
- 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 "film.h"
#include "ratio.h"
#include "log.h"
+#include "dcpomatic_log.h"
#include "dcp_video.h"
#include "dcp_content_type.h"
#include "audio_mapping.h"
#include "i18n.h"
-#define LOG_GENERAL(...) _film->log()->log (String::compose (__VA_ARGS__), LogEntry::TYPE_GENERAL);
-#define LOG_GENERAL_NC(...) _film->log()->log (__VA_ARGS__, LogEntry::TYPE_GENERAL);
-#define LOG_DEBUG_ENCODE(...) _film->log()->log (String::compose (__VA_ARGS__), LogEntry::TYPE_DEBUG_ENCODE);
-#define LOG_TIMING(...) _film->log()->log (String::compose (__VA_ARGS__), LogEntry::TYPE_TIMING);
-#define LOG_WARNING_NC(...) _film->log()->log (__VA_ARGS__, LogEntry::TYPE_WARNING);
-#define LOG_WARNING(...) _film->log()->log (String::compose (__VA_ARGS__), LogEntry::TYPE_WARNING);
-#define LOG_ERROR(...) _film->log()->log (String::compose (__VA_ARGS__), LogEntry::TYPE_ERROR);
-
/* OS X strikes again */
#undef set_key
using std::map;
using std::min;
using std::max;
+using std::vector;
using boost::shared_ptr;
using boost::weak_ptr;
using boost::dynamic_pointer_cast;
+using boost::optional;
using dcp::Data;
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 ();
+ BOOST_FOREACH (DCPTextTrack i, _film->closed_caption_tracks()) {
+ _caption_reels[i] = _reels.begin ();
+ }
/* Check that the signer is OK if we need one */
string reason;
DCPOMATIC_ASSERT (i != _queue.rend());
++_pushed_to_disk;
/* For the log message below */
- int const awaiting = _reels[_queue.front().reel].last_written_video_frame();
+ int const awaiting = _reels[_queue.front().reel].last_written_video_frame() + 1;
lock.unlock ();
/* i is valid here, even though we don't hold a lock on the mutex,
boost::algorithm::replace_all (text, "$LENGTH", length);
- fwrite (text.c_str(), 1, text.length(), f);
+ checked_fwrite (text.c_str(), text.length(), f, cover);
fclose (f);
}
return (frame != 0 && frame < reel.first_nonexistant_frame());
}
+/** @param track Closed caption track if type == TEXT_CLOSED_CAPTION */
void
-Writer::write (PlayerText subs, DCPTimePeriod period)
+Writer::write (PlayerText text, TextType type, optional<DCPTextTrack> track, DCPTimePeriod period)
{
- while (_subtitle_reel->period().to <= period.from) {
- ++_subtitle_reel;
- DCPOMATIC_ASSERT (_subtitle_reel != _reels.end());
+ vector<ReelWriter>::iterator* reel = 0;
+
+ switch (type) {
+ case TEXT_OPEN_SUBTITLE:
+ reel = &_subtitle_reel;
+ break;
+ case TEXT_CLOSED_CAPTION:
+ DCPOMATIC_ASSERT (track);
+ DCPOMATIC_ASSERT (_caption_reels.find(*track) != _caption_reels.end());
+ reel = &_caption_reels[*track];
+ break;
+ default:
+ DCPOMATIC_ASSERT (false);
}
- DCPOMATIC_ASSERT (_subtitle_reel != _reels.end());
+ DCPOMATIC_ASSERT (*reel != _reels.end());
+ while ((*reel)->period().to <= period.from) {
+ ++(*reel);
+ DCPOMATIC_ASSERT (*reel != _reels.end());
+ }
- _subtitle_reel->write (subs, period);
+ (*reel)->write (text, type, track, period);
}
void