#include "cross.h"
#include "audio_buffers.h"
#include "version.h"
-#include "font.h"
+#include "font_data.h"
#include "util.h"
#include "reel_writer.h"
#include "text_content.h"
#include <dcp/cpl.h>
#include <dcp/locale_convert.h>
-#include <dcp/reel_mxf.h>
-#include <boost/foreach.hpp>
+#include <dcp/reel_file_asset.h>
#include <fstream>
#include <cerrno>
#include <iostream>
using std::min;
using std::max;
using std::vector;
-using boost::shared_ptr;
-using boost::weak_ptr;
-using boost::dynamic_pointer_cast;
+using std::shared_ptr;
+using std::weak_ptr;
+using std::dynamic_pointer_cast;
using boost::optional;
#if BOOST_VERSION >= 106100
using namespace boost::placeholders;
, _repeat_written (0)
, _pushed_to_disk (0)
, _text_only (text_only)
+ , _have_subtitles (false)
{
shared_ptr<Job> job = _job.lock ();
int reel_index = 0;
- list<DCPTimePeriod> const reels = film()->reels();
- BOOST_FOREACH (DCPTimePeriod p, reels) {
+ auto const reels = film()->reels();
+ for (auto p: reels) {
_reels.push_back (ReelWriter(weak_film, p, job, reel_index++, reels.size(), text_only));
}
*/
_audio_reel = _reels.begin ();
_subtitle_reel = _reels.begin ();
- BOOST_FOREACH (DCPTextTrack i, film()->closed_caption_tracks()) {
+ for (auto i: film()->closed_caption_tracks()) {
_caption_reels[i] = _reels.begin ();
}
_atmos_reel = _reels.begin ();
qi.reel = video_reel (frame);
qi.frame = frame - _reels[qi.reel].start ();
- if (film()->three_d() && eyes == EYES_BOTH) {
+ if (film()->three_d() && eyes == Eyes::BOTH) {
/* 2D material in a 3D DCP; fake the 3D */
- qi.eyes = EYES_LEFT;
+ qi.eyes = Eyes::LEFT;
_queue.push_back (qi);
++_queued_full_in_memory;
- qi.eyes = EYES_RIGHT;
+ qi.eyes = Eyes::RIGHT;
_queue.push_back (qi);
++_queued_full_in_memory;
} else {
qi.type = QueueItem::REPEAT;
qi.reel = video_reel (frame);
qi.frame = frame - _reels[qi.reel].start ();
- if (film()->three_d() && eyes == EYES_BOTH) {
- qi.eyes = EYES_LEFT;
+ if (film()->three_d() && eyes == Eyes::BOTH) {
+ qi.eyes = Eyes::LEFT;
_queue.push_back (qi);
- qi.eyes = EYES_RIGHT;
+ qi.eyes = Eyes::RIGHT;
_queue.push_back (qi);
} else {
qi.eyes = eyes;
qi.reel = reel;
qi.frame = frame_in_reel;
- if (film()->three_d() && eyes == EYES_BOTH) {
- qi.eyes = EYES_LEFT;
+ if (film()->three_d() && eyes == Eyes::BOTH) {
+ qi.eyes = Eyes::LEFT;
_queue.push_back (qi);
- qi.eyes = EYES_RIGHT;
+ qi.eyes = Eyes::RIGHT;
_queue.push_back (qi);
} else {
qi.eyes = eyes;
bool
Writer::LastWritten::next (QueueItem qi) const
{
- if (qi.eyes == EYES_BOTH) {
+ if (qi.eyes == Eyes::BOTH) {
/* 2D */
return qi.frame == (_frame + 1);
}
/* 3D */
- if (_eyes == EYES_LEFT && qi.frame == _frame && qi.eyes == EYES_RIGHT) {
+ if (_eyes == Eyes::LEFT && qi.frame == _frame && qi.eyes == Eyes::RIGHT) {
return true;
}
- if (_eyes == EYES_RIGHT && qi.frame == (_frame + 1) && qi.eyes == EYES_LEFT) {
+ if (_eyes == Eyes::RIGHT && qi.frame == (_frame + 1) && qi.eyes == Eyes::LEFT) {
return true;
}
/* (Hopefully temporarily) log anything that was not written */
if (!_queue.empty() && !have_sequenced_image_at_queue_head()) {
LOG_WARNING (N_("Finishing writer with a left-over queue of %1:"), _queue.size());
- BOOST_FOREACH (QueueItem const& i, _queue) {
+ for (auto const& i: _queue) {
if (i.type == QueueItem::FULL) {
LOG_WARNING (N_("- type FULL, frame %1, eyes %2"), i.frame, (int) i.eyes);
} else {
LOG_GENERAL_NC ("Finishing ReelWriters");
- BOOST_FOREACH (ReelWriter& i, _reels) {
+ for (auto& i: _reels) {
i.finish (output_dcp);
}
set_progress = &ignore_progress;
}
- BOOST_FOREACH (ReelWriter& i, _reels) {
+ for (auto& i: _reels) {
service.post (boost::bind (&ReelWriter::calculate_digests, &i, set_progress));
}
service.post (boost::bind (&Writer::calculate_referenced_digests, this, set_progress));
/* Add reels */
- BOOST_FOREACH (ReelWriter& i, _reels) {
- cpl->add (i.create_reel(_reel_assets, _fonts, output_dcp));
+ for (auto& i: _reels) {
+ cpl->add (i.create_reel(_reel_assets, _fonts, output_dcp, _have_subtitles, _have_closed_captions));
}
/* Add metadata */
cpl->set_ratings (film()->ratings());
vector<dcp::ContentVersion> cv;
- BOOST_FOREACH (string i, film()->content_versions()) {
+ for (auto i: film()->content_versions()) {
cv.push_back (dcp::ContentVersion(i));
}
cpl->set_content_versions (cv);
cpl->set_facility (film()->facility());
cpl->set_luminance (film()->luminance());
- list<int> ac = film()->mapped_audio_channels();
+ auto ac = film()->mapped_audio_channels();
dcp::MCASoundField field = (
- find(ac.begin(), ac.end(), static_cast<int>(dcp::BSL)) != ac.end() ||
- find(ac.begin(), ac.end(), static_cast<int>(dcp::BSR)) != ac.end()
- ) ? dcp::SEVEN_POINT_ONE : dcp::FIVE_POINT_ONE;
+ find(ac.begin(), ac.end(), static_cast<int>(dcp::Channel::BSL)) != ac.end() ||
+ find(ac.begin(), ac.end(), static_cast<int>(dcp::Channel::BSR)) != ac.end()
+ ) ? dcp::MCASoundField::SEVEN_POINT_ONE : dcp::MCASoundField::FIVE_POINT_ONE;
dcp::MainSoundConfiguration msc (field, film()->audio_channels());
- BOOST_FOREACH (int i, ac) {
- if (i < film()->audio_channels()) {
+ for (auto i: ac) {
+ if (static_cast<int>(i) < film()->audio_channels()) {
msc.set_mapping (i, static_cast<dcp::Channel>(i));
}
}
}
dcp.write_xml (
- film()->interop() ? dcp::INTEROP : dcp::SMPTE,
+ film()->interop() ? dcp::Standard::INTEROP : dcp::Standard::SMPTE,
issuer,
creator,
dcp::LocalTime().as_string(),
- String::compose("Created by libdcp %1", dcp::version),
+ film()->dcp_name(),
signer,
Config::instance()->dcp_metadata_filename_format()
);
return (frame != 0 && frame < reel.first_nonexistant_frame());
}
-/** @param track Closed caption track if type == TEXT_CLOSED_CAPTION */
+/** @param track Closed caption track if type == TextType::CLOSED_CAPTION */
void
Writer::write (PlayerText text, TextType type, optional<DCPTextTrack> track, DCPTimePeriod period)
{
- vector<ReelWriter>::iterator* reel = 0;
+ vector<ReelWriter>::iterator* reel = nullptr;
switch (type) {
- case TEXT_OPEN_SUBTITLE:
+ case TextType::OPEN_SUBTITLE:
reel = &_subtitle_reel;
+ _have_subtitles = true;
break;
- case TEXT_CLOSED_CAPTION:
+ case TextType::CLOSED_CAPTION:
DCPOMATIC_ASSERT (track);
DCPOMATIC_ASSERT (_caption_reels.find(*track) != _caption_reels.end());
reel = &_caption_reels[*track];
+ _have_closed_captions.insert (*track);
break;
default:
DCPOMATIC_ASSERT (false);
}
void
-Writer::write (list<shared_ptr<Font> > fonts)
+Writer::write (vector<FontData> fonts)
{
/* Just keep a list of unique fonts and we'll deal with them in ::finish */
- BOOST_FOREACH (shared_ptr<Font> i, fonts) {
+ for (auto const& i: fonts) {
bool got = false;
- BOOST_FOREACH (shared_ptr<Font> j, _fonts) {
- if (*i == *j) {
+ for (auto& j: _fonts) {
+ if (i == j) {
got = true;
}
}
size_t
Writer::video_reel (int frame) const
{
- DCPTime t = DCPTime::from_frames (frame, film()->video_frame_rate());
+ auto t = DCPTime::from_frames (frame, film()->video_frame_rate());
size_t i = 0;
while (i < _reels.size() && !_reels[i].period().contains (t)) {
++i;
_digest_progresses[boost::this_thread::get_id()] = progress;
float min_progress = FLT_MAX;
- for (map<boost::thread::id, float>::const_iterator i = _digest_progresses.begin(); i != _digest_progresses.end(); ++i) {
- min_progress = min (min_progress, i->second);
+ for (auto const& i: _digest_progresses) {
+ min_progress = min (min_progress, i.second);
}
job->set_progress (min_progress);
void
Writer::calculate_referenced_digests (boost::function<void (float)> set_progress)
{
- BOOST_FOREACH (ReferencedReelAsset const& i, _reel_assets) {
- shared_ptr<dcp::ReelMXF> mxf = dynamic_pointer_cast<dcp::ReelMXF>(i.asset);
- if (mxf && !mxf->hash()) {
- mxf->asset_ref().asset()->hash (set_progress);
- mxf->set_hash (mxf->asset_ref().asset()->hash());
+ for (auto const& i: _reel_assets) {
+ auto file = dynamic_pointer_cast<dcp::ReelFileAsset>(i.asset);
+ if (file && !file->hash()) {
+ file->asset_ref().asset()->hash (set_progress);
+ file->set_hash (file->asset_ref().asset()->hash());
}
}
}