using boost::weak_ptr;
using boost::optional;
using boost::bind;
+using namespace dcpomatic;
Hints::Hints (weak_ptr<const Film> film)
: _film (film)
- , _thread (0)
, _long_ccap (false)
, _overlap_ccap (false)
, _too_many_ccap_lines (false)
void
Hints::start ()
{
- _thread = new boost::thread (bind(&Hints::thread, this));
+ _thread = boost::thread (bind(&Hints::thread, this));
}
Hints::~Hints ()
{
- if (!_thread) {
+ if (!_thread.joinable()) {
return;
}
try {
- {
- boost::mutex::scoped_lock lm (_mutex);
- _stop = true;
- }
- _thread->interrupt ();
- _thread->join ();
+ _stop = true;
+ _thread.interrupt ();
+ _thread.join ();
} catch (...) {
}
-
- delete _thread;
}
void
}
if (film->audio_channels() < 6) {
- hint (_("Your DCP has fewer than 6 audio channels. This may cause problems on some projectors."));
+ hint (_("Your DCP has fewer than 6 audio channels. This may cause problems on some projectors. You may want to set the DCP to have 6 channels. It does not matter if your content has fewer channels, as DCP-o-matic will fill the extras with silence."));
}
AudioProcessor const * ap = film->audio_processor();
hint (_("You are using DCP-o-matic's stereo-to-5.1 upmixer. This is experimental and may result in poor-quality audio. If you continue, you should listen to the resulting DCP in a cinema to make sure that it sounds good."));
}
- int flat_or_narrower = 0;
+ int narrower_than_scope = 0;
int scope = 0;
BOOST_FOREACH (shared_ptr<const Content> i, content) {
if (i->video) {
if (r && r->id() == "239") {
++scope;
} else if (r && r->id() != "239" && r->id() != "190") {
- ++flat_or_narrower;
+ ++narrower_than_scope;
}
}
}
string const film_container = film->container()->id();
- if (scope && !flat_or_narrower && film_container == "185") {
+ if (scope && !narrower_than_scope && film_container == "185") {
hint (_("All of your content is in Scope (2.39:1) but your DCP's container is Flat (1.85:1). This will letter-box your content inside a Flat (1.85:1) frame. You may prefer to set your DCP's container to Scope (2.39:1) in the \"DCP\" tab."));
}
- if (!scope && flat_or_narrower && film_container == "239") {
- hint (_("All of your content is at 1.85:1 or narrower but your DCP's container is Scope (2.39:1). This will pillar-box your content inside a Flat (1.85:1) frame. You may prefer to set your DCP's container to Flat (1.85:1) in the \"DCP\" tab."));
+ if (!scope && narrower_than_scope && film_container == "239") {
+ hint (_("All of your content is 2.35:1 or narrower but your DCP's container is Scope (2.39:1). This will pillar-box your content. You may prefer to set your DCP's container to have the same ratio as your content."));
}
if (film_container != "185" && film_container != "239" && film_container != "190") {
case 25:
{
/* You might want to go to 24 */
- string base = String::compose(_("You are set up for a DCP at a frame rate of %1fps. This frame rate is not supported by all projectors. You may want to consider changing your frame rate to %2fps."), 25, 24);
+ string base = String::compose(_("You are set up for a DCP at a frame rate of %1 fps. This frame rate is not supported by all projectors. You may want to consider changing your frame rate to %2 fps."), 25, 24);
if (film->interop()) {
base += " ";
base += _("If you do use 25fps you should change your DCP standard to SMPTE.");
case 50:
case 60:
/* You almost certainly want to go to half frame rate */
- hint (String::compose(_("You are set up for a DCP at a frame rate of %1fps. This frame rate is not supported by all projectors. You are advised to change the DCP frame rate to %2fps."), film->video_frame_rate(), film->video_frame_rate() / 2));
+ hint (String::compose(_("You are set up for a DCP at a frame rate of %1 fps. This frame rate is not supported by all projectors. You are advised to change the DCP frame rate to %2 fps."), film->video_frame_rate(), film->video_frame_rate() / 2));
break;
}
struct timeval last_pulse;
gettimeofday (&last_pulse, 0);
- while (!player->pass()) {
+ try {
+ while (!player->pass()) {
- struct timeval now;
- gettimeofday (&now, 0);
- if ((seconds(now) - seconds(last_pulse)) > 1) {
- {
- boost::mutex::scoped_lock lm (_mutex);
+ struct timeval now;
+ gettimeofday (&now, 0);
+ if ((seconds(now) - seconds(last_pulse)) > 1) {
if (_stop) {
break;
}
+ emit (bind (boost::ref(Pulse)));
+ last_pulse = now;
}
- emit (bind (boost::ref(Pulse)));
- last_pulse = now;
}
+ } catch (...) {
+ store_current ();
}
emit (bind(boost::ref(Finished)));
_too_many_ccap_lines = true;
}
- if (!_overlap_ccap && _last && _last->overlap(period)) {
+ shared_ptr<const Film> film = _film.lock ();
+ DCPOMATIC_ASSERT (film);
+
+ /* XXX: maybe overlapping closed captions (i.e. different languages) are OK with Interop? */
+ if (film->interop() && !_overlap_ccap && _last && _last->overlap(period)) {
_overlap_ccap = true;
- hint (_("You have overlapping closed captions, which are not allowed."));
+ hint (_("You have overlapping closed captions, which are not allowed in Interop DCPs. Change your DCP standard to SMPTE."));
}
_last = period;