summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2014-10-16 16:30:11 +0100
committerCarl Hetherington <cth@carlh.net>2014-10-16 16:30:11 +0100
commit0b6c6de07f9a3aa28c2e8ca8ef30340e3fa1bfc6 (patch)
tree075a7a604bbd4e072ec1b07481d4eb82ed7ffd34 /src/lib
parent42a122334d594b824c666e5263168386a76801cc (diff)
parent016a98b18d01276a1e603885a25785e7389f14d9 (diff)
Merge branch 'master' into 12bit
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/analyse_audio_job.cc8
-rw-r--r--src/lib/analyse_audio_job.h1
-rw-r--r--src/lib/audio_analysis.cc8
-rw-r--r--src/lib/audio_decoder.cc2
-rw-r--r--src/lib/colour_conversion.cc1
-rw-r--r--src/lib/compose.hpp4
-rw-r--r--src/lib/config.cc55
-rw-r--r--src/lib/config.h58
-rw-r--r--src/lib/content.cc4
-rw-r--r--src/lib/cross.cc2
-rw-r--r--src/lib/dcp_video_frame.cc9
-rw-r--r--src/lib/encoder.cc1
-rw-r--r--src/lib/examine_content_job.cc6
-rw-r--r--src/lib/examine_content_job.h1
-rw-r--r--src/lib/ffmpeg.cc1
-rw-r--r--src/lib/ffmpeg_content.cc6
-rw-r--r--src/lib/ffmpeg_decoder.cc12
-rw-r--r--src/lib/ffmpeg_examiner.cc10
-rw-r--r--src/lib/film.cc35
-rw-r--r--src/lib/filter_graph.cc6
-rw-r--r--src/lib/frame_rate_change.cc10
-rw-r--r--src/lib/frame_rate_change.h2
-rw-r--r--src/lib/image.cc1
-rw-r--r--src/lib/image_content.cc4
-rw-r--r--src/lib/image_proxy.cc25
-rw-r--r--src/lib/image_proxy.h1
-rw-r--r--src/lib/internet.cc11
-rw-r--r--src/lib/job.cc27
-rw-r--r--src/lib/job.h2
-rw-r--r--src/lib/json_server.cc193
-rw-r--r--src/lib/kdm.cc27
-rw-r--r--src/lib/log.cc5
-rw-r--r--src/lib/md5_digester.cc5
-rw-r--r--src/lib/player.cc3
-rw-r--r--src/lib/playlist.cc2
-rw-r--r--src/lib/po/de_DE.po221
-rw-r--r--src/lib/po/es_ES.po209
-rw-r--r--src/lib/po/fr_FR.po264
-rw-r--r--src/lib/po/it_IT.po211
-rw-r--r--src/lib/po/nl_NL.po226
-rw-r--r--src/lib/po/sv_SE.po209
-rw-r--r--src/lib/ratio.cc18
-rw-r--r--src/lib/ratio.h1
-rw-r--r--src/lib/safe_stringstream.cc (renamed from src/lib/json_server.h)14
-rw-r--r--src/lib/safe_stringstream.h115
-rw-r--r--src/lib/scp_dcp_job.cc14
-rw-r--r--src/lib/scp_dcp_job.h1
-rw-r--r--src/lib/send_kdm_email_job.cc6
-rw-r--r--src/lib/send_kdm_email_job.h1
-rw-r--r--src/lib/server.cc19
-rw-r--r--src/lib/server_finder.cc32
-rw-r--r--src/lib/sndfile_content.cc4
-rw-r--r--src/lib/stack.cpp1
-rw-r--r--src/lib/subtitle.cc14
-rw-r--r--src/lib/subtitle_content.cc48
-rw-r--r--src/lib/subtitle_content.h21
-rw-r--r--src/lib/transcode_job.cc10
-rw-r--r--src/lib/transcode_job.h1
-rw-r--r--src/lib/ui_signaller.h7
-rw-r--r--src/lib/update.cc8
-rw-r--r--src/lib/util.cc95
-rw-r--r--src/lib/util.h2
-rw-r--r--src/lib/video_content.cc141
-rw-r--r--src/lib/video_content.h45
-rw-r--r--src/lib/video_content_scale.cc171
-rw-r--r--src/lib/video_content_scale.h77
-rw-r--r--src/lib/writer.cc16
-rw-r--r--src/lib/wscript9
68 files changed, 1530 insertions, 1249 deletions
diff --git a/src/lib/analyse_audio_job.cc b/src/lib/analyse_audio_job.cc
index bfe0ed61f..ab985bdf7 100644
--- a/src/lib/analyse_audio_job.cc
+++ b/src/lib/analyse_audio_job.cc
@@ -48,12 +48,6 @@ AnalyseAudioJob::name () const
return _("Analyse audio");
}
-string
-AnalyseAudioJob::json_name () const
-{
- return N_("analyse_audio");
-}
-
void
AnalyseAudioJob::run ()
{
@@ -93,7 +87,7 @@ AnalyseAudioJob::audio (shared_ptr<const AudioBuffers> b, Time)
for (int j = 0; j < b->channels(); ++j) {
float s = b->data(j)[i];
if (fabsf (s) < 10e-7) {
- /* stringstream can't serialise and recover inf or -inf, so prevent such
+ /* SafeStringStream can't serialise and recover inf or -inf, so prevent such
values by replacing with this (140dB down) */
s = 10e-7;
}
diff --git a/src/lib/analyse_audio_job.h b/src/lib/analyse_audio_job.h
index 3e376634c..3d4881983 100644
--- a/src/lib/analyse_audio_job.h
+++ b/src/lib/analyse_audio_job.h
@@ -30,7 +30,6 @@ public:
AnalyseAudioJob (boost::shared_ptr<const Film>, boost::shared_ptr<AudioContent>);
std::string name () const;
- std::string json_name () const;
void run ();
private:
diff --git a/src/lib/audio_analysis.cc b/src/lib/audio_analysis.cc
index 98d092726..9f92bdb50 100644
--- a/src/lib/audio_analysis.cc
+++ b/src/lib/audio_analysis.cc
@@ -21,6 +21,7 @@
#include <cmath>
#include <cassert>
#include <cstdio>
+#include <iostream>
#include <boost/filesystem.hpp>
#include "audio_analysis.h"
#include "cross.h"
@@ -43,7 +44,10 @@ AudioPoint::AudioPoint ()
AudioPoint::AudioPoint (FILE* f)
{
for (int i = 0; i < COUNT; ++i) {
- fscanf (f, "%f", &_data[i]);
+ int n = fscanf (f, "%f", &_data[i]);
+ if (n != 1) {
+ _data[i] = 0;
+ }
}
}
@@ -86,7 +90,7 @@ AudioAnalysis::AudioAnalysis (boost::filesystem::path filename)
{
FILE* f = fopen_boost (filename, "r");
- int channels;
+ int channels = 0;
fscanf (f, "%d", &channels);
_data.resize (channels);
diff --git a/src/lib/audio_decoder.cc b/src/lib/audio_decoder.cc
index c0ef02f65..30bd2540a 100644
--- a/src/lib/audio_decoder.cc
+++ b/src/lib/audio_decoder.cc
@@ -17,6 +17,7 @@
*/
+#include <iostream>
#include "audio_decoder.h"
#include "audio_buffers.h"
#include "exceptions.h"
@@ -25,7 +26,6 @@
#include "i18n.h"
-using std::stringstream;
using std::list;
using std::pair;
using std::cout;
diff --git a/src/lib/colour_conversion.cc b/src/lib/colour_conversion.cc
index f8675900e..e5b1104ff 100644
--- a/src/lib/colour_conversion.cc
+++ b/src/lib/colour_conversion.cc
@@ -30,7 +30,6 @@
using std::list;
using std::string;
-using std::stringstream;
using std::cout;
using std::vector;
using boost::shared_ptr;
diff --git a/src/lib/compose.hpp b/src/lib/compose.hpp
index b3f410c8e..aa67b5a1f 100644
--- a/src/lib/compose.hpp
+++ b/src/lib/compose.hpp
@@ -33,10 +33,10 @@
#ifndef STRING_COMPOSE_H
#define STRING_COMPOSE_H
-#include <sstream>
#include <string>
#include <list>
#include <map> // for multimap
+#include "safe_stringstream.h"
namespace StringPrivate
{
@@ -56,7 +56,7 @@ namespace StringPrivate
std::string str() const;
private:
- std::ostringstream os;
+ SafeStringStream os;
int arg_no;
// we store the output as a list - when the output string is requested, the
diff --git a/src/lib/config.cc b/src/lib/config.cc
index 8e6dffee7..878fedaa4 100644
--- a/src/lib/config.cc
+++ b/src/lib/config.cc
@@ -17,7 +17,6 @@
*/
-#include <sstream>
#include <cstdlib>
#include <fstream>
#include <glib.h>
@@ -40,10 +39,12 @@
#include "i18n.h"
using std::vector;
+using std::cout;
using std::ifstream;
using std::string;
using std::list;
using std::max;
+using std::remove;
using std::exception;
using std::cerr;
using boost::shared_ptr;
@@ -63,6 +64,7 @@ Config::Config ()
, _sound_processor (SoundProcessor::from_id (N_("dolby_cp750")))
, _allow_any_dcp_frame_rate (false)
, _default_still_length (10)
+ , _default_scale (VideoContentScale (Ratio::from_id ("185")))
, _default_container (Ratio::from_id ("185"))
, _default_dcp_content_type (DCPContentType::from_isdcf_name ("TST"))
, _default_j2k_bandwidth (100000000)
@@ -133,6 +135,11 @@ Config::read ()
_language = f.optional_string_child ("Language");
+ c = f.optional_string_child ("DefaultScale");
+ if (c) {
+ _default_scale = VideoContentScale::from_id (c.get ());
+ }
+
c = f.optional_string_child ("DefaultContainer");
if (c) {
_default_container = Ratio::from_id (c.get ());
@@ -143,9 +150,12 @@ Config::read ()
_default_dcp_content_type = DCPContentType::from_isdcf_name (c.get ());
}
- _dcp_metadata.issuer = f.optional_string_child ("DCPMetadataIssuer").get_value_or ("");
- _dcp_metadata.creator = f.optional_string_child ("DCPMetadataCreator").get_value_or ("");
-
+ if (f.optional_string_child ("DCPMetadataIssuer")) {
+ _dcp_issuer = f.string_child ("DCPMetadataIssuer");
+ } else if (f.optional_string_child ("DCPIssuer")) {
+ _dcp_issuer = f.string_child ("DCPIssuer");
+ }
+
if (version && version.get() >= 2) {
_default_isdcf_metadata = ISDCFMetadata (f.node_child ("ISDCFMetadata"));
} else {
@@ -186,8 +196,10 @@ Config::read ()
_mail_server = f.string_child ("MailServer");
_mail_user = f.optional_string_child("MailUser").get_value_or ("");
_mail_password = f.optional_string_child("MailPassword").get_value_or ("");
+ _kdm_subject = f.optional_string_child ("KDMSubject").get_value_or (_("KDM delivery: $CPL_NAME"));
_kdm_from = f.string_child ("KDMFrom");
_kdm_cc = f.optional_string_child ("KDMCC").get_value_or ("");
+ _kdm_bcc = f.optional_string_child ("KDMBCC").get_value_or ("");
_kdm_email = f.string_child ("KDMEmail");
_check_for_updates = f.optional_bool_child("CheckForUpdates").get_value_or (false);
@@ -197,6 +209,11 @@ Config::read ()
_allow_any_dcp_frame_rate = f.optional_bool_child ("AllowAnyDCPFrameRate");
_log_types = f.optional_number_child<int> ("LogTypes").get_value_or (Log::TYPE_GENERAL | Log::TYPE_WARNING | Log::TYPE_ERROR);
+
+ list<cxml::NodePtr> his = f.node_children ("History");
+ for (list<cxml::NodePtr>::const_iterator i = his.begin(); i != his.end(); ++i) {
+ _history.push_back ((*i)->content ());
+ }
}
void
@@ -252,11 +269,7 @@ Config::read_old_metadata ()
} else if (k == "default_dcp_content_type") {
_default_dcp_content_type = DCPContentType::from_isdcf_name (v);
} else if (k == "dcp_metadata_issuer") {
- _dcp_metadata.issuer = v;
- } else if (k == "dcp_metadata_creator") {
- _dcp_metadata.creator = v;
- } else if (k == "dcp_metadata_issue_date") {
- _dcp_metadata.issue_date = v;
+ _dcp_issuer = v;
}
_default_isdcf_metadata.read_old_metadata (k, v);
@@ -340,14 +353,14 @@ Config::write () const
if (_language) {
root->add_child("Language")->add_child_text (_language.get());
}
+ root->add_child("DefaultScale")->add_child_text (_default_scale.id ());
if (_default_container) {
root->add_child("DefaultContainer")->add_child_text (_default_container->id ());
}
if (_default_dcp_content_type) {
root->add_child("DefaultDCPContentType")->add_child_text (_default_dcp_content_type->isdcf_name ());
}
- root->add_child("DCPMetadataIssuer")->add_child_text (_dcp_metadata.issuer);
- root->add_child("DCPMetadataCreator")->add_child_text (_dcp_metadata.creator);
+ root->add_child("DCPIssuer")->add_child_text (_dcp_issuer);
_default_isdcf_metadata.as_xml (root->add_child ("ISDCFMetadata"));
@@ -366,8 +379,10 @@ Config::write () const
root->add_child("MailServer")->add_child_text (_mail_server);
root->add_child("MailUser")->add_child_text (_mail_user);
root->add_child("MailPassword")->add_child_text (_mail_password);
+ root->add_child("KDMSubject")->add_child_text (_kdm_subject);
root->add_child("KDMFrom")->add_child_text (_kdm_from);
root->add_child("KDMCC")->add_child_text (_kdm_cc);
+ root->add_child("KDMBCC")->add_child_text (_kdm_bcc);
root->add_child("KDMEmail")->add_child_text (_kdm_email);
root->add_child("CheckForUpdates")->add_child_text (_check_for_updates ? "1" : "0");
@@ -376,6 +391,10 @@ Config::write () const
root->add_child("MaximumJ2KBandwidth")->add_child_text (raw_convert<string> (_maximum_j2k_bandwidth));
root->add_child("AllowAnyDCPFrameRate")->add_child_text (_allow_any_dcp_frame_rate ? "1" : "0");
root->add_child("LogTypes")->add_child_text (raw_convert<string> (_log_types));
+
+ for (vector<boost::filesystem::path>::const_iterator i = _history.begin(); i != _history.end(); ++i) {
+ root->add_child("History")->add_child_text (i->string ());
+ }
doc.write_to_file_formatted (file(false).string ());
}
@@ -422,3 +441,17 @@ Config::reset_kdm_email ()
"Best regards,\nDCP-o-matic"
);
}
+
+void
+Config::add_to_history (boost::filesystem::path p)
+{
+ /* Remove existing instances of this path in the history */
+ _history.erase (remove (_history.begin(), _history.end(), p), _history.end ());
+
+ _history.insert (_history.begin (), p);
+ if (_history.size() > HISTORY_SIZE) {
+ _history.pop_back ();
+ }
+
+ changed ();
+}
diff --git a/src/lib/config.h b/src/lib/config.h
index ebcf7e83d..0639382a0 100644
--- a/src/lib/config.h
+++ b/src/lib/config.h
@@ -28,10 +28,10 @@
#include <boost/shared_ptr.hpp>
#include <boost/signals2.hpp>
#include <boost/filesystem.hpp>
-#include <libdcp/metadata.h>
#include "isdcf_metadata.h"
#include "colour_conversion.h"
#include "server.h"
+#include "video_content.h"
class ServerDescription;
class Scaler;
@@ -133,6 +133,10 @@ public:
return _default_still_length;
}
+ VideoContentScale default_scale () const {
+ return _default_scale;
+ }
+
Ratio const * default_container () const {
return _default_container;
}
@@ -141,8 +145,8 @@ public:
return _default_dcp_content_type;
}
- libdcp::XMLMetadata dcp_metadata () const {
- return _dcp_metadata;
+ std::string dcp_issuer () const {
+ return _dcp_issuer;
}
int default_j2k_bandwidth () const {
@@ -169,6 +173,10 @@ public:
return _mail_password;
}
+ std::string kdm_subject () const {
+ return _kdm_subject;
+ }
+
std::string kdm_from () const {
return _kdm_from;
}
@@ -176,6 +184,10 @@ public:
std::string kdm_cc () const {
return _kdm_cc;
}
+
+ std::string kdm_bcc () const {
+ return _kdm_bcc;
+ }
std::string kdm_email () const {
return _kdm_email;
@@ -196,7 +208,11 @@ public:
int log_types () const {
return _log_types;
}
-
+
+ std::vector<boost::filesystem::path> history () const {
+ return _history;
+ }
+
/** @param n New number of local encoding threads */
void set_num_local_encoding_threads (int n) {
_num_local_encoding_threads = n;
@@ -278,6 +294,11 @@ public:
changed ();
}
+ void set_default_scale (VideoContentScale s) {
+ _default_scale = s;
+ changed ();
+ }
+
void set_default_container (Ratio const * c) {
_default_container = c;
changed ();
@@ -288,8 +309,8 @@ public:
changed ();
}
- void set_dcp_metadata (libdcp::XMLMetadata m) {
- _dcp_metadata = m;
+ void set_dcp_issuer (std::string i) {
+ _dcp_issuer = i;
changed ();
}
@@ -323,6 +344,11 @@ public:
changed ();
}
+ void set_kdm_subject (std::string s) {
+ _kdm_subject = s;
+ changed ();
+ }
+
void set_kdm_from (std::string f) {
_kdm_from = f;
changed ();
@@ -332,6 +358,11 @@ public:
_kdm_cc = f;
changed ();
}
+
+ void set_kdm_bcc (std::string f) {
+ _kdm_bcc = f;
+ changed ();
+ }
void set_kdm_email (std::string e) {
_kdm_email = e;
@@ -359,6 +390,13 @@ public:
_log_types = t;
changed ();
}
+
+ void clear_history () {
+ _history.clear ();
+ changed ();
+ }
+
+ void add_to_history (boost::filesystem::path p);
boost::filesystem::path signer_chain_directory () const;
@@ -404,9 +442,10 @@ private:
ISDCFMetadata _default_isdcf_metadata;
boost::optional<std::string> _language;
int _default_still_length;
+ VideoContentScale _default_scale;
Ratio const * _default_container;
DCPContentType const * _default_dcp_content_type;
- libdcp::XMLMetadata _dcp_metadata;
+ std::string _dcp_issuer;
int _default_j2k_bandwidth;
int _default_audio_delay;
std::vector<PresetColourConversion> _colour_conversions;
@@ -414,8 +453,10 @@ private:
std::string _mail_server;
std::string _mail_user;
std::string _mail_password;
+ std::string _kdm_subject;
std::string _kdm_from;
std::string _kdm_cc;
+ std::string _kdm_bcc;
std::string _kdm_email;
/** true to check for updates on startup */
bool _check_for_updates;
@@ -423,7 +464,8 @@ private:
/** maximum allowed J2K bandwidth in bits per second */
int _maximum_j2k_bandwidth;
int _log_types;
-
+ std::vector<boost::filesystem::path> _history;
+
/** Singleton instance, or 0 */
static Config* _instance;
};
diff --git a/src/lib/content.cc b/src/lib/content.cc
index 7966219ff..11a4b21cc 100644
--- a/src/lib/content.cc
+++ b/src/lib/content.cc
@@ -27,11 +27,11 @@
#include "ui_signaller.h"
#include "exceptions.h"
#include "film.h"
+#include "safe_stringstream.h"
#include "i18n.h"
using std::string;
-using std::stringstream;
using std::set;
using std::list;
using std::cout;
@@ -230,7 +230,7 @@ Content::trimmed (Time t) const
string
Content::identifier () const
{
- stringstream s;
+ SafeStringStream s;
s << Content::digest()
<< "_" << position()
diff --git a/src/lib/cross.cc b/src/lib/cross.cc
index e30cf6459..9b7d5594f 100644
--- a/src/lib/cross.cc
+++ b/src/lib/cross.cc
@@ -310,7 +310,7 @@ void
Waker::nudge ()
{
#ifdef DCPOMATIC_WINDOWS
- SetThreadExecutionState (ES_CONTINUOUS);
+ SetThreadExecutionState (ES_SYSTEM_REQUIRED);
#endif
}
diff --git a/src/lib/dcp_video_frame.cc b/src/lib/dcp_video_frame.cc
index c8f8c3cc5..057ed0fae 100644
--- a/src/lib/dcp_video_frame.cc
+++ b/src/lib/dcp_video_frame.cc
@@ -34,7 +34,6 @@
#include <stdexcept>
#include <cstdio>
#include <iomanip>
-#include <sstream>
#include <iostream>
#include <fstream>
#include <unistd.h>
@@ -67,7 +66,6 @@
#include "i18n.h"
using std::string;
-using std::stringstream;
using std::cout;
using boost::shared_ptr;
using libdcp::Size;
@@ -282,10 +280,9 @@ DCPVideoFrame::encode_remotely (ServerDescription serv)
LOG_GENERAL (N_("Sending frame %1 to remote"), _index);
/* Send XML metadata */
- stringstream xml;
- doc.write_to_stream (xml, "UTF-8");
- socket->write (xml.str().length() + 1);
- socket->write ((uint8_t *) xml.str().c_str(), xml.str().length() + 1);
+ string xml = doc.write_to_string ("UTF-8");
+ socket->write (xml.length() + 1);
+ socket->write ((uint8_t *) xml.c_str(), xml.length() + 1);
/* Send binary data */
_frame->send_binary (socket);
diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc
index 02a271029..693fd587e 100644
--- a/src/lib/encoder.cc
+++ b/src/lib/encoder.cc
@@ -45,7 +45,6 @@
using std::pair;
using std::string;
-using std::stringstream;
using std::vector;
using std::list;
using std::cout;
diff --git a/src/lib/examine_content_job.cc b/src/lib/examine_content_job.cc
index 8f16e2e5c..cbf180ffc 100644
--- a/src/lib/examine_content_job.cc
+++ b/src/lib/examine_content_job.cc
@@ -46,12 +46,6 @@ ExamineContentJob::name () const
return _("Examine content");
}
-string
-ExamineContentJob::json_name () const
-{
- return N_("examine_content");
-}
-
void
ExamineContentJob::run ()
{
diff --git a/src/lib/examine_content_job.h b/src/lib/examine_content_job.h
index c8037224f..b6903b86b 100644
--- a/src/lib/examine_content_job.h
+++ b/src/lib/examine_content_job.h
@@ -30,7 +30,6 @@ public:
~ExamineContentJob ();
std::string name () const;
- std::string json_name () const;
void run ();
private:
diff --git a/src/lib/ffmpeg.cc b/src/lib/ffmpeg.cc
index 7ecc811be..ebe62b51f 100644
--- a/src/lib/ffmpeg.cc
+++ b/src/lib/ffmpeg.cc
@@ -32,7 +32,6 @@ extern "C" {
using std::string;
using std::cout;
-using std::stringstream;
using boost::shared_ptr;
using libdcp::raw_convert;
diff --git a/src/lib/ffmpeg_content.cc b/src/lib/ffmpeg_content.cc
index 4d886a6dd..a4209f5b6 100644
--- a/src/lib/ffmpeg_content.cc
+++ b/src/lib/ffmpeg_content.cc
@@ -32,13 +32,13 @@ extern "C" {
#include "log.h"
#include "exceptions.h"
#include "frame_rate_change.h"
+#include "safe_stringstream.h"
#include "i18n.h"
#define LOG_GENERAL(...) film->log()->log (String::compose (__VA_ARGS__), Log::TYPE_GENERAL);
using std::string;
-using std::stringstream;
using std::vector;
using std::list;
using std::cout;
@@ -241,7 +241,7 @@ FFmpegContent::information () const
return "";
}
- stringstream s;
+ SafeStringStream s;
s << String::compose (_("%1 frames; %2 frames per second"), video_length_after_3d_combine(), video_frame_rate()) << "\n";
s << VideoContent::information ();
@@ -445,7 +445,7 @@ FFmpegContent::set_audio_mapping (AudioMapping m)
string
FFmpegContent::identifier () const
{
- stringstream s;
+ SafeStringStream s;
s << VideoContent::identifier();
diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc
index 07f988e2b..d40b798ba 100644
--- a/src/lib/ffmpeg_decoder.cc
+++ b/src/lib/ffmpeg_decoder.cc
@@ -23,7 +23,6 @@
#include <stdexcept>
#include <vector>
-#include <sstream>
#include <iomanip>
#include <iostream>
#include <stdint.h>
@@ -53,7 +52,6 @@ extern "C" {
using std::cout;
using std::string;
using std::vector;
-using std::stringstream;
using std::list;
using std::min;
using std::pair;
@@ -334,7 +332,7 @@ FFmpegDecoder::seek (VideoContent::Frame frame, bool accurate)
}
/* Initial seek time in the stream's timebase */
- int64_t const initial_vt = ((initial / _ffmpeg_content->video_frame_rate()) - _pts_offset) / time_base;
+ int64_t const initial_vt = ((initial / _ffmpeg_content->original_video_frame_rate()) - _pts_offset) / time_base;
av_seek_frame (_format_context, _video_stream, initial_vt, AVSEEK_FLAG_BACKWARD);
@@ -375,7 +373,7 @@ FFmpegDecoder::seek (VideoContent::Frame frame, bool accurate)
r = avcodec_decode_video2 (video_codec_context(), _frame, &finished, &_packet);
if (r >= 0 && finished) {
_video_position = rint (
- (av_frame_get_best_effort_timestamp (_frame) * time_base + _pts_offset) * _ffmpeg_content->video_frame_rate()
+ (av_frame_get_best_effort_timestamp (_frame) * time_base + _pts_offset) * _ffmpeg_content->original_video_frame_rate()
);
if (_video_position >= (frame - 1)) {
@@ -495,12 +493,12 @@ FFmpegDecoder::decode_video_packet ()
/* We just did a seek, so disable any attempts to correct for where we
are / should be.
*/
- _video_position = rint (pts * _ffmpeg_content->video_frame_rate ());
+ _video_position = rint (pts * _ffmpeg_content->original_video_frame_rate ());
_just_sought = false;
}
- double const next = _video_position / _ffmpeg_content->video_frame_rate();
- double const one_frame = 1 / _ffmpeg_content->video_frame_rate ();
+ double const next = _video_position / _ffmpeg_content->original_video_frame_rate();
+ double const one_frame = 1 / _ffmpeg_content->original_video_frame_rate ();
double delta = pts - next;
while (delta > one_frame) {
diff --git a/src/lib/ffmpeg_examiner.cc b/src/lib/ffmpeg_examiner.cc
index bc82a9700..5ccc8028b 100644
--- a/src/lib/ffmpeg_examiner.cc
+++ b/src/lib/ffmpeg_examiner.cc
@@ -23,13 +23,13 @@ extern "C" {
}
#include "ffmpeg_examiner.h"
#include "ffmpeg_content.h"
+#include "safe_stringstream.h"
#include "i18n.h"
using std::string;
using std::cout;
using std::max;
-using std::stringstream;
using boost::shared_ptr;
using boost::optional;
@@ -137,14 +137,14 @@ FFmpegExaminer::video_size () const
VideoContent::Frame
FFmpegExaminer::video_length () const
{
- VideoContent::Frame const length = (double (_format_context->duration - _format_context->start_time) / AV_TIME_BASE) * video_frame_rate();
+ VideoContent::Frame const length = (double (_format_context->duration) / AV_TIME_BASE) * video_frame_rate();
return max (1, length);
}
string
FFmpegExaminer::audio_stream_name (AVStream* s) const
{
- stringstream n;
+ SafeStringStream n;
n << stream_name (s);
@@ -160,7 +160,7 @@ FFmpegExaminer::audio_stream_name (AVStream* s) const
string
FFmpegExaminer::subtitle_stream_name (AVStream* s) const
{
- stringstream n;
+ SafeStringStream n;
n << stream_name (s);
@@ -174,7 +174,7 @@ FFmpegExaminer::subtitle_stream_name (AVStream* s) const
string
FFmpegExaminer::stream_name (AVStream* s) const
{
- stringstream n;
+ SafeStringStream n;
if (s->metadata) {
AVDictionaryEntry const * lang = av_dict_get (s->metadata, "language", 0, 0);
diff --git a/src/lib/film.cc b/src/lib/film.cc
index 0a77caf50..54503ef72 100644
--- a/src/lib/film.cc
+++ b/src/lib/film.cc
@@ -22,7 +22,6 @@
#include <algorithm>
#include <fstream>
#include <cstdlib>
-#include <sstream>
#include <iomanip>
#include <unistd.h>
#include <boost/filesystem.hpp>
@@ -55,11 +54,11 @@
#include "ratio.h"
#include "cross.h"
#include "cinema.h"
+#include "safe_stringstream.h"
#include "i18n.h"
using std::string;
-using std::stringstream;
using std::multimap;
using std::pair;
using std::map;
@@ -92,9 +91,11 @@ using libdcp::raw_convert;
* 7 -> 8
* Use <Scale> tag in <VideoContent> rather than <Ratio>.
* 8 -> 9
- * DCI -> ISDCF
+ * DCI -> ISDCF.
+ * 9 -> 10
+ * Subtitle X and Y scale.
*/
-int const Film::current_state_version = 9;
+int const Film::current_state_version = 10;
/** Construct a Film object in a given directory.
*
@@ -159,7 +160,7 @@ Film::video_identifier () const
{
assert (container ());
- stringstream s;
+ SafeStringStream s;
s.imbue (std::locale::classic ());
s << container()->id()
@@ -493,7 +494,7 @@ Film::file (boost::filesystem::path f) const
string
Film::isdcf_name (bool if_created_now) const
{
- stringstream d;
+ SafeStringStream d;
string raw_name = name ();
@@ -581,18 +582,22 @@ Film::isdcf_name (bool if_created_now) const
d << "_" << container()->isdcf_name();
}
- /* XXX: this only works for content which has been scaled to a given ratio,
- and uses the first bit of content only.
- */
+ /* XXX: this uses the first bit of content only */
/* The standard says we don't do this for trailers, for some strange reason */
if (dcp_content_type() && dcp_content_type()->libdcp_kind() != libdcp::TRAILER) {
- ContentList cl = content ();
Ratio const * content_ratio = 0;
- for (ContentList::const_iterator i = cl.begin(); i != cl.end(); ++i) {
+ ContentList cl = content ();
+ for (ContentList::iterator i = cl.begin(); i != cl.end(); ++i) {
shared_ptr<VideoContent> vc = dynamic_pointer_cast<VideoContent> (*i);
- if (vc && (content_ratio == 0 || vc->scale().ratio() != content_ratio)) {
- content_ratio = vc->scale().ratio();
+ if (vc) {
+ /* Here's the first piece of video content */
+ if (vc->scale().ratio ()) {
+ content_ratio = vc->scale().ratio ();
+ } else {
+ content_ratio = Ratio::from_ratio (vc->video_size().ratio ());
+ }
+ break;
}
}
@@ -817,7 +822,7 @@ Film::info_path (int f, Eyes e) const
boost::filesystem::path p;
p /= info_dir ();
- stringstream s;
+ SafeStringStream s;
s.width (8);
s << setfill('0') << f;
@@ -844,7 +849,7 @@ Film::j2c_path (int f, Eyes e, bool t) const
p /= "j2c";
p /= video_identifier ();
- stringstream s;
+ SafeStringStream s;
s.width (8);
s << setfill('0') << f;
diff --git a/src/lib/filter_graph.cc b/src/lib/filter_graph.cc
index c11ee6331..639992d70 100644
--- a/src/lib/filter_graph.cc
+++ b/src/lib/filter_graph.cc
@@ -34,10 +34,10 @@ extern "C" {
#include "exceptions.h"
#include "image.h"
#include "ffmpeg_content.h"
+#include "safe_stringstream.h"
#include "i18n.h"
-using std::stringstream;
using std::string;
using std::list;
using std::pair;
@@ -80,7 +80,7 @@ FilterGraph::FilterGraph (shared_ptr<const FFmpegContent> content, libdcp::Size
throw DecodeError (N_("Could not create buffer sink filter"));
}
- stringstream a;
+ SafeStringStream a;
a << "video_size=" << _size.width << "x" << _size.height << ":"
<< "pix_fmt=" << _pixel_format << ":"
<< "time_base=1/1:"
@@ -114,7 +114,7 @@ FilterGraph::FilterGraph (shared_ptr<const FFmpegContent> content, libdcp::Size
inputs->pad_idx = 0;
inputs->next = 0;
- if (avfilter_graph_parse (graph, filters.c_str(), &inputs, &outputs, 0) < 0) {
+ if (avfilter_graph_parse (graph, filters.c_str(), inputs, outputs, 0) < 0) {
throw DecodeError (N_("could not set up filter graph."));
}
diff --git a/src/lib/frame_rate_change.cc b/src/lib/frame_rate_change.cc
index 454938ada..31fce6b6d 100644
--- a/src/lib/frame_rate_change.cc
+++ b/src/lib/frame_rate_change.cc
@@ -23,6 +23,8 @@
#include "i18n.h"
+using std::string;
+
static bool
about_equal (float a, float b)
{
@@ -73,7 +75,13 @@ FrameRateChange::FrameRateChange (float source_, int dcp_)
speed_up = dcp / (source * factor());
change_speed = !about_equal (speed_up, 1.0);
+}
+string
+FrameRateChange::description () const
+{
+ string description;
+
if (!skip && repeat == 1 && !change_speed) {
description = _("Content and DCP have the same rate.\n");
} else {
@@ -90,4 +98,6 @@ FrameRateChange::FrameRateChange (float source_, int dcp_)
description += String::compose (_("DCP will run at %1%% of the content speed.\n"), pc);
}
}
+
+ return description;
}
diff --git a/src/lib/frame_rate_change.h b/src/lib/frame_rate_change.h
index f53adc059..f5244fea2 100644
--- a/src/lib/frame_rate_change.h
+++ b/src/lib/frame_rate_change.h
@@ -60,7 +60,7 @@ struct FrameRateChange
*/
float speed_up;
- std::string description;
+ std::string description () const;
};
#endif
diff --git a/src/lib/image.cc b/src/lib/image.cc
index 1c6c02979..3b8c1a28e 100644
--- a/src/lib/image.cc
+++ b/src/lib/image.cc
@@ -38,7 +38,6 @@ using std::string;
using std::min;
using std::cout;
using std::cerr;
-using std::stringstream;
using boost::shared_ptr;
using libdcp::Size;
diff --git a/src/lib/image_content.cc b/src/lib/image_content.cc
index 6acf0bab9..915da7beb 100644
--- a/src/lib/image_content.cc
+++ b/src/lib/image_content.cc
@@ -25,12 +25,12 @@
#include "film.h"
#include "job.h"
#include "frame_rate_change.h"
+#include "safe_stringstream.h"
#include "i18n.h"
using std::string;
using std::cout;
-using std::stringstream;
using boost::shared_ptr;
ImageContent::ImageContent (shared_ptr<const Film> f, boost::filesystem::path p)
@@ -138,7 +138,7 @@ ImageContent::full_length () const
string
ImageContent::identifier () const
{
- stringstream s;
+ SafeStringStream s;
s << VideoContent::identifier ();
s << "_" << video_length();
return s.str ();
diff --git a/src/lib/image_proxy.cc b/src/lib/image_proxy.cc
index ba572c727..3aba6cf7c 100644
--- a/src/lib/image_proxy.cc
+++ b/src/lib/image_proxy.cc
@@ -32,7 +32,6 @@
using std::cout;
using std::string;
-using std::stringstream;
using boost::shared_ptr;
ImageProxy::ImageProxy (shared_ptr<Log> log)
@@ -122,10 +121,30 @@ MagickImageProxy::image () const
LOG_TIMING ("[%1] MagickImageProxy begins decode and convert of %2 bytes", boost::this_thread::get_id(), _blob.length());
Magick::Image* magick_image = 0;
+ string error;
try {
magick_image = new Magick::Image (_blob);
- } catch (...) {
- throw DecodeError (_("Could not decode image file"));
+ } catch (Magick::Exception& e) {
+ error = e.what ();
+ }
+
+ if (!magick_image) {
+ /* ImageMagick cannot auto-detect Targa files, it seems, so try here with an
+ explicit format. I can't find it documented that passing a (0, 0) geometry
+ is allowed, but it seems to work.
+ */
+ try {
+ magick_image = new Magick::Image (_blob, Magick::Geometry (0, 0), "TGA");
+ } catch (...) {
+
+ }
+ }
+
+ if (!magick_image) {
+ /* If we failed both an auto-detect and a forced-Targa we give the error from
+ the auto-detect.
+ */
+ throw DecodeError (String::compose (_("Could not decode image file (%1)"), error));
}
LOG_TIMING ("[%1] MagickImageProxy decode finished", boost::this_thread::get_id ());
diff --git a/src/lib/image_proxy.h b/src/lib/image_proxy.h
index f6212e54f..c0ccd9125 100644
--- a/src/lib/image_proxy.h
+++ b/src/lib/image_proxy.h
@@ -49,6 +49,7 @@ class ImageProxy : public boost::noncopyable
{
public:
ImageProxy (boost::shared_ptr<Log> log);
+ virtual ~ImageProxy () {}
/** @return Image (which must be aligned) */
virtual boost::shared_ptr<Image> image () const = 0;
diff --git a/src/lib/internet.cc b/src/lib/internet.cc
index 99ae5c214..1c61e96e3 100644
--- a/src/lib/internet.cc
+++ b/src/lib/internet.cc
@@ -24,11 +24,11 @@
#include <curl/curl.h>
#include <zip.h>
#include "util.h"
+#include "safe_stringstream.h"
#include "i18n.h"
using std::string;
-using std::stringstream;
using std::list;
using boost::optional;
using boost::function;
@@ -56,6 +56,8 @@ get_from_zip_url (string url, string file, function<void (boost::filesystem::pat
curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, get_from_zip_url_data);
curl_easy_setopt (curl, CURLOPT_WRITEDATA, f);
curl_easy_setopt (curl, CURLOPT_FTP_USE_EPSV, 0);
+ /* Maximum time is 20s */
+ curl_easy_setopt (curl, CURLOPT_TIMEOUT, 20);
CURLcode const cr = curl_easy_perform (curl);
@@ -117,6 +119,8 @@ ftp_ls (string url)
url += "/";
}
curl_easy_setopt (curl, CURLOPT_URL, url.c_str ());
+ /* 20s timeout */
+ curl_easy_setopt (curl, CURLOPT_TIMEOUT, 20);
string ls_raw;
struct curl_slist* commands = 0;
@@ -130,11 +134,10 @@ ftp_ls (string url)
return list<string> ();
}
- stringstream s (ls_raw);
- string line;
+ SafeStringStream s (ls_raw);
list<string> ls;
while (s.good ()) {
- getline (s, line);
+ string const line = s.getline ();
if (line.length() > 55) {
string const file = line.substr (55);
if (file != "." && file != "..") {
diff --git a/src/lib/job.cc b/src/lib/job.cc
index 96aedac65..52ec1426c 100644
--- a/src/lib/job.cc
+++ b/src/lib/job.cc
@@ -29,13 +29,13 @@
#include "cross.h"
#include "ui_signaller.h"
#include "exceptions.h"
+#include "safe_stringstream.h"
#include "i18n.h"
using std::string;
using std::list;
using std::cout;
-using std::stringstream;
using boost::shared_ptr;
Job::Job (shared_ptr<const Film> f)
@@ -306,7 +306,7 @@ Job::status () const
pc = 99;
}
- stringstream s;
+ SafeStringStream s;
if (!finished ()) {
s << pc << N_("%");
if (p >= 0 && t > 10 && r > 0) {
@@ -325,29 +325,6 @@ Job::status () const
return s.str ();
}
-string
-Job::json_status () const
-{
- boost::mutex::scoped_lock lm (_state_mutex);
-
- switch (_state) {
- case NEW:
- return N_("new");
- case RUNNING:
- return N_("running");
- case PAUSED:
- return N_("paused");
- case FINISHED_OK:
- return N_("finished_ok");
- case FINISHED_ERROR:
- return N_("finished_error");
- case FINISHED_CANCELLED:
- return N_("finished_cancelled");
- }
-
- return "";
-}
-
/** @return An estimate of the remaining time for this sub-job, in seconds */
int
Job::remaining_time () const
diff --git a/src/lib/job.h b/src/lib/job.h
index 5e3127dc1..97e3fc296 100644
--- a/src/lib/job.h
+++ b/src/lib/job.h
@@ -43,7 +43,6 @@ public:
/** @return user-readable name of this job */
virtual std::string name () const = 0;
- virtual std::string json_name () const = 0;
/** Run this job in the current thread. */
virtual void run () = 0;
@@ -65,7 +64,6 @@ public:
int elapsed_time () const;
virtual std::string status () const;
- std::string json_status () const;
std::string sub_name () const {
return _sub_name;
}
diff --git a/src/lib/json_server.cc b/src/lib/json_server.cc
deleted file mode 100644
index 1be3c7d0e..000000000
--- a/src/lib/json_server.cc
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- Copyright (C) 2014 Carl Hetherington <cth@carlh.net>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include <boost/asio.hpp>
-#include <boost/bind.hpp>
-#include <boost/thread.hpp>
-#include "json_server.h"
-#include "job_manager.h"
-#include "job.h"
-#include "util.h"
-#include "film.h"
-#include "transcode_job.h"
-
-using std::string;
-using std::stringstream;
-using std::cout;
-using std::map;
-using std::list;
-using boost::thread;
-using boost::shared_ptr;
-using boost::dynamic_pointer_cast;
-using boost::asio::ip::tcp;
-
-#define MAX_LENGTH 512
-
-enum State {
- AWAITING_G,
- AWAITING_E,
- AWAITING_T,
- AWAITING_SPACE,
- READING_URL,
-};
-
-JSONServer::JSONServer (int port)
-{
- new thread (boost::bind (&JSONServer::run, this, port));
-}
-
-void
-JSONServer::run (int port)
-try
-{
- boost::asio::io_service io_service;
- tcp::acceptor a (io_service, tcp::endpoint (tcp::v4 (), port));
- while (true) {
- try {
- shared_ptr<tcp::socket> s (new tcp::socket (io_service));
- a.accept (*s);
- handle (s);
- }
- catch (...) {
-
- }
- }
-}
-catch (...)
-{
-
-}
-
-void
-JSONServer::handle (shared_ptr<tcp::socket> socket)
-{
- string url;
- State state = AWAITING_G;
-
- while (true) {
- char data[MAX_LENGTH];
- boost::system::error_code error;
- size_t len = socket->read_some (boost::asio::buffer (data), error);
- if (error) {
- cout << "error.\n";
- break;
- }
-
- char* p = data;
- char* e = data + len;
- while (p != e) {
-
- State old_state = state;
- switch (state) {
- case AWAITING_G:
- if (*p == 'G') {
- state = AWAITING_E;
- }
- break;
- case AWAITING_E:
- if (*p == 'E') {
- state = AWAITING_T;
- }
- break;
- case AWAITING_T:
- if (*p == 'T') {
- state = AWAITING_SPACE;
- }
- break;
- case AWAITING_SPACE:
- if (*p == ' ') {
- state = READING_URL;
- }
- break;
- case READING_URL:
- if (*p == ' ') {
- request (url, socket);
- state = AWAITING_G;
- url = "";
- } else {
- url += *p;
- }
- break;
- }
-
- if (state == old_state && state != READING_URL) {
- state = AWAITING_G;
- }
-
- ++p;
- }
- }
-}
-
-void
-JSONServer::request (string url, shared_ptr<tcp::socket> socket)
-{
- cout << "request: " << url << "\n";
-
- map<string, string> r = split_get_request (url);
- for (map<string, string>::iterator i = r.begin(); i != r.end(); ++i) {
- cout << i->first << " => " << i->second << "\n";
- }
-
- string action;
- if (r.find ("action") != r.end ()) {
- action = r["action"];
- }
-
- stringstream json;
- if (action == "status") {
-
- list<shared_ptr<Job> > jobs = JobManager::instance()->get ();
-
- json << "{ \"jobs\": [";
- for (list<shared_ptr<Job> >::iterator i = jobs.begin(); i != jobs.end(); ++i) {
-
- json << "{ ";
-
- if ((*i)->film()) {
- json << "\"dcp\": \"" << (*i)->film()->dcp_name() << "\", ";
- }
-
- json << "\"name\": \"" << (*i)->json_name() << "\", "
- << "\"progress\": " << (*i)->progress () << ", "
- << "\"status\": \"" << (*i)->json_status() << "\"";
- json << " }";
-
- list<shared_ptr<Job> >::iterator j = i;
- ++j;
- if (j != jobs.end ()) {
- json << ", ";
- }
- }
- json << "] }";
-
- if (json.str().empty ()) {
- json << "{ }";
- }
- }
-
- stringstream reply;
- reply << "HTTP/1.1 200 OK\r\n"
- << "Content-Length: " << json.str().length() << "\r\n"
- << "Content-Type: application/json\r\n"
- << "\r\n"
- << json.str () << "\r\n";
- cout << "reply: " << json.str() << "\n";
- boost::asio::write (*socket, boost::asio::buffer (reply.str().c_str(), reply.str().length()));
-}
diff --git a/src/lib/kdm.cc b/src/lib/kdm.cc
index 49bfae20a..f5054b8ed 100644
--- a/src/lib/kdm.cc
+++ b/src/lib/kdm.cc
@@ -28,10 +28,10 @@
#include "util.h"
#include "film.h"
#include "config.h"
+#include "safe_stringstream.h"
using std::list;
using std::string;
-using std::stringstream;
using std::cout;
using boost::shared_ptr;
@@ -232,21 +232,34 @@ email_kdms (
/* Send email */
quickmail_initialize ();
- quickmail mail = quickmail_create (Config::instance()->kdm_from().c_str(), "KDM delivery");
+
+ SafeStringStream start;
+ start << from.date() << " " << from.time_of_day();
+ SafeStringStream end;
+ end << to.date() << " " << to.time_of_day();
+
+ string subject = Config::instance()->kdm_subject();
+ boost::algorithm::replace_all (subject, "$CPL_NAME", film->dcp_name ());
+ boost::algorithm::replace_all (subject, "$START_TIME", start.str ());
+ boost::algorithm::replace_all (subject, "$END_TIME", end.str ());
+ boost::algorithm::replace_all (subject, "$CINEMA_NAME", i->cinema->name);
+ quickmail mail = quickmail_create (Config::instance()->kdm_from().c_str(), subject.c_str ());
+
quickmail_add_to (mail, i->cinema->email.c_str ());
if (!Config::instance()->kdm_cc().empty ()) {
quickmail_add_cc (mail, Config::instance()->kdm_cc().c_str ());
}
+ if (!Config::instance()->kdm_bcc().empty ()) {
+ quickmail_add_bcc (mail, Config::instance()->kdm_bcc().c_str ());
+ }
+
string body = Config::instance()->kdm_email().c_str();
boost::algorithm::replace_all (body, "$CPL_NAME", film->dcp_name ());
- stringstream start;
- start << from.date() << " " << from.time_of_day();
boost::algorithm::replace_all (body, "$START_TIME", start.str ());
- stringstream end;
- end << to.date() << " " << to.time_of_day();
boost::algorithm::replace_all (body, "$END_TIME", end.str ());
boost::algorithm::replace_all (body, "$CINEMA_NAME", i->cinema->name);
- stringstream screens;
+
+ SafeStringStream screens;
for (list<ScreenKDM>::const_iterator j = i->screen_kdms.begin(); j != i->screen_kdms.end(); ++j) {
screens << j->screen->name << ", ";
}
diff --git a/src/lib/log.cc b/src/lib/log.cc
index 4de6bd874..5e8277a23 100644
--- a/src/lib/log.cc
+++ b/src/lib/log.cc
@@ -26,6 +26,7 @@
#include "log.h"
#include "cross.h"
#include "config.h"
+#include "safe_stringstream.h"
#include "i18n.h"
@@ -63,7 +64,7 @@ Log::log (string message, int type)
time (&t);
string a = ctime (&t);
- stringstream s;
+ SafeStringStream s;
s << a.substr (0, a.length() - 1) << N_(": ");
if (type & TYPE_ERROR) {
@@ -90,7 +91,7 @@ Log::microsecond_log (string m, int t)
struct timeval tv;
gettimeofday (&tv, 0);
- stringstream s;
+ SafeStringStream s;
s << tv.tv_sec << N_(":") << tv.tv_usec << N_(" ") << m;
do_log (s.str ());
}
diff --git a/src/lib/md5_digester.cc b/src/lib/md5_digester.cc
index 1244209bd..1d4d1974a 100644
--- a/src/lib/md5_digester.cc
+++ b/src/lib/md5_digester.cc
@@ -18,12 +18,11 @@
*/
#include <iomanip>
-#include <sstream>
#include <openssl/md5.h>
#include "md5_digester.h"
+#include "safe_stringstream.h"
using std::string;
-using std::stringstream;
using std::hex;
using std::setfill;
using std::setw;
@@ -51,7 +50,7 @@ MD5Digester::get () const
unsigned char digest[MD5_DIGEST_LENGTH];
MD5_Final (digest, &_context);
- stringstream s;
+ SafeStringStream s;
for (int i = 0; i < MD5_DIGEST_LENGTH; ++i) {
s << hex << setfill('0') << setw(2) << ((int) digest[i]);
}
diff --git a/src/lib/player.cc b/src/lib/player.cc
index 2d2977606..8063d1212 100644
--- a/src/lib/player.cc
+++ b/src/lib/player.cc
@@ -497,7 +497,8 @@ Player::content_changed (weak_ptr<Content> w, int property, bool frequent)
} else if (
property == SubtitleContentProperty::SUBTITLE_X_OFFSET ||
property == SubtitleContentProperty::SUBTITLE_Y_OFFSET ||
- property == SubtitleContentProperty::SUBTITLE_SCALE
+ property == SubtitleContentProperty::SUBTITLE_X_SCALE ||
+ property == SubtitleContentProperty::SUBTITLE_Y_SCALE
) {
for (list<Subtitle>::iterator i = _subtitles.begin(); i != _subtitles.end(); ++i) {
diff --git a/src/lib/playlist.cc b/src/lib/playlist.cc
index df3e63303..c3e430082 100644
--- a/src/lib/playlist.cc
+++ b/src/lib/playlist.cc
@@ -40,7 +40,6 @@ using std::vector;
using std::min;
using std::max;
using std::string;
-using std::stringstream;
using std::pair;
using boost::optional;
using boost::shared_ptr;
@@ -389,7 +388,6 @@ Playlist::move_later (shared_ptr<Content> c)
return;
}
- Time const p = (*next)->position ();
(*next)->set_position (c->position ());
c->set_position (c->position() + c->length_after_trim ());
sort (_content.begin(), _content.end(), ContentSorter ());
diff --git a/src/lib/po/de_DE.po b/src/lib/po/de_DE.po
index 8137b24c1..db084cb3e 100644
--- a/src/lib/po/de_DE.po
+++ b/src/lib/po/de_DE.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-24 14:53+0100\n"
-"PO-Revision-Date: 2014-07-02 17:01+0100\n"
+"POT-Creation-Date: 2014-10-03 22:31+0100\n"
+"PO-Revision-Date: 2014-07-13 02:32+0100\n"
"Last-Translator: Carsten Kurz\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: de\n"
@@ -34,23 +34,23 @@ msgstr "%1 Kanäle, %2kHz, %3 samples"
msgid "%1 frames; %2 frames per second"
msgstr "%1 Bilder; %2 Bilder pro Sekunde"
-#: src/lib/video_content.cc:206
+#: src/lib/video_content.cc:211
msgid "%1x%2 pixels (%3:1)"
msgstr "%1x%2 pixel (%3:1)"
-#: src/lib/ratio.cc:35
+#: src/lib/ratio.cc:34
msgid "1.19"
msgstr "1.19"
-#: src/lib/ratio.cc:38
+#: src/lib/ratio.cc:37
msgid "1.375"
msgstr "1.375"
-#: src/lib/ratio.cc:39
+#: src/lib/ratio.cc:38
msgid "1.66"
msgstr "1.66"
-#: src/lib/ratio.cc:40
+#: src/lib/ratio.cc:39
msgid "16:9"
msgstr "16:9"
@@ -58,11 +58,11 @@ msgstr "16:9"
msgid "3D denoiser"
msgstr "3D Rauschunterdrückung"
-#: src/lib/ratio.cc:36
+#: src/lib/ratio.cc:35
msgid "4:3"
msgstr "4:3"
-#: src/lib/ratio.cc:37
+#: src/lib/ratio.cc:36
msgid "Academy"
msgstr "Academy"
@@ -98,15 +98,15 @@ msgstr "Abgebrochen"
msgid "Cannot handle pixel format %1 during %2"
msgstr "Kann dieses Pixelformat %1 während %2 nicht bearbeiten"
-#: src/lib/util.cc:751
+#: src/lib/util.cc:786
msgid "Centre"
msgstr "Center"
-#: src/lib/writer.cc:82
+#: src/lib/writer.cc:83
msgid "Checking existing image data"
msgstr "Überprüfe bestehende Bilddateien"
-#: src/lib/writer.cc:471
+#: src/lib/writer.cc:475
msgid "Computing audio digest"
msgstr "Tonübersicht berechnen"
@@ -114,11 +114,11 @@ msgstr "Tonübersicht berechnen"
msgid "Computing digest"
msgstr "Zusammenfassung berechnen"
-#: src/lib/writer.cc:467
+#: src/lib/writer.cc:471
msgid "Computing image digest"
msgstr "Bildübersicht berechnen"
-#: src/lib/frame_rate_change.cc:78
+#: src/lib/frame_rate_change.cc:86
msgid "Content and DCP have the same rate.\n"
msgstr "Quelle und DCP haben dieselbe Bildrate. Gut ;-)\n"
@@ -131,95 +131,103 @@ msgid "Content to be joined must have the same audio gain."
msgstr ""
"Zu verbindende Inhalte müssen die gleichen Tonpegeleinstellungen verwenden."
-#: src/lib/video_content.cc:144
+#: src/lib/video_content.cc:146
msgid "Content to be joined must have the same colour conversion."
msgstr "Zu verbindende Inhalte müssen die gleiche Farbumwandlung verwenden."
-#: src/lib/video_content.cc:136
+#: src/lib/video_content.cc:138
msgid "Content to be joined must have the same crop."
msgstr "Zu verbindende Inhalte müssen gleichen Beschnitt verwenden."
-#: src/lib/video_content.cc:124
+#: src/lib/video_content.cc:126
msgid "Content to be joined must have the same picture size."
msgstr "Zu verbindende Inhalte müssen die gleiche Bildgröße haben."
-#: src/lib/video_content.cc:140
+#: src/lib/video_content.cc:142
msgid "Content to be joined must have the same scale setting."
msgstr "Zu verbindende Inhalte müssen die gleiche Skalierung verwenden."
-#: src/lib/subtitle_content.cc:73
+#: src/lib/subtitle_content.cc:81
msgid "Content to be joined must have the same subtitle X offset."
msgstr ""
"Zu verbindende Inhalte müssen den gleichen horizontalen Untertitelversatz "
"verwenden."
-#: src/lib/subtitle_content.cc:77
+#: src/lib/subtitle_content.cc:89
+#, fuzzy
+msgid "Content to be joined must have the same subtitle X scale."
+msgstr "Zu verbindende Inhalte müssen die gleiche Untertitelgröße verwenden."
+
+#: src/lib/subtitle_content.cc:85
msgid "Content to be joined must have the same subtitle Y offset."
msgstr ""
"Zu verbindende Inhalte müssen den gleichen vertikalen Untertitelversatz "
"verwenden."
-#: src/lib/subtitle_content.cc:81
-msgid "Content to be joined must have the same subtitle scale."
+#: src/lib/subtitle_content.cc:93
+#, fuzzy
+msgid "Content to be joined must have the same subtitle Y scale."
msgstr "Zu verbindende Inhalte müssen die gleiche Untertitelgröße verwenden."
-#: src/lib/video_content.cc:128
+#: src/lib/video_content.cc:130
msgid "Content to be joined must have the same video frame rate."
msgstr "Zu verbindende Inhalte müssen die gleiche Bildrate haben."
-#: src/lib/video_content.cc:132
+#: src/lib/video_content.cc:134
msgid "Content to be joined must have the same video frame type."
-msgstr "Zu verbindende Inhalte müssen die gleiche Bildart (z.B. 2D) haben."
+msgstr "Zu verbindende Inhalte müssen den gleichen Bildtyp (z.B. 2D) haben."
#: src/lib/ffmpeg_content.cc:116
msgid "Content to be joined must use the same audio stream."
-msgstr "Zu verbindende Inhalte müssen die gleiche Tonspurart verwenden."
+msgstr ""
+"Zu verbindende Inhalte müssen die gleiche Tonspurkonfiguration verwenden."
#: src/lib/ffmpeg_content.cc:112
msgid "Content to be joined must use the same subtitle stream."
msgstr "Zu verbindende Inhalte müssen die gleiche Untertitelspur verwenden."
-#: src/lib/scp_dcp_job.cc:112
+#: src/lib/scp_dcp_job.cc:111
msgid "Copy DCP to TMS"
msgstr "DCP zu TMS übertragen"
-#: src/lib/scp_dcp_job.cc:137
+#: src/lib/scp_dcp_job.cc:130
msgid "Could not connect to server %1 (%2)"
msgstr "Keine Verbindung zu Server %1 (%2)"
-#: src/lib/scp_dcp_job.cc:159
+#: src/lib/scp_dcp_job.cc:152
msgid "Could not create remote directory %1 (%2)"
msgstr "Konnte entfernten Ordner %1 (%2) nicht erstellen."
-#: src/lib/image_proxy.cc:128
-msgid "Could not decode image file"
+#: src/lib/image_proxy.cc:147
+#, fuzzy
+msgid "Could not decode image file (%1)"
msgstr "Bilddatei konnte nicht dekodiert werden"
#: src/lib/job.cc:90
msgid "Could not open %1"
msgstr "%1 konnte nicht geöffnet werden."
-#: src/lib/scp_dcp_job.cc:184
+#: src/lib/scp_dcp_job.cc:177
msgid "Could not open %1 to send"
msgstr "%1 konnte nicht zum Senden geöffnet werden"
-#: src/lib/internet.cc:72
+#: src/lib/internet.cc:74
msgid "Could not open downloaded ZIP file"
msgstr "Heruntergeladene ZIP Datei kann nicht geöffnet werden."
-#: src/lib/scp_dcp_job.cc:154
+#: src/lib/scp_dcp_job.cc:147
msgid "Could not start SCP session (%1)"
msgstr "SCP Session (%1) konnte nicht gestartet werden"
-#: src/lib/scp_dcp_job.cc:198
+#: src/lib/scp_dcp_job.cc:191
msgid "Could not write to remote file (%1)"
msgstr "Entfernte Datei (%1) konnte nicht gespeichert werden"
-#: src/lib/frame_rate_change.cc:90
+#: src/lib/frame_rate_change.cc:98
msgid "DCP will run at %1%% of the content speed.\n"
msgstr "DCP läuft mit %1% der Original Geschwindigkeit der Quelle.\n"
-#: src/lib/frame_rate_change.cc:81
+#: src/lib/frame_rate_change.cc:89
msgid "DCP will use every other frame of the content.\n"
msgstr "DCP verwendet nur jedes zweite Bild des Quelle.\n"
@@ -241,7 +249,7 @@ msgstr ""
msgid "De-interlacing"
msgstr "De-Interlacer"
-#: src/lib/config.cc:417
+#: src/lib/config.cc:436
msgid ""
"Dear Projectionist\n"
"\n"
@@ -257,7 +265,7 @@ msgid ""
msgstr ""
"Sehr geehrter Vorfuehrer,\n"
"\n"
-"Im Anhang finden Sie die KDM für den Film $CPL_NAME.\n"
+"Im Anhang finden Sie die KDM fuer den Film $CPL_NAME.\n"
"\n"
"Der Schluessel ist vom $START_TIME bis zum $END_TIME gueltig fuer:\n"
"\n"
@@ -271,23 +279,23 @@ msgstr ""
msgid "Dolby CP650 and CP750"
msgstr "Dolby CP650 und CP750"
-#: src/lib/internet.cc:65
+#: src/lib/internet.cc:67
msgid "Download failed (%1/%2 error %3)"
msgstr "Herunterladen fehlgeschlagen (%1/%2 Fehler %3)"
-#: src/lib/frame_rate_change.cc:83
+#: src/lib/frame_rate_change.cc:91
msgid "Each content frame will be doubled in the DCP.\n"
msgstr "Jedes Bild der Quelle wird im DCP verdoppelt.\n"
-#: src/lib/frame_rate_change.cc:85
+#: src/lib/frame_rate_change.cc:93
msgid "Each content frame will be repeated %1 more times in the DCP.\n"
msgstr "Jedes Bild der Quelle wird %1 mal im DCP wiederholt.\n"
-#: src/lib/send_kdm_email_job.cc:50
+#: src/lib/send_kdm_email_job.cc:52
msgid "Email KDMs for %1"
msgstr "Email KDMs für %1"
-#: src/lib/writer.cc:125
+#: src/lib/writer.cc:126
msgid "Encoding image data"
msgstr "Kodiere Bilddaten"
@@ -299,7 +307,7 @@ msgstr "Fehler (%1)"
msgid "Examine content"
msgstr "Inhalt wird überprüft"
-#: src/lib/scp_dcp_job.cc:147
+#: src/lib/scp_dcp_job.cc:140
msgid "Failed to authenticate with server (%1)"
msgstr "Authentifizierung mit Server (%1) fehlgeschlagen"
@@ -311,11 +319,11 @@ msgstr "Schneller Bilinearer Filter"
msgid "Feature"
msgstr "Hauptfilm"
-#: src/lib/ratio.cc:41
+#: src/lib/ratio.cc:40
msgid "Flat"
msgstr "Flat"
-#: src/lib/ratio.cc:43
+#: src/lib/ratio.cc:42
msgid "Full frame"
msgstr "Ganzes Bild"
@@ -327,7 +335,7 @@ msgstr "Gauss Filter"
msgid "Gradient debander"
msgstr "Gradient Glätter"
-#: src/lib/util.cc:755
+#: src/lib/util.cc:790
msgid "Hearing impaired"
msgstr "HI"
@@ -343,6 +351,10 @@ msgstr ""
"Ein unbekannter Fehler ist aufgetreten. Bitte schicken Sie eine Nachricht an "
"den DCP-o-matic Autor (carl@dcpomatic.com)."
+#: src/lib/config.cc:199
+msgid "KDM delivery: $CPL_NAME"
+msgstr "KDM Zustellung: $CPL_NAME"
+
#: src/lib/filter.cc:66
msgid "Kernel deinterlacer"
msgstr "Kernel De-Interlacer"
@@ -351,23 +363,23 @@ msgstr "Kernel De-Interlacer"
msgid "Lanczos"
msgstr "Lanczos"
-#: src/lib/util.cc:749
+#: src/lib/util.cc:784
msgid "Left"
msgstr "Links"
-#: src/lib/util.cc:757
+#: src/lib/util.cc:792
msgid "Left centre"
msgstr "Center links"
-#: src/lib/util.cc:759
+#: src/lib/util.cc:794
msgid "Left rear surround"
msgstr "Surround hinten links"
-#: src/lib/util.cc:753
+#: src/lib/util.cc:788
msgid "Left surround"
msgstr "Surround links"
-#: src/lib/util.cc:752
+#: src/lib/util.cc:787
msgid "Lfe (sub)"
msgstr "LFE (Subwoofer)"
@@ -379,11 +391,11 @@ msgstr "Verschiedenes"
msgid "Motion compensating deinterlacer"
msgstr "Bewegungskompensierender De-Interlacer"
-#: src/lib/video_content.cc:476
+#: src/lib/video_content_scale.cc:105
msgid "No scale"
msgstr "Unskaliert"
-#: src/lib/video_content.cc:473
+#: src/lib/video_content_scale.cc:102
msgid "No stretch"
msgstr "Nicht verzerrt"
@@ -431,31 +443,31 @@ msgstr "Hinweis"
msgid "Rating"
msgstr "Freigabehinweis"
-#: src/lib/config.cc:84 src/lib/config.cc:173
+#: src/lib/config.cc:86 src/lib/config.cc:183
msgid "Rec. 709"
msgstr "Rec. 709"
-#: src/lib/util.cc:750
+#: src/lib/util.cc:785
msgid "Right"
msgstr "Rechts"
-#: src/lib/util.cc:758
+#: src/lib/util.cc:793
msgid "Right centre"
msgstr "Center rechts"
-#: src/lib/util.cc:760
+#: src/lib/util.cc:795
msgid "Right rear surround"
msgstr "Surround hinten rechts"
-#: src/lib/util.cc:754
+#: src/lib/util.cc:789
msgid "Right surround"
msgstr "Surround rechts"
-#: src/lib/scp_dcp_job.cc:142
+#: src/lib/scp_dcp_job.cc:135
msgid "SSH error (%1)"
msgstr "SSH Fehler (%1)"
-#: src/lib/ratio.cc:42
+#: src/lib/ratio.cc:41
msgid "Scope"
msgstr "Scope"
@@ -495,7 +507,7 @@ msgstr ""
msgid "There was not enough memory to do this."
msgstr "Zu wenig Speicher für diese Operation."
-#: src/lib/film.cc:413
+#: src/lib/film.cc:414
msgid ""
"This film was created with a newer version of DCP-o-matic, and it cannot be "
"loaded into this version. Sorry!"
@@ -504,7 +516,7 @@ msgstr ""
"kann leider nicht mit dieser älteren Version geladen werden. Sie müssen den "
"Film neu erstellen. Sorry!"
-#: src/lib/film.cc:405
+#: src/lib/film.cc:406
msgid ""
"This film was created with an older version of DCP-o-matic, and "
"unfortunately it cannot be loaded into this version. You will need to "
@@ -526,11 +538,11 @@ msgstr "Wandle %1 um"
msgid "Transitional"
msgstr "Überleitung"
-#: src/lib/internet.cc:77
+#: src/lib/internet.cc:79
msgid "Unexpected ZIP file contents"
msgstr "Ungültiger ZIP Inhalt"
-#: src/lib/image_proxy.cc:174
+#: src/lib/image_proxy.cc:193
msgid "Unexpected image type received by server"
msgstr "Ungültiges Bildformat vom Server erhalten"
@@ -538,7 +550,7 @@ msgstr "Ungültiges Bildformat vom Server erhalten"
msgid "Unknown error"
msgstr "Unbekannter Fehler"
-#: src/lib/ffmpeg_decoder.cc:295
+#: src/lib/ffmpeg_decoder.cc:293
msgid "Unrecognised audio sample format (%1)"
msgstr "Ton Sample Format (%1) nicht erkannt."
@@ -546,15 +558,15 @@ msgstr "Ton Sample Format (%1) nicht erkannt."
msgid "Unsharp mask and Gaussian blur"
msgstr "Unscharf Maskieren mit Gaußschem Unschärfefilter"
-#: src/lib/colour_conversion.cc:140
+#: src/lib/colour_conversion.cc:139
msgid "Untitled"
msgstr "Unbenannt"
-#: src/lib/util.cc:756
+#: src/lib/util.cc:791
msgid "Visually impaired"
msgstr "VI"
-#: src/lib/scp_dcp_job.cc:104
+#: src/lib/scp_dcp_job.cc:103
msgid "Waiting"
msgstr "Warte..."
@@ -566,7 +578,7 @@ msgstr "X"
msgid "Yet Another Deinterlacing Filter"
msgstr "Und ein weiterer De-Interlacer..."
-#: src/lib/film.cc:310
+#: src/lib/film.cc:311
msgid "You must add some content to the DCP before creating it"
msgstr "Sie müssen erst Inhalte hinzufügen bevor Sie ein DCP erstellen können!"
@@ -578,27 +590,27 @@ msgstr "[Bewegte Bilder]"
msgid "[still]"
msgstr "[Standbild]"
-#: src/lib/film.cc:258
+#: src/lib/film.cc:259
msgid "cannot contain slashes"
msgstr "Darf keine Schrägstriche enthalten"
-#: src/lib/util.cc:530
+#: src/lib/util.cc:565
msgid "connect timed out"
-msgstr "Zeit zur Verbindung abgelaufen"
+msgstr "Zeit für Verbindung abgelaufen"
-#: src/lib/scp_dcp_job.cc:128
+#: src/lib/scp_dcp_job.cc:121
msgid "connecting"
msgstr "verbinde..."
-#: src/lib/film.cc:306
+#: src/lib/film.cc:307
msgid "container"
msgstr "Containerformat"
-#: src/lib/film.cc:314
+#: src/lib/film.cc:315
msgid "content type"
msgstr "Inhaltsbeschreibung"
-#: src/lib/scp_dcp_job.cc:177
+#: src/lib/scp_dcp_job.cc:170
msgid "copying %1"
msgstr "kopiere %1"
@@ -606,19 +618,19 @@ msgstr "kopiere %1"
msgid "could not create file %1"
msgstr "Datei %1 konnte nicht erstellt werden."
-#: src/lib/ffmpeg.cc:177
+#: src/lib/ffmpeg.cc:176
msgid "could not find audio decoder"
msgstr "Ton Dekoder nicht gefunden."
-#: src/lib/ffmpeg.cc:106
+#: src/lib/ffmpeg.cc:105
msgid "could not find stream information"
msgstr "Keine Spur-Information gefunden"
-#: src/lib/ffmpeg.cc:156
+#: src/lib/ffmpeg.cc:155
msgid "could not find video decoder"
msgstr "Bild-Dekoder nicht gefunden"
-#: src/lib/writer.cc:435
+#: src/lib/writer.cc:439
msgid "could not move audio MXF into the DCP (%1)"
msgstr "Ton MXF kann nicht in das DCP verschoben werden (%1)"
@@ -630,11 +642,11 @@ msgstr "Tondatei kann nicht zum Lesen geöffnet werden."
msgid "could not open file %1"
msgstr "Datei %1 konnte nicht geöffnet werden."
-#: src/lib/dcp_video_frame.cc:334
+#: src/lib/dcp_video_frame.cc:331
msgid "could not open file for reading"
msgstr "Datei konnte nicht zum Lesen geöffnet werden."
-#: src/lib/dcp_video_frame.cc:340
+#: src/lib/dcp_video_frame.cc:337
msgid "could not read encoded data"
msgstr "Kodierte Daten nicht gefunden."
@@ -650,11 +662,11 @@ msgstr "Sample-Rate konnte nicht gewandelt werden"
msgid "could not run sample-rate converter for %1 samples (%2) (%3)"
msgstr "Sample-Rate für %1 samples konnte nicht gewandelt werden (%2)(%3)"
-#: src/lib/scp_dcp_job.cc:89
+#: src/lib/scp_dcp_job.cc:88
msgid "could not start SCP session (%1)"
msgstr "SCP Session konnte nicht gestartet werden (%1)"
-#: src/lib/scp_dcp_job.cc:55
+#: src/lib/scp_dcp_job.cc:54
msgid "could not start SSH session"
msgstr "SSH Session konnte nicht gestartet werden"
@@ -662,43 +674,43 @@ msgstr "SSH Session konnte nicht gestartet werden"
msgid "could not write to file %1 (%2)"
msgstr "Datei %1 konnte nicht geschrieben werden (%2)"
-#: src/lib/util.cc:550
+#: src/lib/util.cc:585
msgid "error during async_accept (%1)"
msgstr "error during async_accept (%1)"
-#: src/lib/util.cc:526
+#: src/lib/util.cc:561
msgid "error during async_connect (%1)"
msgstr "error during async_connect (%1)"
-#: src/lib/util.cc:599
+#: src/lib/util.cc:634
msgid "error during async_read (%1)"
msgstr "error during async_read (%1)"
-#: src/lib/util.cc:571
+#: src/lib/util.cc:606
msgid "error during async_write (%1)"
msgstr "error during async_write (%1)"
-#: src/lib/transcode_job.cc:103
+#: src/lib/transcode_job.cc:97
msgid "frames per second"
msgstr "Bilder pro Sekunde"
-#: src/lib/util.cc:152
+#: src/lib/util.cc:156
msgid "hour"
msgstr "Stunde"
-#: src/lib/util.cc:149 src/lib/util.cc:154
+#: src/lib/util.cc:152 src/lib/util.cc:158
msgid "hours"
msgstr "Stunden"
-#: src/lib/util.cc:159
+#: src/lib/util.cc:174
msgid "minute"
msgstr "Minute"
-#: src/lib/util.cc:161
+#: src/lib/util.cc:170 src/lib/util.cc:176
msgid "minutes"
msgstr "Minuten"
-#: src/lib/util.cc:671
+#: src/lib/util.cc:706
msgid "missing key %1 in key-value set"
msgstr "Key %1 in Key-value set fehlt"
@@ -710,15 +722,15 @@ msgstr "Benötigte Einstellung %1 fehlt"
msgid "moving"
msgstr "wird verschoben"
-#: src/lib/ffmpeg_decoder.cc:591
+#: src/lib/ffmpeg_decoder.cc:589
msgid "multi-part subtitles not yet supported"
msgstr "Mehr-Segment Untertitel werden noch nicht unterstützt"
-#: src/lib/film.cc:258 src/lib/film.cc:318
+#: src/lib/film.cc:259 src/lib/film.cc:319
msgid "name"
msgstr "Name"
-#: src/lib/ffmpeg_decoder.cc:606
+#: src/lib/ffmpeg_decoder.cc:604
msgid "non-bitmap subtitles not yet supported"
msgstr "Nur Bitmap Untertitel werden unterstützt"
@@ -728,15 +740,20 @@ msgstr "Nur Bitmap Untertitel werden unterstützt"
msgid "remaining"
msgstr "verbleibend"
-#: src/lib/config.cc:82 src/lib/video_content.cc:175
+#: src/lib/config.cc:84 src/lib/video_content.cc:179
msgid "sRGB"
msgstr "sRGB"
-#: src/lib/config.cc:83
+#: src/lib/config.cc:85
msgid "sRGB non-linearised"
msgstr "sRGB nicht linearisiert"
-#: src/lib/util.cc:164
+#: src/lib/util.cc:189
+#, fuzzy
+msgid "second"
+msgstr "Sekunden"
+
+#: src/lib/util.cc:191
msgid "seconds"
msgstr "Sekunden"
diff --git a/src/lib/po/es_ES.po b/src/lib/po/es_ES.po
index 813600fe5..fe5615e1e 100644
--- a/src/lib/po/es_ES.po
+++ b/src/lib/po/es_ES.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: LIBDCPOMATIC\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-24 14:53+0100\n"
+"POT-Creation-Date: 2014-10-03 22:31+0100\n"
"PO-Revision-Date: 2014-04-20 10:12-0500\n"
"Last-Translator: Manuel AC <manuel.acevedo@civantos.>\n"
"Language-Team: Manuel AC <manuel.acevedo@civantos.com>\n"
@@ -33,23 +33,23 @@ msgstr "%1 canales, %2kHz, %3 muestras"
msgid "%1 frames; %2 frames per second"
msgstr "%1 imágenes; %2 imágenes per second"
-#: src/lib/video_content.cc:206
+#: src/lib/video_content.cc:211
msgid "%1x%2 pixels (%3:1)"
msgstr "%1x%2 pixels (%3:1)"
-#: src/lib/ratio.cc:35
+#: src/lib/ratio.cc:34
msgid "1.19"
msgstr "1.19"
-#: src/lib/ratio.cc:38
+#: src/lib/ratio.cc:37
msgid "1.375"
msgstr "1.375"
-#: src/lib/ratio.cc:39
+#: src/lib/ratio.cc:38
msgid "1.66"
msgstr "1.66"
-#: src/lib/ratio.cc:40
+#: src/lib/ratio.cc:39
msgid "16:9"
msgstr "16:9"
@@ -57,11 +57,11 @@ msgstr "16:9"
msgid "3D denoiser"
msgstr "reducción de ruido 3D"
-#: src/lib/ratio.cc:36
+#: src/lib/ratio.cc:35
msgid "4:3"
msgstr "4:3"
-#: src/lib/ratio.cc:37
+#: src/lib/ratio.cc:36
msgid "Academy"
msgstr "Academy"
@@ -97,15 +97,15 @@ msgstr "Cancelado"
msgid "Cannot handle pixel format %1 during %2"
msgstr "No se puede usar el formato de pixel %1 para %2"
-#: src/lib/util.cc:751
+#: src/lib/util.cc:786
msgid "Centre"
msgstr "Centro"
-#: src/lib/writer.cc:82
+#: src/lib/writer.cc:83
msgid "Checking existing image data"
msgstr "Comprobando las imágenes existentes"
-#: src/lib/writer.cc:471
+#: src/lib/writer.cc:475
msgid "Computing audio digest"
msgstr "Calculando la firma resumen del audio"
@@ -113,11 +113,11 @@ msgstr "Calculando la firma resumen del audio"
msgid "Computing digest"
msgstr "Calculando la firma resumen"
-#: src/lib/writer.cc:467
+#: src/lib/writer.cc:471
msgid "Computing image digest"
msgstr "Calculando la firma resumen de imagen"
-#: src/lib/frame_rate_change.cc:78
+#: src/lib/frame_rate_change.cc:86
msgid "Content and DCP have the same rate.\n"
msgstr "La fuente y el DCP tienen la misma velocidad.\n"
@@ -129,41 +129,47 @@ msgstr "Para unir contenido debe tener el mismo retardo de audio."
msgid "Content to be joined must have the same audio gain."
msgstr "Para unir contenido debe tener la misma ganancia de audio."
-#: src/lib/video_content.cc:144
+#: src/lib/video_content.cc:146
msgid "Content to be joined must have the same colour conversion."
msgstr "Para unir contenido debe tener la misma conversión de color."
-#: src/lib/video_content.cc:136
+#: src/lib/video_content.cc:138
msgid "Content to be joined must have the same crop."
msgstr "Para unir contenido debe tener el mismo recorte."
-#: src/lib/video_content.cc:124
+#: src/lib/video_content.cc:126
msgid "Content to be joined must have the same picture size."
msgstr "Para unir contenido debe tener el mismo tamaño de imagen."
-#: src/lib/video_content.cc:140
+#: src/lib/video_content.cc:142
msgid "Content to be joined must have the same scale setting."
msgstr "Para unir contenido debe tener la misma redimensión."
-#: src/lib/subtitle_content.cc:73
+#: src/lib/subtitle_content.cc:81
msgid "Content to be joined must have the same subtitle X offset."
msgstr ""
"Para unir contenido debe tener el mismo desplazamiento de subtítulo en X."
-#: src/lib/subtitle_content.cc:77
+#: src/lib/subtitle_content.cc:89
+#, fuzzy
+msgid "Content to be joined must have the same subtitle X scale."
+msgstr "Para unir contenido debe tener el mismo tamaño de subtítulo."
+
+#: src/lib/subtitle_content.cc:85
msgid "Content to be joined must have the same subtitle Y offset."
msgstr ""
"Para unir contenido debe tener el mismo desplazamiento de subtítulo en Y."
-#: src/lib/subtitle_content.cc:81
-msgid "Content to be joined must have the same subtitle scale."
+#: src/lib/subtitle_content.cc:93
+#, fuzzy
+msgid "Content to be joined must have the same subtitle Y scale."
msgstr "Para unir contenido debe tener el mismo tamaño de subtítulo."
-#: src/lib/video_content.cc:128
+#: src/lib/video_content.cc:130
msgid "Content to be joined must have the same video frame rate."
msgstr "Para unir contenido debe tener la misma velocidad de imagen."
-#: src/lib/video_content.cc:132
+#: src/lib/video_content.cc:134
msgid "Content to be joined must have the same video frame type."
msgstr "Para unir contenido debe tener el mismo tamaño de imagen."
@@ -175,48 +181,48 @@ msgstr "Para unir contenido debe usar el mismo tipo de audio."
msgid "Content to be joined must use the same subtitle stream."
msgstr "Para unir contenido debe tener el mismo tipo de subtítulos."
-#: src/lib/scp_dcp_job.cc:112
+#: src/lib/scp_dcp_job.cc:111
msgid "Copy DCP to TMS"
msgstr "Copiar DCP al TMS"
-#: src/lib/scp_dcp_job.cc:137
+#: src/lib/scp_dcp_job.cc:130
msgid "Could not connect to server %1 (%2)"
msgstr "No se pudo conectar al servidor %1 (%2)"
-#: src/lib/scp_dcp_job.cc:159
+#: src/lib/scp_dcp_job.cc:152
msgid "Could not create remote directory %1 (%2)"
msgstr "No se pudo crear la carpeta remota %1 (%2)"
-#: src/lib/image_proxy.cc:128
+#: src/lib/image_proxy.cc:147
#, fuzzy
-msgid "Could not decode image file"
+msgid "Could not decode image file (%1)"
msgstr "No se pudo crear el fichero (%1)"
#: src/lib/job.cc:90
msgid "Could not open %1"
msgstr "No se pudo abrir %1"
-#: src/lib/scp_dcp_job.cc:184
+#: src/lib/scp_dcp_job.cc:177
msgid "Could not open %1 to send"
msgstr "No se pudo abrir %1 para enviar"
-#: src/lib/internet.cc:72
+#: src/lib/internet.cc:74
msgid "Could not open downloaded ZIP file"
msgstr "No se puedo abrir el fichero ZIP descargado"
-#: src/lib/scp_dcp_job.cc:154
+#: src/lib/scp_dcp_job.cc:147
msgid "Could not start SCP session (%1)"
msgstr "No se pudo iniciar la sesión SCP (%1)"
-#: src/lib/scp_dcp_job.cc:198
+#: src/lib/scp_dcp_job.cc:191
msgid "Could not write to remote file (%1)"
msgstr "No se pudo escribir el fichero remoto (%1)"
-#: src/lib/frame_rate_change.cc:90
+#: src/lib/frame_rate_change.cc:98
msgid "DCP will run at %1%% of the content speed.\n"
msgstr "El DCP se reproducirá al %1%% de la velocidad de la fuente.\n"
-#: src/lib/frame_rate_change.cc:81
+#: src/lib/frame_rate_change.cc:89
msgid "DCP will use every other frame of the content.\n"
msgstr "El DCP usará imágenes alternas de la fuente.\n"
@@ -237,7 +243,7 @@ msgstr "DCP-o-matic ya no ofrece el filtro `%1', así que ha sido desactivado."
msgid "De-interlacing"
msgstr "Desentrelazado"
-#: src/lib/config.cc:417
+#: src/lib/config.cc:436
#, fuzzy
msgid ""
"Dear Projectionist\n"
@@ -265,23 +271,23 @@ msgstr ""
msgid "Dolby CP650 and CP750"
msgstr "Dolby CP650 and CP750"
-#: src/lib/internet.cc:65
+#: src/lib/internet.cc:67
msgid "Download failed (%1/%2 error %3)"
msgstr "Descarga fallida (%1/%2 error %3)"
-#: src/lib/frame_rate_change.cc:83
+#: src/lib/frame_rate_change.cc:91
msgid "Each content frame will be doubled in the DCP.\n"
msgstr "Se doblará cada imagen en el DCP.\n"
-#: src/lib/frame_rate_change.cc:85
+#: src/lib/frame_rate_change.cc:93
msgid "Each content frame will be repeated %1 more times in the DCP.\n"
msgstr "Cada imagen será repetida otras %1 veces en el DCP.\n"
-#: src/lib/send_kdm_email_job.cc:50
+#: src/lib/send_kdm_email_job.cc:52
msgid "Email KDMs for %1"
msgstr "Enviar por email las KDM para %1"
-#: src/lib/writer.cc:125
+#: src/lib/writer.cc:126
msgid "Encoding image data"
msgstr "Codificando imagen"
@@ -293,7 +299,7 @@ msgstr "Error (%1)"
msgid "Examine content"
msgstr "Examinar contenido"
-#: src/lib/scp_dcp_job.cc:147
+#: src/lib/scp_dcp_job.cc:140
msgid "Failed to authenticate with server (%1)"
msgstr "Fallo al identificarse con el servidor (%1)"
@@ -305,11 +311,11 @@ msgstr "Bilineal rápido"
msgid "Feature"
msgstr "Película"
-#: src/lib/ratio.cc:41
+#: src/lib/ratio.cc:40
msgid "Flat"
msgstr "Flat"
-#: src/lib/ratio.cc:43
+#: src/lib/ratio.cc:42
msgid "Full frame"
msgstr "Frame completo"
@@ -321,7 +327,7 @@ msgstr "Gaussiano"
msgid "Gradient debander"
msgstr "Gradient debander"
-#: src/lib/util.cc:755
+#: src/lib/util.cc:790
msgid "Hearing impaired"
msgstr "Sordos"
@@ -338,6 +344,10 @@ msgstr ""
"Error desconocido. La mejor idea es informar del problema a la lista de "
"correo de DCP-o-matic (carl@dcpomatic.com)"
+#: src/lib/config.cc:199
+msgid "KDM delivery: $CPL_NAME"
+msgstr ""
+
#: src/lib/filter.cc:66
msgid "Kernel deinterlacer"
msgstr "Kernel deinterlacer"
@@ -346,23 +356,23 @@ msgstr "Kernel deinterlacer"
msgid "Lanczos"
msgstr "Lanczos"
-#: src/lib/util.cc:749
+#: src/lib/util.cc:784
msgid "Left"
msgstr "Izquierda"
-#: src/lib/util.cc:757
+#: src/lib/util.cc:792
msgid "Left centre"
msgstr "Centro izquierda"
-#: src/lib/util.cc:759
+#: src/lib/util.cc:794
msgid "Left rear surround"
msgstr "Surround trasero izquierda"
-#: src/lib/util.cc:753
+#: src/lib/util.cc:788
msgid "Left surround"
msgstr "Surround izquierda"
-#: src/lib/util.cc:752
+#: src/lib/util.cc:787
msgid "Lfe (sub)"
msgstr "Lfe (bajos)"
@@ -374,11 +384,11 @@ msgstr "Miscelánea"
msgid "Motion compensating deinterlacer"
msgstr "Motion compensating deinterlacer"
-#: src/lib/video_content.cc:476
+#: src/lib/video_content_scale.cc:105
msgid "No scale"
msgstr "No redimensionar"
-#: src/lib/video_content.cc:473
+#: src/lib/video_content_scale.cc:102
msgid "No stretch"
msgstr "Sin deformación"
@@ -423,31 +433,31 @@ msgstr "Anuncio de servicio público"
msgid "Rating"
msgstr "Clasificación"
-#: src/lib/config.cc:84 src/lib/config.cc:173
+#: src/lib/config.cc:86 src/lib/config.cc:183
msgid "Rec. 709"
msgstr "Rec. 709"
-#: src/lib/util.cc:750
+#: src/lib/util.cc:785
msgid "Right"
msgstr "Derecha"
-#: src/lib/util.cc:758
+#: src/lib/util.cc:793
msgid "Right centre"
msgstr "Centro derecha"
-#: src/lib/util.cc:760
+#: src/lib/util.cc:795
msgid "Right rear surround"
msgstr "Surround trasero derecha"
-#: src/lib/util.cc:754
+#: src/lib/util.cc:789
msgid "Right surround"
msgstr "Surround derecha"
-#: src/lib/scp_dcp_job.cc:142
+#: src/lib/scp_dcp_job.cc:135
msgid "SSH error (%1)"
msgstr "error SSH (%1)"
-#: src/lib/ratio.cc:42
+#: src/lib/ratio.cc:41
msgid "Scope"
msgstr "Scope"
@@ -487,7 +497,7 @@ msgstr ""
msgid "There was not enough memory to do this."
msgstr "No hubo suficiente memoria para hacer esto."
-#: src/lib/film.cc:413
+#: src/lib/film.cc:414
msgid ""
"This film was created with a newer version of DCP-o-matic, and it cannot be "
"loaded into this version. Sorry!"
@@ -496,7 +506,7 @@ msgstr ""
"desgraciadamente no s puede cargar. Necesitas crear una nueva película, "
"volver a añadir y configurar ton contenido. ¡Lo siento!"
-#: src/lib/film.cc:405
+#: src/lib/film.cc:406
msgid ""
"This film was created with an older version of DCP-o-matic, and "
"unfortunately it cannot be loaded into this version. You will need to "
@@ -518,11 +528,11 @@ msgstr "Codificar %1"
msgid "Transitional"
msgstr "Transitional"
-#: src/lib/internet.cc:77
+#: src/lib/internet.cc:79
msgid "Unexpected ZIP file contents"
msgstr "Contenidos inesperados del fichero ZIP"
-#: src/lib/image_proxy.cc:174
+#: src/lib/image_proxy.cc:193
msgid "Unexpected image type received by server"
msgstr ""
@@ -530,7 +540,7 @@ msgstr ""
msgid "Unknown error"
msgstr "Error desconocido"
-#: src/lib/ffmpeg_decoder.cc:295
+#: src/lib/ffmpeg_decoder.cc:293
msgid "Unrecognised audio sample format (%1)"
msgstr "Formato de audio desconocido (%1)"
@@ -538,15 +548,15 @@ msgstr "Formato de audio desconocido (%1)"
msgid "Unsharp mask and Gaussian blur"
msgstr "Máscara de desenfoque Gaussiano"
-#: src/lib/colour_conversion.cc:140
+#: src/lib/colour_conversion.cc:139
msgid "Untitled"
msgstr "Sin título"
-#: src/lib/util.cc:756
+#: src/lib/util.cc:791
msgid "Visually impaired"
msgstr "Ciegos"
-#: src/lib/scp_dcp_job.cc:104
+#: src/lib/scp_dcp_job.cc:103
msgid "Waiting"
msgstr "Esperando"
@@ -558,7 +568,7 @@ msgstr "X"
msgid "Yet Another Deinterlacing Filter"
msgstr "Yet Another Deinterlacing Filter"
-#: src/lib/film.cc:310
+#: src/lib/film.cc:311
msgid "You must add some content to the DCP before creating it"
msgstr "Tienes que añadir contenido al DCP antes de crearlo."
@@ -570,27 +580,27 @@ msgstr "[imágenes en movimiento]"
msgid "[still]"
msgstr "[imagen fija]"
-#: src/lib/film.cc:258
+#: src/lib/film.cc:259
msgid "cannot contain slashes"
msgstr "no puede contener barras"
-#: src/lib/util.cc:530
+#: src/lib/util.cc:565
msgid "connect timed out"
msgstr "tiempo de conexión agotado"
-#: src/lib/scp_dcp_job.cc:128
+#: src/lib/scp_dcp_job.cc:121
msgid "connecting"
msgstr "conectando"
-#: src/lib/film.cc:306
+#: src/lib/film.cc:307
msgid "container"
msgstr "continente"
-#: src/lib/film.cc:314
+#: src/lib/film.cc:315
msgid "content type"
msgstr "tipo de contenido"
-#: src/lib/scp_dcp_job.cc:177
+#: src/lib/scp_dcp_job.cc:170
msgid "copying %1"
msgstr "copiando %1"
@@ -598,19 +608,19 @@ msgstr "copiando %1"
msgid "could not create file %1"
msgstr "No se pudo crear el fichero (%1)"
-#: src/lib/ffmpeg.cc:177
+#: src/lib/ffmpeg.cc:176
msgid "could not find audio decoder"
msgstr "no se encontró el decodificador de audio"
-#: src/lib/ffmpeg.cc:106
+#: src/lib/ffmpeg.cc:105
msgid "could not find stream information"
msgstr "no se pudo encontrar información del flujo"
-#: src/lib/ffmpeg.cc:156
+#: src/lib/ffmpeg.cc:155
msgid "could not find video decoder"
msgstr "no se pudo encontrar decodificador de vídeo"
-#: src/lib/writer.cc:435
+#: src/lib/writer.cc:439
msgid "could not move audio MXF into the DCP (%1)"
msgstr "no s puedo mover el audio MXF en el DCP (%1)"
@@ -622,11 +632,11 @@ msgstr "no se pudo abrir el fichero de audio para lectura"
msgid "could not open file %1"
msgstr "no se pudo abrir el fichero %1"
-#: src/lib/dcp_video_frame.cc:334
+#: src/lib/dcp_video_frame.cc:331
msgid "could not open file for reading"
msgstr "no se pudo abrir el fichero para lectura"
-#: src/lib/dcp_video_frame.cc:340
+#: src/lib/dcp_video_frame.cc:337
msgid "could not read encoded data"
msgstr "no se pudo leer la información codificada"
@@ -642,11 +652,11 @@ msgstr "no se pudo ejecutar el conversor de velocidad"
msgid "could not run sample-rate converter for %1 samples (%2) (%3)"
msgstr "no se pudo ejecutar el conversor de velocidad"
-#: src/lib/scp_dcp_job.cc:89
+#: src/lib/scp_dcp_job.cc:88
msgid "could not start SCP session (%1)"
msgstr "no se pudo abrir la sesión SCP (%1)"
-#: src/lib/scp_dcp_job.cc:55
+#: src/lib/scp_dcp_job.cc:54
msgid "could not start SSH session"
msgstr "no se pudo abrir la sesión SSH"
@@ -654,43 +664,43 @@ msgstr "no se pudo abrir la sesión SSH"
msgid "could not write to file %1 (%2)"
msgstr "No se pudo escribir en el fichero (%1)"
-#: src/lib/util.cc:550
+#: src/lib/util.cc:585
msgid "error during async_accept (%1)"
msgstr "error durante async_accept (%1)"
-#: src/lib/util.cc:526
+#: src/lib/util.cc:561
msgid "error during async_connect (%1)"
msgstr "error durante async_connect (%1)"
-#: src/lib/util.cc:599
+#: src/lib/util.cc:634
msgid "error during async_read (%1)"
msgstr "error durante async_read (%1)"
-#: src/lib/util.cc:571
+#: src/lib/util.cc:606
msgid "error during async_write (%1)"
msgstr "error durante async_write (%1)"
-#: src/lib/transcode_job.cc:103
+#: src/lib/transcode_job.cc:97
msgid "frames per second"
msgstr "imágenes por segundo"
-#: src/lib/util.cc:152
+#: src/lib/util.cc:156
msgid "hour"
msgstr "hora"
-#: src/lib/util.cc:149 src/lib/util.cc:154
+#: src/lib/util.cc:152 src/lib/util.cc:158
msgid "hours"
msgstr "horas"
-#: src/lib/util.cc:159
+#: src/lib/util.cc:174
msgid "minute"
msgstr "minuto"
-#: src/lib/util.cc:161
+#: src/lib/util.cc:170 src/lib/util.cc:176
msgid "minutes"
msgstr "minutos"
-#: src/lib/util.cc:671
+#: src/lib/util.cc:706
msgid "missing key %1 in key-value set"
msgstr "falta la clave %1 en el par clave-valor"
@@ -702,15 +712,15 @@ msgstr "falta una configuración obligatoria %1"
msgid "moving"
msgstr "moviendo"
-#: src/lib/ffmpeg_decoder.cc:591
+#: src/lib/ffmpeg_decoder.cc:589
msgid "multi-part subtitles not yet supported"
msgstr "todavía no se soportan subtítulos en múltiples partes"
-#: src/lib/film.cc:258 src/lib/film.cc:318
+#: src/lib/film.cc:259 src/lib/film.cc:319
msgid "name"
msgstr "nombre"
-#: src/lib/ffmpeg_decoder.cc:606
+#: src/lib/ffmpeg_decoder.cc:604
msgid "non-bitmap subtitles not yet supported"
msgstr "todavía no se soportan subtítulos que no son en mapas de bits"
@@ -720,15 +730,20 @@ msgstr "todavía no se soportan subtítulos que no son en mapas de bits"
msgid "remaining"
msgstr "pendiente"
-#: src/lib/config.cc:82 src/lib/video_content.cc:175
+#: src/lib/config.cc:84 src/lib/video_content.cc:179
msgid "sRGB"
msgstr "sRGB"
-#: src/lib/config.cc:83
+#: src/lib/config.cc:85
msgid "sRGB non-linearised"
msgstr "sRGB no-lineal"
-#: src/lib/util.cc:164
+#: src/lib/util.cc:189
+#, fuzzy
+msgid "second"
+msgstr "segundos"
+
+#: src/lib/util.cc:191
msgid "seconds"
msgstr "segundos"
diff --git a/src/lib/po/fr_FR.po b/src/lib/po/fr_FR.po
index 6cef1b3dc..8f26f336a 100644
--- a/src/lib/po/fr_FR.po
+++ b/src/lib/po/fr_FR.po
@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: DCP-o-matic FRENCH\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-24 14:53+0100\n"
-"PO-Revision-Date: 2014-06-20 15:53+0100\n"
-"Last-Translator: \n"
+"POT-Creation-Date: 2014-10-03 22:31+0100\n"
+"PO-Revision-Date: 2014-07-14 12:04+0100\n"
+"Last-Translator: Grégoire AUSINA <gregoire@gisele-productions.eu>\n"
"Language-Team: \n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.6.3\n"
+"X-Generator: Poedit 1.6.6\n"
#: src/lib/sndfile_content.cc:61
msgid "%1 [audio]"
@@ -27,29 +27,29 @@ msgstr "%1 [vidéo]"
#: src/lib/sndfile_content.cc:82
msgid "%1 channels, %2kHz, %3 samples"
-msgstr "%1 canaux, %2kHz, %3 samples"
+msgstr "%1 canaux, %2kHz, %3 échantillons"
#: src/lib/ffmpeg_content.cc:246
msgid "%1 frames; %2 frames per second"
msgstr "%1 images ; %2 images par seconde"
-#: src/lib/video_content.cc:206
+#: src/lib/video_content.cc:211
msgid "%1x%2 pixels (%3:1)"
msgstr "%1x%2 pixels (%3:1)"
-#: src/lib/ratio.cc:35
+#: src/lib/ratio.cc:34
msgid "1.19"
msgstr "1.19"
-#: src/lib/ratio.cc:38
+#: src/lib/ratio.cc:37
msgid "1.375"
msgstr "1.375"
-#: src/lib/ratio.cc:39
+#: src/lib/ratio.cc:38
msgid "1.66"
msgstr "1.66"
-#: src/lib/ratio.cc:40
+#: src/lib/ratio.cc:39
msgid "16:9"
msgstr "16:9"
@@ -57,11 +57,11 @@ msgstr "16:9"
msgid "3D denoiser"
msgstr "Débruitage 3D"
-#: src/lib/ratio.cc:36
+#: src/lib/ratio.cc:35
msgid "4:3"
msgstr "4:3"
-#: src/lib/ratio.cc:37
+#: src/lib/ratio.cc:36
msgid "Academy"
msgstr "Academy"
@@ -79,7 +79,7 @@ msgstr "Analyse audio"
#: src/lib/scaler.cc:64
msgid "Area"
-msgstr "Area"
+msgstr "Surface"
#: src/lib/scaler.cc:62
msgid "Bicubic"
@@ -97,15 +97,15 @@ msgstr "Annulé"
msgid "Cannot handle pixel format %1 during %2"
msgstr "Format du pixel %1 non géré par %2"
-#: src/lib/util.cc:751
+#: src/lib/util.cc:786
msgid "Centre"
msgstr "Centre"
-#: src/lib/writer.cc:82
+#: src/lib/writer.cc:83
msgid "Checking existing image data"
msgstr "Recherche de données images existantes"
-#: src/lib/writer.cc:471
+#: src/lib/writer.cc:475
msgid "Computing audio digest"
msgstr "Fabrication rendu audio"
@@ -113,11 +113,11 @@ msgstr "Fabrication rendu audio"
msgid "Computing digest"
msgstr "fabrication rendu"
-#: src/lib/writer.cc:467
+#: src/lib/writer.cc:471
msgid "Computing image digest"
msgstr "Fabrication rendu image"
-#: src/lib/frame_rate_change.cc:78
+#: src/lib/frame_rate_change.cc:86
msgid "Content and DCP have the same rate.\n"
msgstr "Le DCP et la source ont la même cadence image.\n"
@@ -129,45 +129,50 @@ msgstr "Le contenu à ajouter doit présenter le même délais audio"
msgid "Content to be joined must have the same audio gain."
msgstr "Le contenu à ajouter doit avoir le même gain audio"
-#: src/lib/video_content.cc:144
+#: src/lib/video_content.cc:146
msgid "Content to be joined must have the same colour conversion."
msgstr "Le contenu à ajouter doit avoir le même type de conversion couleur"
-#: src/lib/video_content.cc:136
+#: src/lib/video_content.cc:138
msgid "Content to be joined must have the same crop."
-msgstr ""
-"le contenu à ajouter doit avoir les mêmes valeurs de \"crop\" ou découpage"
+msgstr "le contenu à ajouter doit avoir les mêmes valeurs de rognage"
-#: src/lib/video_content.cc:124
+#: src/lib/video_content.cc:126
msgid "Content to be joined must have the same picture size."
msgstr "Le contenu à ajouter doit avoir la même taille d'image"
-#: src/lib/video_content.cc:140
+#: src/lib/video_content.cc:142
msgid "Content to be joined must have the same scale setting."
msgstr ""
"Le contenu à ajouter doit avoir les mêmes paramètres de mise à l'échelle"
-#: src/lib/subtitle_content.cc:73
+#: src/lib/subtitle_content.cc:81
msgid "Content to be joined must have the same subtitle X offset."
msgstr ""
"Le contenu à ajouter doit avoir le même positionnement horizontal des sous-"
"titres"
-#: src/lib/subtitle_content.cc:77
+#: src/lib/subtitle_content.cc:89
+#, fuzzy
+msgid "Content to be joined must have the same subtitle X scale."
+msgstr "le contenu à ajouter doit avoir le même positionnement de sous-titre"
+
+#: src/lib/subtitle_content.cc:85
msgid "Content to be joined must have the same subtitle Y offset."
msgstr ""
"Le contenu à ajouter doit avoir le même positionnement vertical des sous-"
"titres"
-#: src/lib/subtitle_content.cc:81
-msgid "Content to be joined must have the same subtitle scale."
+#: src/lib/subtitle_content.cc:93
+#, fuzzy
+msgid "Content to be joined must have the same subtitle Y scale."
msgstr "le contenu à ajouter doit avoir le même positionnement de sous-titre"
-#: src/lib/video_content.cc:128
+#: src/lib/video_content.cc:130
msgid "Content to be joined must have the same video frame rate."
msgstr "Le contenu à ajouter doit avoir la même cadence d'images"
-#: src/lib/video_content.cc:132
+#: src/lib/video_content.cc:134
msgid "Content to be joined must have the same video frame type."
msgstr "Le contenu à ajouter doit avoir le même type de trame vidéo"
@@ -179,57 +184,58 @@ msgstr "Le contenu à ajouter doit avoir le même flux audio"
msgid "Content to be joined must use the same subtitle stream."
msgstr "Le contenu à ajouter doit avoir le même flux sous titre"
-#: src/lib/scp_dcp_job.cc:112
+#: src/lib/scp_dcp_job.cc:111
msgid "Copy DCP to TMS"
msgstr "Copier le DCP dans le TMS"
-#: src/lib/scp_dcp_job.cc:137
+#: src/lib/scp_dcp_job.cc:130
msgid "Could not connect to server %1 (%2)"
msgstr "Connexion au serveur %1 (%2) impossible"
-#: src/lib/scp_dcp_job.cc:159
+#: src/lib/scp_dcp_job.cc:152
msgid "Could not create remote directory %1 (%2)"
msgstr "Création du dossier distant %1 (%2) impossible"
-#: src/lib/image_proxy.cc:128
+#: src/lib/image_proxy.cc:147
#, fuzzy
-msgid "Could not decode image file"
-msgstr "Écriture vers fichier distant (%1) impossible"
+msgid "Could not decode image file (%1)"
+msgstr "Impossible de décoder le ficher image"
#: src/lib/job.cc:90
msgid "Could not open %1"
msgstr "lecture du fichier %1 impossible"
-#: src/lib/scp_dcp_job.cc:184
+#: src/lib/scp_dcp_job.cc:177
msgid "Could not open %1 to send"
msgstr "Ouverture de %1 pour envoi impossible"
-#: src/lib/internet.cc:72
+#: src/lib/internet.cc:74
msgid "Could not open downloaded ZIP file"
-msgstr "Ouverture du fichier Zip impossible"
+msgstr "Ouverture du fichier Zip téléchargé impossible"
-#: src/lib/scp_dcp_job.cc:154
+#: src/lib/scp_dcp_job.cc:147
msgid "Could not start SCP session (%1)"
msgstr "Démarrage de session SCP (%1) impossible"
-#: src/lib/scp_dcp_job.cc:198
+#: src/lib/scp_dcp_job.cc:191
msgid "Could not write to remote file (%1)"
msgstr "Écriture vers fichier distant (%1) impossible"
-#: src/lib/frame_rate_change.cc:90
+#: src/lib/frame_rate_change.cc:98
msgid "DCP will run at %1%% of the content speed.\n"
msgstr "Le DCP sera lu à %1%% de la vitesse du contenu source.\n"
-#: src/lib/frame_rate_change.cc:81
-#, fuzzy
+#: src/lib/frame_rate_change.cc:89
msgid "DCP will use every other frame of the content.\n"
-msgstr "Le DCP utilisera une image sur deux de la source.\n"
+msgstr "Le DCP utilisera les autres images de la source.\n"
#: src/lib/job.cc:91
msgid ""
"DCP-o-matic could not open the file %1. Perhaps it does not exist or is in "
"an unexpected format."
-msgstr "DCP-o-matic ne peut pas ouvrir le fichier %1"
+msgstr ""
+"DCP-o-matic ne peut pas ouvrir le fichier %1. Soit il n'existe pas, soit il "
+"n'est pas au bon format."
#: src/lib/ffmpeg_content.cc:93
msgid ""
@@ -240,7 +246,7 @@ msgstr "DCP-o-matic ne gère plus le filtre `%1'. Celui-ci a été désactivé."
msgid "De-interlacing"
msgstr "Désentrelacement"
-#: src/lib/config.cc:417
+#: src/lib/config.cc:436
msgid ""
"Dear Projectionist\n"
"\n"
@@ -254,28 +260,39 @@ msgid ""
"Best regards,\n"
"DCP-o-matic"
msgstr ""
+"Cher projectionniste\n"
+"\n"
+"Veuillez trouver les fichiers KDMs attachés pour $CPL_NAME.\n"
+"\n"
+"Cinema: $CINEMA_NAME\n"
+"Ecran(s): $SCREENS\n"
+"\n"
+"Les KDMs sont valides du $START_TIME au $END_TIME.\n"
+"\n"
+"Cordialement,\n"
+"DCP-o-matic"
#: src/lib/dolby_cp750.cc:27
msgid "Dolby CP650 and CP750"
msgstr "Dolby CP650 et CP750"
-#: src/lib/internet.cc:65
+#: src/lib/internet.cc:67
msgid "Download failed (%1/%2 error %3)"
msgstr "Echec de téléchargement (%1/%2 erreur %3)"
-#: src/lib/frame_rate_change.cc:83
+#: src/lib/frame_rate_change.cc:91
msgid "Each content frame will be doubled in the DCP.\n"
msgstr "Chaque image source sera doublée dans le DCP.\n"
-#: src/lib/frame_rate_change.cc:85
+#: src/lib/frame_rate_change.cc:93
msgid "Each content frame will be repeated %1 more times in the DCP.\n"
msgstr "Chaque image source sera répetée %1 fois dans le DCP.\n"
-#: src/lib/send_kdm_email_job.cc:50
+#: src/lib/send_kdm_email_job.cc:52
msgid "Email KDMs for %1"
msgstr "Envoyer KDM par email pour %1"
-#: src/lib/writer.cc:125
+#: src/lib/writer.cc:126
msgid "Encoding image data"
msgstr "encodage des données image"
@@ -287,7 +304,7 @@ msgstr "Erreur (%1)"
msgid "Examine content"
msgstr "Examen du contenu"
-#: src/lib/scp_dcp_job.cc:147
+#: src/lib/scp_dcp_job.cc:140
msgid "Failed to authenticate with server (%1)"
msgstr "L'authentification du serveur (%1) a échouée"
@@ -299,13 +316,13 @@ msgstr "Bilinéaire rapide"
msgid "Feature"
msgstr "Feature"
-#: src/lib/ratio.cc:41
+#: src/lib/ratio.cc:40
msgid "Flat"
msgstr "Flat"
-#: src/lib/ratio.cc:43
+#: src/lib/ratio.cc:42
msgid "Full frame"
-msgstr "Pleine matrice"
+msgstr "Full frame"
#: src/lib/scaler.cc:65
msgid "Gaussian"
@@ -313,9 +330,9 @@ msgstr "Gaussien"
#: src/lib/filter.cc:68
msgid "Gradient debander"
-msgstr "Corrections des bandes du dégradé"
+msgstr "Corrections des bandes par dégradé"
-#: src/lib/util.cc:755
+#: src/lib/util.cc:790
msgid "Hearing impaired"
msgstr "Déficients Auditifs"
@@ -331,6 +348,10 @@ msgstr ""
"Erreur indéterminée. Merci de rapporter le problème à l'auteur de DCP-o-"
"matic (carl@dcpomatic.com)"
+#: src/lib/config.cc:199
+msgid "KDM delivery: $CPL_NAME"
+msgstr ""
+
#: src/lib/filter.cc:66
msgid "Kernel deinterlacer"
msgstr "Désentrelaceur noyau"
@@ -339,23 +360,23 @@ msgstr "Désentrelaceur noyau"
msgid "Lanczos"
msgstr "Lanczos"
-#: src/lib/util.cc:749
+#: src/lib/util.cc:784
msgid "Left"
msgstr "Gauche"
-#: src/lib/util.cc:757
+#: src/lib/util.cc:792
msgid "Left centre"
msgstr "Centre Gauche"
-#: src/lib/util.cc:759
+#: src/lib/util.cc:794
msgid "Left rear surround"
msgstr "Surround arrière gauche"
-#: src/lib/util.cc:753
+#: src/lib/util.cc:788
msgid "Left surround"
msgstr "Arrière gauche"
-#: src/lib/util.cc:752
+#: src/lib/util.cc:787
msgid "Lfe (sub)"
msgstr "Basses fréquences"
@@ -367,17 +388,17 @@ msgstr "Divers"
msgid "Motion compensating deinterlacer"
msgstr "Désentrelaceur par compensation de mouvement"
-#: src/lib/video_content.cc:476
+#: src/lib/video_content_scale.cc:105
msgid "No scale"
msgstr "Pas de mise à l'échelle"
-#: src/lib/video_content.cc:473
+#: src/lib/video_content_scale.cc:102
msgid "No stretch"
msgstr "Sans déformation"
#: src/lib/image_content.cc:50
msgid "No valid image files were found in the folder."
-msgstr ""
+msgstr "Aucun fichier image valide dans ce dossier."
#: src/lib/filter.cc:70 src/lib/filter.cc:71 src/lib/filter.cc:73
msgid "Noise reduction"
@@ -389,11 +410,11 @@ msgstr "OK (processus %1)"
#: src/lib/content.cc:102
msgid "Only the first piece of content to be joined can have a start trim."
-msgstr "Seul le premier contenu à ajouter peut avoir un coupure de début."
+msgstr "Seul le premier contenu à ajouter peut être rogné au point d'entrée."
#: src/lib/content.cc:106
msgid "Only the last piece of content to be joined can have an end trim."
-msgstr "Seul le dernier contenu à ajouter peut avoir une coupure en fin."
+msgstr "Seul le dernier contenu à ajouter peut être rogné au point de sortie."
#: src/lib/job.cc:103
msgid "Out of memory"
@@ -415,31 +436,31 @@ msgstr "Public Service Announcement"
msgid "Rating"
msgstr "Classification"
-#: src/lib/config.cc:84 src/lib/config.cc:173
+#: src/lib/config.cc:86 src/lib/config.cc:183
msgid "Rec. 709"
msgstr "Rec. 709"
-#: src/lib/util.cc:750
+#: src/lib/util.cc:785
msgid "Right"
msgstr "Droite"
-#: src/lib/util.cc:758
+#: src/lib/util.cc:793
msgid "Right centre"
msgstr "Centre Droit"
-#: src/lib/util.cc:760
+#: src/lib/util.cc:795
msgid "Right rear surround"
msgstr "Surround arrière droite"
-#: src/lib/util.cc:754
+#: src/lib/util.cc:789
msgid "Right surround"
msgstr "Arrière droite"
-#: src/lib/scp_dcp_job.cc:142
+#: src/lib/scp_dcp_job.cc:135
msgid "SSH error (%1)"
msgstr "Erreur SSH (%1)"
-#: src/lib/ratio.cc:42
+#: src/lib/ratio.cc:41
msgid "Scope"
msgstr "Scope"
@@ -472,14 +493,14 @@ msgid ""
"The drive that the film is stored on is low in disc space. Free some more "
"space and try again."
msgstr ""
-"Le disque contenant le film est plein. Libérez de l'espace et essayez à "
-"nouveau."
+"Le disque contenant le film est presque plein. Libérez de l'espace et "
+"essayez à nouveau."
#: src/lib/job.cc:103
msgid "There was not enough memory to do this."
msgstr "Il n'y avait pas assez de mémoire pour faire cela."
-#: src/lib/film.cc:413
+#: src/lib/film.cc:414
msgid ""
"This film was created with a newer version of DCP-o-matic, and it cannot be "
"loaded into this version. Sorry!"
@@ -487,14 +508,14 @@ msgstr ""
"Ce film a été créé avec une nouvelle version de DCP-o-matic et il ne peut "
"être ouvert dans cette version du programme. Désolé!"
-#: src/lib/film.cc:405
+#: src/lib/film.cc:406
msgid ""
"This film was created with an older version of DCP-o-matic, and "
"unfortunately it cannot be loaded into this version. You will need to "
"create a new Film, re-add your content and set it up again. Sorry!"
msgstr ""
"Ce projet a été créé avec une ancienne version de DCP-o-matic, chargement "
-"impossible. Créez un nouveau projet, ajoutez du contenu et reparamétrez. "
+"impossible. Créez un nouveau projet, ajoutez du contenu et reparamétrez. "
"Désolé !"
#: src/lib/dcp_content_type.cc:46
@@ -509,19 +530,19 @@ msgstr "Transcodage %1"
msgid "Transitional"
msgstr "Transitional"
-#: src/lib/internet.cc:77
+#: src/lib/internet.cc:79
msgid "Unexpected ZIP file contents"
msgstr "Contenu de fichier ZIP non géré."
-#: src/lib/image_proxy.cc:174
+#: src/lib/image_proxy.cc:193
msgid "Unexpected image type received by server"
-msgstr ""
+msgstr "Type d'image non conforme reçu par le serveur"
#: src/lib/job.cc:120
msgid "Unknown error"
msgstr "Erreur inconnue"
-#: src/lib/ffmpeg_decoder.cc:295
+#: src/lib/ffmpeg_decoder.cc:293
msgid "Unrecognised audio sample format (%1)"
msgstr "Échantillonnage audio (%1) inconnu"
@@ -529,15 +550,15 @@ msgstr "Échantillonnage audio (%1) inconnu"
msgid "Unsharp mask and Gaussian blur"
msgstr "Adoucissement et flou Gaussien"
-#: src/lib/colour_conversion.cc:140
+#: src/lib/colour_conversion.cc:139
msgid "Untitled"
msgstr "Sans titre"
-#: src/lib/util.cc:756
+#: src/lib/util.cc:791
msgid "Visually impaired"
msgstr "Déficients Visuels"
-#: src/lib/scp_dcp_job.cc:104
+#: src/lib/scp_dcp_job.cc:103
msgid "Waiting"
msgstr "En cours"
@@ -549,7 +570,7 @@ msgstr "X"
msgid "Yet Another Deinterlacing Filter"
msgstr "Un autre filtre de désentrelacement"
-#: src/lib/film.cc:310
+#: src/lib/film.cc:311
msgid "You must add some content to the DCP before creating it"
msgstr "Ajoutez un contenu pour créer le DCP"
@@ -561,27 +582,27 @@ msgstr "[Déplacement d'images]"
msgid "[still]"
msgstr "[restant]"
-#: src/lib/film.cc:258
+#: src/lib/film.cc:259
msgid "cannot contain slashes"
msgstr "slash interdit"
-#: src/lib/util.cc:530
+#: src/lib/util.cc:565
msgid "connect timed out"
msgstr "temps de connexion expiré"
-#: src/lib/scp_dcp_job.cc:128
+#: src/lib/scp_dcp_job.cc:121
msgid "connecting"
msgstr "connexion"
-#: src/lib/film.cc:306
+#: src/lib/film.cc:307
msgid "container"
msgstr "conteneur"
-#: src/lib/film.cc:314
+#: src/lib/film.cc:315
msgid "content type"
msgstr "type de contenu"
-#: src/lib/scp_dcp_job.cc:177
+#: src/lib/scp_dcp_job.cc:170
msgid "copying %1"
msgstr "copie de %1"
@@ -589,19 +610,19 @@ msgstr "copie de %1"
msgid "could not create file %1"
msgstr "Écriture vers fichier distant (%1) impossible"
-#: src/lib/ffmpeg.cc:177
+#: src/lib/ffmpeg.cc:176
msgid "could not find audio decoder"
msgstr "décodeur audio introuvable"
-#: src/lib/ffmpeg.cc:106
+#: src/lib/ffmpeg.cc:105
msgid "could not find stream information"
msgstr "information du flux introuvable"
-#: src/lib/ffmpeg.cc:156
+#: src/lib/ffmpeg.cc:155
msgid "could not find video decoder"
msgstr "décodeur vidéo introuvable"
-#: src/lib/writer.cc:435
+#: src/lib/writer.cc:439
msgid "could not move audio MXF into the DCP (%1)"
msgstr "ne peut déplacer un MXF son dans le DCP (%1)"
@@ -613,11 +634,11 @@ msgstr "lecture du fichier audio impossible"
msgid "could not open file %1"
msgstr "lecture du fichier (%1) impossible"
-#: src/lib/dcp_video_frame.cc:334
+#: src/lib/dcp_video_frame.cc:331
msgid "could not open file for reading"
msgstr "lecture du fichier impossible"
-#: src/lib/dcp_video_frame.cc:340
+#: src/lib/dcp_video_frame.cc:337
msgid "could not read encoded data"
msgstr "lecture des données encodées impossible"
@@ -635,11 +656,11 @@ msgstr ""
"n'a pas pu convertir la fréquence d'échantillonnage pour %1 échantillons "
"(%2) (%3)"
-#: src/lib/scp_dcp_job.cc:89
+#: src/lib/scp_dcp_job.cc:88
msgid "could not start SCP session (%1)"
msgstr "démarrage de session SCP (%1) impossible"
-#: src/lib/scp_dcp_job.cc:55
+#: src/lib/scp_dcp_job.cc:54
msgid "could not start SSH session"
msgstr "démarrage de session SSH impossible"
@@ -647,45 +668,45 @@ msgstr "démarrage de session SSH impossible"
msgid "could not write to file %1 (%2)"
msgstr "Écriture vers fichier distant (%1) impossible (%2)"
-#: src/lib/util.cc:550
+#: src/lib/util.cc:585
msgid "error during async_accept (%1)"
msgstr "erreur pendant async_accept (%1)"
-#: src/lib/util.cc:526
+#: src/lib/util.cc:561
msgid "error during async_connect (%1)"
msgstr "erreur pendant async_connect (%1)"
-#: src/lib/util.cc:599
+#: src/lib/util.cc:634
msgid "error during async_read (%1)"
msgstr "erreur pendant async_read (%1)"
-#: src/lib/util.cc:571
+#: src/lib/util.cc:606
msgid "error during async_write (%1)"
msgstr "erreur pendant async_write (%1)"
-#: src/lib/transcode_job.cc:103
+#: src/lib/transcode_job.cc:97
msgid "frames per second"
msgstr "images par seconde"
-#: src/lib/util.cc:152
+#: src/lib/util.cc:156
msgid "hour"
msgstr "heure"
-#: src/lib/util.cc:149 src/lib/util.cc:154
+#: src/lib/util.cc:152 src/lib/util.cc:158
msgid "hours"
msgstr "heures"
-#: src/lib/util.cc:159
+#: src/lib/util.cc:174
msgid "minute"
msgstr "minute"
-#: src/lib/util.cc:161
+#: src/lib/util.cc:170 src/lib/util.cc:176
msgid "minutes"
msgstr "minutes"
-#: src/lib/util.cc:671
+#: src/lib/util.cc:706
msgid "missing key %1 in key-value set"
-msgstr "clé %1 non sélectionnée"
+msgstr "clé %1 manquante dans le réglage"
#: src/lib/exceptions.cc:54
msgid "missing required setting %1"
@@ -695,15 +716,15 @@ msgstr "paramètre %1 manquant"
msgid "moving"
msgstr "déplacement"
-#: src/lib/ffmpeg_decoder.cc:591
+#: src/lib/ffmpeg_decoder.cc:589
msgid "multi-part subtitles not yet supported"
msgstr "sous-titres en plusieurs parties non supportés"
-#: src/lib/film.cc:258 src/lib/film.cc:318
+#: src/lib/film.cc:259 src/lib/film.cc:319
msgid "name"
msgstr "nom"
-#: src/lib/ffmpeg_decoder.cc:606
+#: src/lib/ffmpeg_decoder.cc:604
msgid "non-bitmap subtitles not yet supported"
msgstr "sous-titres non-bitmap non supportés actuellement"
@@ -713,15 +734,20 @@ msgstr "sous-titres non-bitmap non supportés actuellement"
msgid "remaining"
msgstr "restant"
-#: src/lib/config.cc:82 src/lib/video_content.cc:175
+#: src/lib/config.cc:84 src/lib/video_content.cc:179
msgid "sRGB"
msgstr "sRGB"
-#: src/lib/config.cc:83
+#: src/lib/config.cc:85
msgid "sRGB non-linearised"
msgstr "sRGB non linéarisé"
-#: src/lib/util.cc:164
+#: src/lib/util.cc:189
+#, fuzzy
+msgid "second"
+msgstr "secondes"
+
+#: src/lib/util.cc:191
msgid "seconds"
msgstr "secondes"
diff --git a/src/lib/po/it_IT.po b/src/lib/po/it_IT.po
index e2bce6f87..d4760b9d5 100644
--- a/src/lib/po/it_IT.po
+++ b/src/lib/po/it_IT.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: IT VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-24 14:53+0100\n"
+"POT-Creation-Date: 2014-10-03 22:31+0100\n"
"PO-Revision-Date: 2014-02-03 10:48+0100\n"
"Last-Translator: William Fanelli <william.f@impronte.com>\n"
"Language-Team: \n"
@@ -33,23 +33,23 @@ msgstr ""
msgid "%1 frames; %2 frames per second"
msgstr "%1 fotogrammi; %2 fotogrammi al secondo"
-#: src/lib/video_content.cc:206
+#: src/lib/video_content.cc:211
msgid "%1x%2 pixels (%3:1)"
msgstr ""
-#: src/lib/ratio.cc:35
+#: src/lib/ratio.cc:34
msgid "1.19"
msgstr "1.19"
-#: src/lib/ratio.cc:38
+#: src/lib/ratio.cc:37
msgid "1.375"
msgstr "1.375"
-#: src/lib/ratio.cc:39
+#: src/lib/ratio.cc:38
msgid "1.66"
msgstr "1.66"
-#: src/lib/ratio.cc:40
+#: src/lib/ratio.cc:39
msgid "16:9"
msgstr "16:9"
@@ -57,11 +57,11 @@ msgstr "16:9"
msgid "3D denoiser"
msgstr "Riduttore di rumore 3D"
-#: src/lib/ratio.cc:36
+#: src/lib/ratio.cc:35
msgid "4:3"
msgstr "4:3"
-#: src/lib/ratio.cc:37
+#: src/lib/ratio.cc:36
msgid "Academy"
msgstr "Academy"
@@ -98,15 +98,15 @@ msgstr "Cancellato"
msgid "Cannot handle pixel format %1 during %2"
msgstr "Non posso gestire il formato di pixel %1 durante %2"
-#: src/lib/util.cc:751
+#: src/lib/util.cc:786
msgid "Centre"
msgstr "Centro"
-#: src/lib/writer.cc:82
+#: src/lib/writer.cc:83
msgid "Checking existing image data"
msgstr ""
-#: src/lib/writer.cc:471
+#: src/lib/writer.cc:475
msgid "Computing audio digest"
msgstr ""
@@ -114,11 +114,11 @@ msgstr ""
msgid "Computing digest"
msgstr ""
-#: src/lib/writer.cc:467
+#: src/lib/writer.cc:471
msgid "Computing image digest"
msgstr ""
-#: src/lib/frame_rate_change.cc:78
+#: src/lib/frame_rate_change.cc:86
#, fuzzy
msgid "Content and DCP have the same rate.\n"
msgstr "Il DCP e il sorgente hanno la stessa frequenza.\n"
@@ -131,43 +131,51 @@ msgstr ""
msgid "Content to be joined must have the same audio gain."
msgstr ""
-#: src/lib/video_content.cc:144
+#: src/lib/video_content.cc:146
msgid "Content to be joined must have the same colour conversion."
msgstr ""
-#: src/lib/video_content.cc:136
+#: src/lib/video_content.cc:138
msgid "Content to be joined must have the same crop."
msgstr ""
-#: src/lib/video_content.cc:124
+#: src/lib/video_content.cc:126
msgid "Content to be joined must have the same picture size."
msgstr ""
-#: src/lib/video_content.cc:140
+#: src/lib/video_content.cc:142
#, fuzzy
msgid "Content to be joined must have the same scale setting."
msgstr ""
"Il contenuto da unire deve avere lo stesso spostamento X dei sottotitoli."
-#: src/lib/subtitle_content.cc:73
+#: src/lib/subtitle_content.cc:81
msgid "Content to be joined must have the same subtitle X offset."
msgstr ""
"Il contenuto da unire deve avere lo stesso spostamento X dei sottotitoli."
-#: src/lib/subtitle_content.cc:77
+#: src/lib/subtitle_content.cc:89
+#, fuzzy
+msgid "Content to be joined must have the same subtitle X scale."
+msgstr ""
+"Il contenuto da unire deve avere lo stesso spostamento X dei sottotitoli."
+
+#: src/lib/subtitle_content.cc:85
msgid "Content to be joined must have the same subtitle Y offset."
msgstr ""
"Il contenuto da unire deve avere lo stesso spostamento Y dei sottotitoli."
-#: src/lib/subtitle_content.cc:81
-msgid "Content to be joined must have the same subtitle scale."
+#: src/lib/subtitle_content.cc:93
+#, fuzzy
+msgid "Content to be joined must have the same subtitle Y scale."
msgstr ""
+"Il contenuto da unire deve avere lo stesso spostamento Y dei sottotitoli."
-#: src/lib/video_content.cc:128
+#: src/lib/video_content.cc:130
msgid "Content to be joined must have the same video frame rate."
msgstr ""
-#: src/lib/video_content.cc:132
+#: src/lib/video_content.cc:134
msgid "Content to be joined must have the same video frame type."
msgstr ""
@@ -179,50 +187,50 @@ msgstr ""
msgid "Content to be joined must use the same subtitle stream."
msgstr ""
-#: src/lib/scp_dcp_job.cc:112
+#: src/lib/scp_dcp_job.cc:111
msgid "Copy DCP to TMS"
msgstr "Copia del DCP al TMS"
-#: src/lib/scp_dcp_job.cc:137
+#: src/lib/scp_dcp_job.cc:130
msgid "Could not connect to server %1 (%2)"
msgstr "Non posso connetermi al server %1 (%2)"
-#: src/lib/scp_dcp_job.cc:159
+#: src/lib/scp_dcp_job.cc:152
msgid "Could not create remote directory %1 (%2)"
msgstr "Non posso creare la directory remota %1 (%2)"
-#: src/lib/image_proxy.cc:128
+#: src/lib/image_proxy.cc:147
#, fuzzy
-msgid "Could not decode image file"
+msgid "Could not decode image file (%1)"
msgstr "Non posso scrivere il file remoto (%1)"
#: src/lib/job.cc:90
msgid "Could not open %1"
msgstr "Non riesco ad aprire %1"
-#: src/lib/scp_dcp_job.cc:184
+#: src/lib/scp_dcp_job.cc:177
msgid "Could not open %1 to send"
msgstr "Non posso aprire %1 da inviare"
-#: src/lib/internet.cc:72
+#: src/lib/internet.cc:74
#, fuzzy
msgid "Could not open downloaded ZIP file"
msgstr "non riesco ad aprire %1"
-#: src/lib/scp_dcp_job.cc:154
+#: src/lib/scp_dcp_job.cc:147
msgid "Could not start SCP session (%1)"
msgstr "Non posso avviare la sessione SCP (%1)"
-#: src/lib/scp_dcp_job.cc:198
+#: src/lib/scp_dcp_job.cc:191
msgid "Could not write to remote file (%1)"
msgstr "Non posso scrivere il file remoto (%1)"
-#: src/lib/frame_rate_change.cc:90
+#: src/lib/frame_rate_change.cc:98
#, fuzzy
msgid "DCP will run at %1%% of the content speed.\n"
msgstr "Il DCP andrà al %1%% della velocità del sorgente.\n"
-#: src/lib/frame_rate_change.cc:81
+#: src/lib/frame_rate_change.cc:89
#, fuzzy
msgid "DCP will use every other frame of the content.\n"
msgstr "Il DCP userà ogni altro fotogramma del sorgente.\n"
@@ -244,7 +252,7 @@ msgstr ""
msgid "De-interlacing"
msgstr "De-interlacciamento"
-#: src/lib/config.cc:417
+#: src/lib/config.cc:436
#, fuzzy
msgid ""
"Dear Projectionist\n"
@@ -273,23 +281,23 @@ msgstr ""
msgid "Dolby CP650 and CP750"
msgstr "Dolby CP750"
-#: src/lib/internet.cc:65
+#: src/lib/internet.cc:67
msgid "Download failed (%1/%2 error %3)"
msgstr ""
-#: src/lib/frame_rate_change.cc:83
+#: src/lib/frame_rate_change.cc:91
msgid "Each content frame will be doubled in the DCP.\n"
msgstr "Ogni fotogramma del sorgente sarà duplicato nel DCP.\n"
-#: src/lib/frame_rate_change.cc:85
+#: src/lib/frame_rate_change.cc:93
msgid "Each content frame will be repeated %1 more times in the DCP.\n"
msgstr "Ogni fotogramma del sorgente sarà ripetuto %1 volte nel DCP.\n"
-#: src/lib/send_kdm_email_job.cc:50
+#: src/lib/send_kdm_email_job.cc:52
msgid "Email KDMs for %1"
msgstr ""
-#: src/lib/writer.cc:125
+#: src/lib/writer.cc:126
msgid "Encoding image data"
msgstr ""
@@ -301,7 +309,7 @@ msgstr "Errore (%1)"
msgid "Examine content"
msgstr "Esamino il contenuto"
-#: src/lib/scp_dcp_job.cc:147
+#: src/lib/scp_dcp_job.cc:140
msgid "Failed to authenticate with server (%1)"
msgstr "Autenticazione col server fallita (%1) "
@@ -313,11 +321,11 @@ msgstr "Bilineare rapida"
msgid "Feature"
msgstr "Caratteristica"
-#: src/lib/ratio.cc:41
+#: src/lib/ratio.cc:40
msgid "Flat"
msgstr "Flat"
-#: src/lib/ratio.cc:43
+#: src/lib/ratio.cc:42
msgid "Full frame"
msgstr "Schermo intero"
@@ -329,7 +337,7 @@ msgstr "Gaussiana"
msgid "Gradient debander"
msgstr "Gradiente debander"
-#: src/lib/util.cc:755
+#: src/lib/util.cc:790
msgid "Hearing impaired"
msgstr ""
@@ -346,6 +354,10 @@ msgstr ""
"Non sappiamo cosa ha causato questo errore. La cosa migliore è inviare un "
"report del problema alla mailing list di DCP-o-matic (carl@dcpomatic.com)"
+#: src/lib/config.cc:199
+msgid "KDM delivery: $CPL_NAME"
+msgstr ""
+
#: src/lib/filter.cc:66
msgid "Kernel deinterlacer"
msgstr "Deinterlacciatore Kernel"
@@ -354,24 +366,24 @@ msgstr "Deinterlacciatore Kernel"
msgid "Lanczos"
msgstr "Lanczos"
-#: src/lib/util.cc:749
+#: src/lib/util.cc:784
msgid "Left"
msgstr "Sinistro"
-#: src/lib/util.cc:757
+#: src/lib/util.cc:792
msgid "Left centre"
msgstr ""
-#: src/lib/util.cc:759
+#: src/lib/util.cc:794
#, fuzzy
msgid "Left rear surround"
msgstr "Surround sinistro"
-#: src/lib/util.cc:753
+#: src/lib/util.cc:788
msgid "Left surround"
msgstr "Surround sinistro"
-#: src/lib/util.cc:752
+#: src/lib/util.cc:787
msgid "Lfe (sub)"
msgstr "Lfe(sub)"
@@ -383,11 +395,11 @@ msgstr "Varie"
msgid "Motion compensating deinterlacer"
msgstr "Dinterlacciatore con compensazione di movimento"
-#: src/lib/video_content.cc:476
+#: src/lib/video_content_scale.cc:105
msgid "No scale"
msgstr ""
-#: src/lib/video_content.cc:473
+#: src/lib/video_content_scale.cc:102
#, fuzzy
msgid "No stretch"
msgstr "Flat senza stiramento"
@@ -432,33 +444,33 @@ msgstr "Annuncio di pubblico servizio"
msgid "Rating"
msgstr "Punteggio"
-#: src/lib/config.cc:84 src/lib/config.cc:173
+#: src/lib/config.cc:86 src/lib/config.cc:183
#, fuzzy
msgid "Rec. 709"
msgstr "Rec 709"
-#: src/lib/util.cc:750
+#: src/lib/util.cc:785
msgid "Right"
msgstr "Destro"
-#: src/lib/util.cc:758
+#: src/lib/util.cc:793
msgid "Right centre"
msgstr ""
-#: src/lib/util.cc:760
+#: src/lib/util.cc:795
#, fuzzy
msgid "Right rear surround"
msgstr "Surround destro"
-#: src/lib/util.cc:754
+#: src/lib/util.cc:789
msgid "Right surround"
msgstr "Surround destro"
-#: src/lib/scp_dcp_job.cc:142
+#: src/lib/scp_dcp_job.cc:135
msgid "SSH error (%1)"
msgstr "Errore SSH (%1)"
-#: src/lib/ratio.cc:42
+#: src/lib/ratio.cc:41
msgid "Scope"
msgstr "Scope"
@@ -498,7 +510,7 @@ msgstr ""
msgid "There was not enough memory to do this."
msgstr ""
-#: src/lib/film.cc:413
+#: src/lib/film.cc:414
#, fuzzy
msgid ""
"This film was created with a newer version of DCP-o-matic, and it cannot be "
@@ -509,7 +521,7 @@ msgstr ""
"un nuovo film, ri-aggiungere i tuoi contenuti e configurarlo di nuovo. Ci "
"dispiace!"
-#: src/lib/film.cc:405
+#: src/lib/film.cc:406
msgid ""
"This film was created with an older version of DCP-o-matic, and "
"unfortunately it cannot be loaded into this version. You will need to "
@@ -532,11 +544,11 @@ msgstr "Transcodifica %1"
msgid "Transitional"
msgstr "Di transizione"
-#: src/lib/internet.cc:77
+#: src/lib/internet.cc:79
msgid "Unexpected ZIP file contents"
msgstr ""
-#: src/lib/image_proxy.cc:174
+#: src/lib/image_proxy.cc:193
msgid "Unexpected image type received by server"
msgstr ""
@@ -544,7 +556,7 @@ msgstr ""
msgid "Unknown error"
msgstr "Errore sconosciuto"
-#: src/lib/ffmpeg_decoder.cc:295
+#: src/lib/ffmpeg_decoder.cc:293
msgid "Unrecognised audio sample format (%1)"
msgstr "Formato di campionamento audio non riconosciuto (%1)"
@@ -552,15 +564,15 @@ msgstr "Formato di campionamento audio non riconosciuto (%1)"
msgid "Unsharp mask and Gaussian blur"
msgstr "Maschera unsharp e sfocatura Gaussiana"
-#: src/lib/colour_conversion.cc:140
+#: src/lib/colour_conversion.cc:139
msgid "Untitled"
msgstr "Senza titolo"
-#: src/lib/util.cc:756
+#: src/lib/util.cc:791
msgid "Visually impaired"
msgstr ""
-#: src/lib/scp_dcp_job.cc:104
+#: src/lib/scp_dcp_job.cc:103
msgid "Waiting"
msgstr "Aspetta"
@@ -572,7 +584,7 @@ msgstr "X"
msgid "Yet Another Deinterlacing Filter"
msgstr "Altro filtro di deinterlacciamento"
-#: src/lib/film.cc:310
+#: src/lib/film.cc:311
msgid "You must add some content to the DCP before creating it"
msgstr "Devi aggiungere dei contenuti al DCP prima di crearlo"
@@ -585,27 +597,27 @@ msgstr ""
msgid "[still]"
msgstr "ancora"
-#: src/lib/film.cc:258
+#: src/lib/film.cc:259
msgid "cannot contain slashes"
msgstr "non può contenere barre"
-#: src/lib/util.cc:530
+#: src/lib/util.cc:565
msgid "connect timed out"
msgstr "connessione scaduta"
-#: src/lib/scp_dcp_job.cc:128
+#: src/lib/scp_dcp_job.cc:121
msgid "connecting"
msgstr "mi sto connettendo"
-#: src/lib/film.cc:306
+#: src/lib/film.cc:307
msgid "container"
msgstr "contenitore"
-#: src/lib/film.cc:314
+#: src/lib/film.cc:315
msgid "content type"
msgstr "tipo di contenuto"
-#: src/lib/scp_dcp_job.cc:177
+#: src/lib/scp_dcp_job.cc:170
msgid "copying %1"
msgstr "copia %1"
@@ -613,19 +625,19 @@ msgstr "copia %1"
msgid "could not create file %1"
msgstr "Non posso scrivere il file remoto (%1)"
-#: src/lib/ffmpeg.cc:177
+#: src/lib/ffmpeg.cc:176
msgid "could not find audio decoder"
msgstr "non riesco a trovare il decoder audio"
-#: src/lib/ffmpeg.cc:106
+#: src/lib/ffmpeg.cc:105
msgid "could not find stream information"
msgstr "non riesco a trovare informazioni sullo streaming"
-#: src/lib/ffmpeg.cc:156
+#: src/lib/ffmpeg.cc:155
msgid "could not find video decoder"
msgstr "non riesco a trovare il decoder video"
-#: src/lib/writer.cc:435
+#: src/lib/writer.cc:439
msgid "could not move audio MXF into the DCP (%1)"
msgstr ""
@@ -637,11 +649,11 @@ msgstr "non riesco ad aprire il file in lettura"
msgid "could not open file %1"
msgstr "non riesco ad aprire %1"
-#: src/lib/dcp_video_frame.cc:334
+#: src/lib/dcp_video_frame.cc:331
msgid "could not open file for reading"
msgstr "non riesco ad aprire il file per leggerlo"
-#: src/lib/dcp_video_frame.cc:340
+#: src/lib/dcp_video_frame.cc:337
#, fuzzy
msgid "could not read encoded data"
msgstr "non riesco a trovare il decoder audio"
@@ -659,11 +671,11 @@ msgstr "non riesco a eseguire il convertitore della frequenza di campionamento"
msgid "could not run sample-rate converter for %1 samples (%2) (%3)"
msgstr "non riesco a eseguire il convertitore della frequenza di campionamento"
-#: src/lib/scp_dcp_job.cc:89
+#: src/lib/scp_dcp_job.cc:88
msgid "could not start SCP session (%1)"
msgstr "non posso avviare la sessione SCP (%1)"
-#: src/lib/scp_dcp_job.cc:55
+#: src/lib/scp_dcp_job.cc:54
msgid "could not start SSH session"
msgstr "non posso avviare la sessione SSH"
@@ -671,43 +683,43 @@ msgstr "non posso avviare la sessione SSH"
msgid "could not write to file %1 (%2)"
msgstr "non posso scrivere il file (%1)"
-#: src/lib/util.cc:550
+#: src/lib/util.cc:585
msgid "error during async_accept (%1)"
msgstr ""
-#: src/lib/util.cc:526
+#: src/lib/util.cc:561
msgid "error during async_connect (%1)"
msgstr ""
-#: src/lib/util.cc:599
+#: src/lib/util.cc:634
msgid "error during async_read (%1)"
msgstr ""
-#: src/lib/util.cc:571
+#: src/lib/util.cc:606
msgid "error during async_write (%1)"
msgstr ""
-#: src/lib/transcode_job.cc:103
+#: src/lib/transcode_job.cc:97
msgid "frames per second"
msgstr "fotogrammi al secondo"
-#: src/lib/util.cc:152
+#: src/lib/util.cc:156
msgid "hour"
msgstr "ora"
-#: src/lib/util.cc:149 src/lib/util.cc:154
+#: src/lib/util.cc:152 src/lib/util.cc:158
msgid "hours"
msgstr "ore"
-#: src/lib/util.cc:159
+#: src/lib/util.cc:174
msgid "minute"
msgstr "minuto"
-#: src/lib/util.cc:161
+#: src/lib/util.cc:170 src/lib/util.cc:176
msgid "minutes"
msgstr "minuti"
-#: src/lib/util.cc:671
+#: src/lib/util.cc:706
msgid "missing key %1 in key-value set"
msgstr "persa la chiave %1 tra i valori chiave"
@@ -719,15 +731,15 @@ msgstr "persa la regolazione richiesta %1"
msgid "moving"
msgstr ""
-#: src/lib/ffmpeg_decoder.cc:591
+#: src/lib/ffmpeg_decoder.cc:589
msgid "multi-part subtitles not yet supported"
msgstr "sottotitoli multi-part non ancora supportati"
-#: src/lib/film.cc:258 src/lib/film.cc:318
+#: src/lib/film.cc:259 src/lib/film.cc:319
msgid "name"
msgstr "nome"
-#: src/lib/ffmpeg_decoder.cc:606
+#: src/lib/ffmpeg_decoder.cc:604
msgid "non-bitmap subtitles not yet supported"
msgstr "sottotitoli non-bitmap non ancora supportati"
@@ -737,15 +749,20 @@ msgstr "sottotitoli non-bitmap non ancora supportati"
msgid "remaining"
msgstr "restano"
-#: src/lib/config.cc:82 src/lib/video_content.cc:175
+#: src/lib/config.cc:84 src/lib/video_content.cc:179
msgid "sRGB"
msgstr "sRGB"
-#: src/lib/config.cc:83
+#: src/lib/config.cc:85
msgid "sRGB non-linearised"
msgstr "sRGB non linearizzato"
-#: src/lib/util.cc:164
+#: src/lib/util.cc:189
+#, fuzzy
+msgid "second"
+msgstr "secondi"
+
+#: src/lib/util.cc:191
msgid "seconds"
msgstr "secondi"
diff --git a/src/lib/po/nl_NL.po b/src/lib/po/nl_NL.po
index f471ce8af..09f14e1ac 100644
--- a/src/lib/po/nl_NL.po
+++ b/src/lib/po/nl_NL.po
@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: DCP-o-matic\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-24 14:53+0100\n"
-"PO-Revision-Date: 2014-03-30 19:39+0100\n"
-"Last-Translator: Theo Kooijmans <tkooijmans@universaldv.nl>\n"
+"POT-Creation-Date: 2014-10-03 22:31+0100\n"
+"PO-Revision-Date: 2014-09-04 20:34+0100\n"
+"Last-Translator: Cherif Ben Brahim <firehc@mac.com>\n"
"Language-Team: UniversalDV <Tkooijmans@universaldv.nl>\n"
"Language: nl_NL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.6.4\n"
+"X-Generator: Poedit 1.6.9\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/lib/sndfile_content.cc:61
@@ -34,23 +34,23 @@ msgstr "%1 kanalen, %2kHz, %3 samples"
msgid "%1 frames; %2 frames per second"
msgstr "%1 frames; %2 frames per seconde"
-#: src/lib/video_content.cc:206
+#: src/lib/video_content.cc:211
msgid "%1x%2 pixels (%3:1)"
msgstr "%1x%2 pixels (%3:1)"
-#: src/lib/ratio.cc:35
+#: src/lib/ratio.cc:34
msgid "1.19"
msgstr "1.19"
-#: src/lib/ratio.cc:38
+#: src/lib/ratio.cc:37
msgid "1.375"
msgstr "1.375"
-#: src/lib/ratio.cc:39
+#: src/lib/ratio.cc:38
msgid "1.66"
msgstr "1.66"
-#: src/lib/ratio.cc:40
+#: src/lib/ratio.cc:39
msgid "16:9"
msgstr "16:9"
@@ -58,11 +58,11 @@ msgstr "16:9"
msgid "3D denoiser"
msgstr "3D ruisonderdrukking"
-#: src/lib/ratio.cc:36
+#: src/lib/ratio.cc:35
msgid "4:3"
msgstr "4:3"
-#: src/lib/ratio.cc:37
+#: src/lib/ratio.cc:36
msgid "Academy"
msgstr "Academie"
@@ -98,15 +98,15 @@ msgstr "Afgebroken"
msgid "Cannot handle pixel format %1 during %2"
msgstr "Fout met pixel formaat %1 tijdens %2"
-#: src/lib/util.cc:751
+#: src/lib/util.cc:786
msgid "Centre"
msgstr "Midden"
-#: src/lib/writer.cc:82
+#: src/lib/writer.cc:83
msgid "Checking existing image data"
msgstr "Controleer bestaande videodata"
-#: src/lib/writer.cc:471
+#: src/lib/writer.cc:475
msgid "Computing audio digest"
msgstr "Verwerk audio data"
@@ -114,11 +114,11 @@ msgstr "Verwerk audio data"
msgid "Computing digest"
msgstr "Verwerken..."
-#: src/lib/writer.cc:467
+#: src/lib/writer.cc:471
msgid "Computing image digest"
msgstr "Verwerk video data"
-#: src/lib/frame_rate_change.cc:78
+#: src/lib/frame_rate_change.cc:86
msgid "Content and DCP have the same rate.\n"
msgstr "Inhoud en DCP hebben dezelfde framerate .\n"
@@ -130,39 +130,45 @@ msgstr "Toegevoegde bestanden moeten dezelfde audio vertraging hebben."
msgid "Content to be joined must have the same audio gain."
msgstr "Toegevoegde bestanden moeten dezelfde audio gain hebben."
-#: src/lib/video_content.cc:144
+#: src/lib/video_content.cc:146
msgid "Content to be joined must have the same colour conversion."
msgstr "Toegevoegde bestanden moeten dezelfde kleurindeling hebben."
-#: src/lib/video_content.cc:136
+#: src/lib/video_content.cc:138
msgid "Content to be joined must have the same crop."
msgstr "Toegevoegde bestanden moeten dezelfde crop hebben."
-#: src/lib/video_content.cc:124
+#: src/lib/video_content.cc:126
msgid "Content to be joined must have the same picture size."
msgstr "Toegevoegde bestanden moeten dezelfde grootte hebben."
-#: src/lib/video_content.cc:140
+#: src/lib/video_content.cc:142
msgid "Content to be joined must have the same scale setting."
msgstr "Toegevoegde bestanden moeten dezelfde schaal hebben."
-#: src/lib/subtitle_content.cc:73
+#: src/lib/subtitle_content.cc:81
msgid "Content to be joined must have the same subtitle X offset."
msgstr "Toegevoegde bestanden moeten dezelfde ondertitel X offset hebben."
-#: src/lib/subtitle_content.cc:77
+#: src/lib/subtitle_content.cc:89
+#, fuzzy
+msgid "Content to be joined must have the same subtitle X scale."
+msgstr "Toegevoegde bestanden moeten dezelfde ondertitel grootte hebben."
+
+#: src/lib/subtitle_content.cc:85
msgid "Content to be joined must have the same subtitle Y offset."
msgstr "Toegevoegde bestanden moeten dezelfde ondertitel Y offset hebben."
-#: src/lib/subtitle_content.cc:81
-msgid "Content to be joined must have the same subtitle scale."
+#: src/lib/subtitle_content.cc:93
+#, fuzzy
+msgid "Content to be joined must have the same subtitle Y scale."
msgstr "Toegevoegde bestanden moeten dezelfde ondertitel grootte hebben."
-#: src/lib/video_content.cc:128
+#: src/lib/video_content.cc:130
msgid "Content to be joined must have the same video frame rate."
msgstr "Toegevoegde bestanden moeten dezelfde video frame rate hebben."
-#: src/lib/video_content.cc:132
+#: src/lib/video_content.cc:134
msgid "Content to be joined must have the same video frame type."
msgstr "Toegevoegde bestanden moeten dezelfde video formaat hebben."
@@ -174,48 +180,48 @@ msgstr "Toegevoegde bestanden moeten dezelfde audio stream gebruiken."
msgid "Content to be joined must use the same subtitle stream."
msgstr "Toegevoegde bestanden moeten dezelfde ondertitel stream gebruiken."
-#: src/lib/scp_dcp_job.cc:112
+#: src/lib/scp_dcp_job.cc:111
msgid "Copy DCP to TMS"
msgstr "Kopieer DCP to TMS"
-#: src/lib/scp_dcp_job.cc:137
+#: src/lib/scp_dcp_job.cc:130
msgid "Could not connect to server %1 (%2)"
msgstr "Kan niet verbinden met server %1 (%2)"
-#: src/lib/scp_dcp_job.cc:159
+#: src/lib/scp_dcp_job.cc:152
msgid "Could not create remote directory %1 (%2)"
msgstr "Kan geen remote map maken %1 (%2)"
-#: src/lib/image_proxy.cc:128
+#: src/lib/image_proxy.cc:147
#, fuzzy
-msgid "Could not decode image file"
-msgstr "kan geen bestand maken %1"
+msgid "Could not decode image file (%1)"
+msgstr "Kan beeldbestand niet decoderen"
#: src/lib/job.cc:90
msgid "Could not open %1"
msgstr "Kan niet openen %1"
-#: src/lib/scp_dcp_job.cc:184
+#: src/lib/scp_dcp_job.cc:177
msgid "Could not open %1 to send"
msgstr "Kan niet openen %1 om te verzenden"
-#: src/lib/internet.cc:72
+#: src/lib/internet.cc:74
msgid "Could not open downloaded ZIP file"
msgstr "Kan gedownloade ZIP bestand niet openen"
-#: src/lib/scp_dcp_job.cc:154
+#: src/lib/scp_dcp_job.cc:147
msgid "Could not start SCP session (%1)"
msgstr "Kan SCP sessie niet starten (%1)"
-#: src/lib/scp_dcp_job.cc:198
+#: src/lib/scp_dcp_job.cc:191
msgid "Could not write to remote file (%1)"
msgstr "Kan niet schrijven naar bestand op FTP server"
-#: src/lib/frame_rate_change.cc:90
+#: src/lib/frame_rate_change.cc:98
msgid "DCP will run at %1%% of the content speed.\n"
msgstr "DCP renderd met %1%% van de content framerate.\n"
-#: src/lib/frame_rate_change.cc:81
+#: src/lib/frame_rate_change.cc:89
msgid "DCP will use every other frame of the content.\n"
msgstr "DCP zal alleen elk ander frame van de content gebruiken.\n"
@@ -238,8 +244,7 @@ msgstr ""
msgid "De-interlacing"
msgstr "De-interlacing"
-#: src/lib/config.cc:417
-#, fuzzy
+#: src/lib/config.cc:436
msgid ""
"Dear Projectionist\n"
"\n"
@@ -256,6 +261,8 @@ msgstr ""
"Geachte operator\n"
"\n"
"Bijgevoegd zijn KDMs voor $CPL_NAME.\n"
+"Bioscoop: $CINEMA_NAME\n"
+"Zaal/Zalen: $SCREENS\n"
"\n"
"De KDMs zijn geldig van $START_TIME tot $END_TIME.\n"
"\n"
@@ -266,23 +273,23 @@ msgstr ""
msgid "Dolby CP650 and CP750"
msgstr "Dolby CP650 and CP750"
-#: src/lib/internet.cc:65
+#: src/lib/internet.cc:67
msgid "Download failed (%1/%2 error %3)"
msgstr "Fout met download(%1/%2 error %3)"
-#: src/lib/frame_rate_change.cc:83
+#: src/lib/frame_rate_change.cc:91
msgid "Each content frame will be doubled in the DCP.\n"
msgstr "Elk content frame zal verdubbeld worden de DCP.\n"
-#: src/lib/frame_rate_change.cc:85
+#: src/lib/frame_rate_change.cc:93
msgid "Each content frame will be repeated %1 more times in the DCP.\n"
msgstr "Elk content frame zal %1 herhaald worden in de DCP.\n"
-#: src/lib/send_kdm_email_job.cc:50
+#: src/lib/send_kdm_email_job.cc:52
msgid "Email KDMs for %1"
msgstr "Email KDMs voor %1"
-#: src/lib/writer.cc:125
+#: src/lib/writer.cc:126
msgid "Encoding image data"
msgstr "Encoding bestandsdata"
@@ -294,7 +301,7 @@ msgstr "Fout (%1)"
msgid "Examine content"
msgstr "Controleer content"
-#: src/lib/scp_dcp_job.cc:147
+#: src/lib/scp_dcp_job.cc:140
msgid "Failed to authenticate with server (%1)"
msgstr "Inlog fout met server (%1)"
@@ -306,11 +313,11 @@ msgstr "Fast Bilinear"
msgid "Feature"
msgstr "Kenmerken"
-#: src/lib/ratio.cc:41
+#: src/lib/ratio.cc:40
msgid "Flat"
msgstr "Onbewerkt"
-#: src/lib/ratio.cc:43
+#: src/lib/ratio.cc:42
msgid "Full frame"
msgstr "Full frame"
@@ -322,7 +329,7 @@ msgstr "Gaussian"
msgid "Gradient debander"
msgstr "Gradient debander"
-#: src/lib/util.cc:755
+#: src/lib/util.cc:790
msgid "Hearing impaired"
msgstr "Slechthorenden"
@@ -331,13 +338,16 @@ msgid "High quality 3D denoiser"
msgstr "High quality 3D denoiser"
#: src/lib/job.cc:111 src/lib/job.cc:121
-#, fuzzy
msgid ""
"It is not known what caused this error. Please report the problem to the "
"DCP-o-matic author (carl@dcpomatic.com)."
msgstr ""
"Dit is een onbekende fout. U kunt deze het beste melden bij de DCP-o-matic "
-"mailing lijst (carl@dcpomatic.com)"
+"maker (carl@dcpomatic.com)"
+
+#: src/lib/config.cc:199
+msgid "KDM delivery: $CPL_NAME"
+msgstr "KDM levering: $CPL_NAME"
#: src/lib/filter.cc:66
msgid "Kernel deinterlacer"
@@ -347,23 +357,23 @@ msgstr "Kernel deinterlacer"
msgid "Lanczos"
msgstr "Lanczos"
-#: src/lib/util.cc:749
+#: src/lib/util.cc:784
msgid "Left"
msgstr "Links"
-#: src/lib/util.cc:757
+#: src/lib/util.cc:792
msgid "Left centre"
msgstr "Links midden"
-#: src/lib/util.cc:759
+#: src/lib/util.cc:794
msgid "Left rear surround"
msgstr "Links achter surround"
-#: src/lib/util.cc:753
+#: src/lib/util.cc:788
msgid "Left surround"
msgstr "links surround"
-#: src/lib/util.cc:752
+#: src/lib/util.cc:787
msgid "Lfe (sub)"
msgstr "Lfe (sub)"
@@ -375,17 +385,17 @@ msgstr "Diverse"
msgid "Motion compensating deinterlacer"
msgstr "Motion compensating deinterlacer"
-#: src/lib/video_content.cc:476
+#: src/lib/video_content_scale.cc:105
msgid "No scale"
msgstr "Niet vergroten of verkleinen"
-#: src/lib/video_content.cc:473
+#: src/lib/video_content_scale.cc:102
msgid "No stretch"
msgstr "Niet uitvullen"
#: src/lib/image_content.cc:50
msgid "No valid image files were found in the folder."
-msgstr ""
+msgstr "Geen geldige beeldbestanden gevonden in deze map."
#: src/lib/filter.cc:70 src/lib/filter.cc:71 src/lib/filter.cc:73
msgid "Noise reduction"
@@ -427,31 +437,31 @@ msgstr "Publieke Service aankondiging"
msgid "Rating"
msgstr "Beoordeling"
-#: src/lib/config.cc:84 src/lib/config.cc:173
+#: src/lib/config.cc:86 src/lib/config.cc:183
msgid "Rec. 709"
msgstr "Rec. 709"
-#: src/lib/util.cc:750
+#: src/lib/util.cc:785
msgid "Right"
msgstr "Rechts"
-#: src/lib/util.cc:758
+#: src/lib/util.cc:793
msgid "Right centre"
msgstr "Rechts midden"
-#: src/lib/util.cc:760
+#: src/lib/util.cc:795
msgid "Right rear surround"
msgstr "Rechtsachter surround"
-#: src/lib/util.cc:754
+#: src/lib/util.cc:789
msgid "Right surround"
msgstr "Rechts surround"
-#: src/lib/scp_dcp_job.cc:142
+#: src/lib/scp_dcp_job.cc:135
msgid "SSH error (%1)"
msgstr "SSH fout (%1)"
-#: src/lib/ratio.cc:42
+#: src/lib/ratio.cc:41
msgid "Scope"
msgstr "Gebied"
@@ -491,7 +501,7 @@ msgstr ""
msgid "There was not enough memory to do this."
msgstr "Er was niet genoeg geheugen om dit uit te voeren."
-#: src/lib/film.cc:413
+#: src/lib/film.cc:414
msgid ""
"This film was created with a newer version of DCP-o-matic, and it cannot be "
"loaded into this version. Sorry!"
@@ -499,7 +509,7 @@ msgstr ""
"Deze film is gemaakt met een nieuwere versie van DCP-o-matic en kan niet "
"geopend worden. Sorry!"
-#: src/lib/film.cc:405
+#: src/lib/film.cc:406
msgid ""
"This film was created with an older version of DCP-o-matic, and "
"unfortunately it cannot be loaded into this version. You will need to "
@@ -521,19 +531,19 @@ msgstr "Omzetten %1"
msgid "Transitional"
msgstr "Bumper"
-#: src/lib/internet.cc:77
+#: src/lib/internet.cc:79
msgid "Unexpected ZIP file contents"
msgstr "Onverwachte ZIP file inhoud"
-#: src/lib/image_proxy.cc:174
+#: src/lib/image_proxy.cc:193
msgid "Unexpected image type received by server"
-msgstr ""
+msgstr "Onverwacht beeldtype ontvangen door server"
#: src/lib/job.cc:120
msgid "Unknown error"
msgstr "Onbekende fout"
-#: src/lib/ffmpeg_decoder.cc:295
+#: src/lib/ffmpeg_decoder.cc:293
msgid "Unrecognised audio sample format (%1)"
msgstr "Niet herkenbaar audio sample formaat (%1)"
@@ -541,15 +551,15 @@ msgstr "Niet herkenbaar audio sample formaat (%1)"
msgid "Unsharp mask and Gaussian blur"
msgstr "Unsharp mask and Gaussian blur"
-#: src/lib/colour_conversion.cc:140
+#: src/lib/colour_conversion.cc:139
msgid "Untitled"
msgstr "Niet benoemd"
-#: src/lib/util.cc:756
+#: src/lib/util.cc:791
msgid "Visually impaired"
msgstr "Slechtzienden"
-#: src/lib/scp_dcp_job.cc:104
+#: src/lib/scp_dcp_job.cc:103
msgid "Waiting"
msgstr "Wachten"
@@ -561,7 +571,7 @@ msgstr "X"
msgid "Yet Another Deinterlacing Filter"
msgstr "Yet Another Deinterlacing Filter"
-#: src/lib/film.cc:310
+#: src/lib/film.cc:311
msgid "You must add some content to the DCP before creating it"
msgstr "U moet wat content toevoegen voor het maken van de DCP"
@@ -573,27 +583,27 @@ msgstr "[bewegend beeld]"
msgid "[still]"
msgstr "[still]"
-#: src/lib/film.cc:258
+#: src/lib/film.cc:259
msgid "cannot contain slashes"
msgstr "er mag geen '\" gebruikt worden"
-#: src/lib/util.cc:530
+#: src/lib/util.cc:565
msgid "connect timed out"
msgstr "verbinding timeout"
-#: src/lib/scp_dcp_job.cc:128
+#: src/lib/scp_dcp_job.cc:121
msgid "connecting"
msgstr "verbinden"
-#: src/lib/film.cc:306
+#: src/lib/film.cc:307
msgid "container"
msgstr "container"
-#: src/lib/film.cc:314
+#: src/lib/film.cc:315
msgid "content type"
msgstr "content type"
-#: src/lib/scp_dcp_job.cc:177
+#: src/lib/scp_dcp_job.cc:170
msgid "copying %1"
msgstr "kopieeren %1"
@@ -601,19 +611,19 @@ msgstr "kopieeren %1"
msgid "could not create file %1"
msgstr "kan geen bestand maken %1"
-#: src/lib/ffmpeg.cc:177
+#: src/lib/ffmpeg.cc:176
msgid "could not find audio decoder"
msgstr "kan geen audio decoder vinden"
-#: src/lib/ffmpeg.cc:106
+#: src/lib/ffmpeg.cc:105
msgid "could not find stream information"
msgstr "kan geen stream informatie vinden"
-#: src/lib/ffmpeg.cc:156
+#: src/lib/ffmpeg.cc:155
msgid "could not find video decoder"
msgstr "kan geen videodecoder vinden"
-#: src/lib/writer.cc:435
+#: src/lib/writer.cc:439
msgid "could not move audio MXF into the DCP (%1)"
msgstr "kan MXF audio niet plaatsen in DCP (%1)"
@@ -625,11 +635,11 @@ msgstr "kan audio bestand niet openen om te lezen"
msgid "could not open file %1"
msgstr "kan bestand niet openen %1"
-#: src/lib/dcp_video_frame.cc:334
+#: src/lib/dcp_video_frame.cc:331
msgid "could not open file for reading"
msgstr "kan bestand niet openen om te lezen"
-#: src/lib/dcp_video_frame.cc:340
+#: src/lib/dcp_video_frame.cc:337
msgid "could not read encoded data"
msgstr "kan encoded data niet lezen"
@@ -645,11 +655,11 @@ msgstr "kan sample-rate converter niet starten"
msgid "could not run sample-rate converter for %1 samples (%2) (%3)"
msgstr "kan sample-rate converter niet starten gedurende %1 samples (%2) (%3)"
-#: src/lib/scp_dcp_job.cc:89
+#: src/lib/scp_dcp_job.cc:88
msgid "could not start SCP session (%1)"
msgstr "kan SCP sessie niet starten (%1)"
-#: src/lib/scp_dcp_job.cc:55
+#: src/lib/scp_dcp_job.cc:54
msgid "could not start SSH session"
msgstr "kan SSH sessie niet starten"
@@ -657,43 +667,43 @@ msgstr "kan SSH sessie niet starten"
msgid "could not write to file %1 (%2)"
msgstr "kan niet schrijven naar bestand %1 (%2)"
-#: src/lib/util.cc:550
+#: src/lib/util.cc:585
msgid "error during async_accept (%1)"
msgstr "fout met async_accepteren (FTP) (%1)"
-#: src/lib/util.cc:526
+#: src/lib/util.cc:561
msgid "error during async_connect (%1)"
msgstr "fout met async_verbinden (FTP) (%1)"
-#: src/lib/util.cc:599
+#: src/lib/util.cc:634
msgid "error during async_read (%1)"
msgstr "fout met async_lezen (FTP) (%1)"
-#: src/lib/util.cc:571
+#: src/lib/util.cc:606
msgid "error during async_write (%1)"
msgstr "fout met async_schrijven (FTP) (%1)"
-#: src/lib/transcode_job.cc:103
+#: src/lib/transcode_job.cc:97
msgid "frames per second"
msgstr "frames per seconde"
-#: src/lib/util.cc:152
+#: src/lib/util.cc:156
msgid "hour"
msgstr "uur"
-#: src/lib/util.cc:149 src/lib/util.cc:154
+#: src/lib/util.cc:152 src/lib/util.cc:158
msgid "hours"
msgstr "uren"
-#: src/lib/util.cc:159
+#: src/lib/util.cc:174
msgid "minute"
msgstr "minuut"
-#: src/lib/util.cc:161
+#: src/lib/util.cc:170 src/lib/util.cc:176
msgid "minutes"
msgstr "minuten"
-#: src/lib/util.cc:671
+#: src/lib/util.cc:706
msgid "missing key %1 in key-value set"
msgstr "ontbrekende key %1 in key-value set"
@@ -705,15 +715,15 @@ msgstr "ontbrekende verplichte setting %1"
msgid "moving"
msgstr "bewegend"
-#: src/lib/ffmpeg_decoder.cc:591
+#: src/lib/ffmpeg_decoder.cc:589
msgid "multi-part subtitles not yet supported"
msgstr "ondertitels met meerdere delen worden nog niet ondersteund."
-#: src/lib/film.cc:258 src/lib/film.cc:318
+#: src/lib/film.cc:259 src/lib/film.cc:319
msgid "name"
msgstr "naam"
-#: src/lib/ffmpeg_decoder.cc:606
+#: src/lib/ffmpeg_decoder.cc:604
msgid "non-bitmap subtitles not yet supported"
msgstr "non-bitmap ondertitels worden nog niet ondersteund"
@@ -723,15 +733,19 @@ msgstr "non-bitmap ondertitels worden nog niet ondersteund"
msgid "remaining"
msgstr "resterend"
-#: src/lib/config.cc:82 src/lib/video_content.cc:175
+#: src/lib/config.cc:84 src/lib/video_content.cc:179
msgid "sRGB"
msgstr "sRGB"
-#: src/lib/config.cc:83
+#: src/lib/config.cc:85
msgid "sRGB non-linearised"
msgstr "sRGB non-linearised"
-#: src/lib/util.cc:164
+#: src/lib/util.cc:189
+msgid "second"
+msgstr "secondes"
+
+#: src/lib/util.cc:191
msgid "seconds"
msgstr "secondes"
diff --git a/src/lib/po/sv_SE.po b/src/lib/po/sv_SE.po
index 98d76e3bd..32843da7a 100644
--- a/src/lib/po/sv_SE.po
+++ b/src/lib/po/sv_SE.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: DCP-o-matic\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-24 14:53+0100\n"
+"POT-Creation-Date: 2014-10-03 22:31+0100\n"
"PO-Revision-Date: 2014-01-19 08:59+0100\n"
"Last-Translator: Adam Klotblixt <adam.klotblixt@gmail.com>\n"
"Language-Team: \n"
@@ -33,23 +33,23 @@ msgstr "%1 kanaler, %2kHz, %3 sampel"
msgid "%1 frames; %2 frames per second"
msgstr "%1 bilder; %2 bilder per sekund"
-#: src/lib/video_content.cc:206
+#: src/lib/video_content.cc:211
msgid "%1x%2 pixels (%3:1)"
msgstr "%1x%2 pixlar (%3:1)"
-#: src/lib/ratio.cc:35
+#: src/lib/ratio.cc:34
msgid "1.19"
msgstr "1,19"
-#: src/lib/ratio.cc:38
+#: src/lib/ratio.cc:37
msgid "1.375"
msgstr "1,375"
-#: src/lib/ratio.cc:39
+#: src/lib/ratio.cc:38
msgid "1.66"
msgstr "1,66"
-#: src/lib/ratio.cc:40
+#: src/lib/ratio.cc:39
msgid "16:9"
msgstr "16:9"
@@ -57,11 +57,11 @@ msgstr "16:9"
msgid "3D denoiser"
msgstr "3D brusreducering"
-#: src/lib/ratio.cc:36
+#: src/lib/ratio.cc:35
msgid "4:3"
msgstr "4:3"
-#: src/lib/ratio.cc:37
+#: src/lib/ratio.cc:36
msgid "Academy"
msgstr "Academy"
@@ -97,15 +97,15 @@ msgstr "Avbruten"
msgid "Cannot handle pixel format %1 during %2"
msgstr "Kan inte hantera pixelformat %1 under %2"
-#: src/lib/util.cc:751
+#: src/lib/util.cc:786
msgid "Centre"
msgstr "Center"
-#: src/lib/writer.cc:82
+#: src/lib/writer.cc:83
msgid "Checking existing image data"
msgstr "Kontrollerar befintligt bilddata"
-#: src/lib/writer.cc:471
+#: src/lib/writer.cc:475
msgid "Computing audio digest"
msgstr "Beräknar audiosammanfattning"
@@ -113,11 +113,11 @@ msgstr "Beräknar audiosammanfattning"
msgid "Computing digest"
msgstr "Beräknar sammanfattning"
-#: src/lib/writer.cc:467
+#: src/lib/writer.cc:471
msgid "Computing image digest"
msgstr "Beräknar bildsammanfattning"
-#: src/lib/frame_rate_change.cc:78
+#: src/lib/frame_rate_change.cc:86
msgid "Content and DCP have the same rate.\n"
msgstr "Källa och DCP har samma bildfrekvens.\n"
@@ -129,44 +129,50 @@ msgstr "Innehåll som ska sammanfogas måste använda samma audiofördröjning."
msgid "Content to be joined must have the same audio gain."
msgstr "Innehåll som ska sammanfogas måste använda samma audioförstärkning."
-#: src/lib/video_content.cc:144
+#: src/lib/video_content.cc:146
msgid "Content to be joined must have the same colour conversion."
msgstr "Innehåll som ska sammanfogas måste använda samma färgkonvertering."
-#: src/lib/video_content.cc:136
+#: src/lib/video_content.cc:138
msgid "Content to be joined must have the same crop."
msgstr "Innehåll som ska sammanfogas måste använda samma beskärning."
-#: src/lib/video_content.cc:124
+#: src/lib/video_content.cc:126
msgid "Content to be joined must have the same picture size."
msgstr "Innehåll som ska sammanfogas måste använda samma bildstorlek."
-#: src/lib/video_content.cc:140
+#: src/lib/video_content.cc:142
#, fuzzy
msgid "Content to be joined must have the same scale setting."
msgstr "Innehåll som ska sammanfogas måste använda samma bildförhållande."
-#: src/lib/subtitle_content.cc:73
+#: src/lib/subtitle_content.cc:81
#, fuzzy
msgid "Content to be joined must have the same subtitle X offset."
msgstr ""
"Innehåll som ska sammanfogas måste använda samma förskjutning på undertexten."
-#: src/lib/subtitle_content.cc:77
+#: src/lib/subtitle_content.cc:89
+#, fuzzy
+msgid "Content to be joined must have the same subtitle X scale."
+msgstr "Innehåll som ska sammanfogas måste använda samma skala på undertexten."
+
+#: src/lib/subtitle_content.cc:85
#, fuzzy
msgid "Content to be joined must have the same subtitle Y offset."
msgstr ""
"Innehåll som ska sammanfogas måste använda samma förskjutning på undertexten."
-#: src/lib/subtitle_content.cc:81
-msgid "Content to be joined must have the same subtitle scale."
+#: src/lib/subtitle_content.cc:93
+#, fuzzy
+msgid "Content to be joined must have the same subtitle Y scale."
msgstr "Innehåll som ska sammanfogas måste använda samma skala på undertexten."
-#: src/lib/video_content.cc:128
+#: src/lib/video_content.cc:130
msgid "Content to be joined must have the same video frame rate."
msgstr "Innehåll som ska sammanfogas måste använda samma videobildhastighet."
-#: src/lib/video_content.cc:132
+#: src/lib/video_content.cc:134
msgid "Content to be joined must have the same video frame type."
msgstr "Innehåll som ska sammanfogas måste använda samma videobildtyp."
@@ -178,49 +184,49 @@ msgstr "Innehåll som ska sammanfogas måste använda samma audioström."
msgid "Content to be joined must use the same subtitle stream."
msgstr "Innehåll som ska sammanfogas måste använda samma undertextström."
-#: src/lib/scp_dcp_job.cc:112
+#: src/lib/scp_dcp_job.cc:111
msgid "Copy DCP to TMS"
msgstr "Kopiera DCP till TMS"
-#: src/lib/scp_dcp_job.cc:137
+#: src/lib/scp_dcp_job.cc:130
msgid "Could not connect to server %1 (%2)"
msgstr "Kunde inte ansluta till server %1 (%2)"
-#: src/lib/scp_dcp_job.cc:159
+#: src/lib/scp_dcp_job.cc:152
msgid "Could not create remote directory %1 (%2)"
msgstr "Kunde inte skapa fjärrkatalog %1 (%2)"
-#: src/lib/image_proxy.cc:128
+#: src/lib/image_proxy.cc:147
#, fuzzy
-msgid "Could not decode image file"
+msgid "Could not decode image file (%1)"
msgstr "kunde inte skapa fil %1"
#: src/lib/job.cc:90
msgid "Could not open %1"
msgstr "Kunde inte öppna %1"
-#: src/lib/scp_dcp_job.cc:184
+#: src/lib/scp_dcp_job.cc:177
msgid "Could not open %1 to send"
msgstr "Kunde inte öppna %1 för att skicka"
-#: src/lib/internet.cc:72
+#: src/lib/internet.cc:74
#, fuzzy
msgid "Could not open downloaded ZIP file"
msgstr "kunde inte öppna fil %1"
-#: src/lib/scp_dcp_job.cc:154
+#: src/lib/scp_dcp_job.cc:147
msgid "Could not start SCP session (%1)"
msgstr "Kunde inte starta SCP-session (%1)"
-#: src/lib/scp_dcp_job.cc:198
+#: src/lib/scp_dcp_job.cc:191
msgid "Could not write to remote file (%1)"
msgstr "Kunde inte skriva till fjärrfil (%1)"
-#: src/lib/frame_rate_change.cc:90
+#: src/lib/frame_rate_change.cc:98
msgid "DCP will run at %1%% of the content speed.\n"
msgstr "DCP kommer att köras på %1%% av källans hastighet.\n"
-#: src/lib/frame_rate_change.cc:81
+#: src/lib/frame_rate_change.cc:89
msgid "DCP will use every other frame of the content.\n"
msgstr "DCP kommer att använda varannan bild från källan.\n"
@@ -242,7 +248,7 @@ msgid "De-interlacing"
msgstr "Avflätning"
# svåröversatt
-#: src/lib/config.cc:417
+#: src/lib/config.cc:436
#, fuzzy
msgid ""
"Dear Projectionist\n"
@@ -268,24 +274,24 @@ msgstr ""
msgid "Dolby CP650 and CP750"
msgstr "Dolby CP650 och CP750"
-#: src/lib/internet.cc:65
+#: src/lib/internet.cc:67
msgid "Download failed (%1/%2 error %3)"
msgstr ""
-#: src/lib/frame_rate_change.cc:83
+#: src/lib/frame_rate_change.cc:91
msgid "Each content frame will be doubled in the DCP.\n"
msgstr "Varje bild från källan kommer att användas två gånger i DCPn.\n"
-#: src/lib/frame_rate_change.cc:85
+#: src/lib/frame_rate_change.cc:93
msgid "Each content frame will be repeated %1 more times in the DCP.\n"
msgstr ""
"Varje bild från källan kommer att användas ytterligare %1 gång(er) i DCPn.\n"
-#: src/lib/send_kdm_email_job.cc:50
+#: src/lib/send_kdm_email_job.cc:52
msgid "Email KDMs for %1"
msgstr "E-posta KDM:er för %1"
-#: src/lib/writer.cc:125
+#: src/lib/writer.cc:126
msgid "Encoding image data"
msgstr "Kodar bild-data"
@@ -297,7 +303,7 @@ msgstr "Fel (%1)"
msgid "Examine content"
msgstr "Undersök innehållet"
-#: src/lib/scp_dcp_job.cc:147
+#: src/lib/scp_dcp_job.cc:140
msgid "Failed to authenticate with server (%1)"
msgstr "Misslyckades att autentisera med server (%1)"
@@ -309,11 +315,11 @@ msgstr "Snabb bilinjär"
msgid "Feature"
msgstr "Feature"
-#: src/lib/ratio.cc:41
+#: src/lib/ratio.cc:40
msgid "Flat"
msgstr "Flat"
-#: src/lib/ratio.cc:43
+#: src/lib/ratio.cc:42
msgid "Full frame"
msgstr "Full frame"
@@ -325,7 +331,7 @@ msgstr "Gaussisk"
msgid "Gradient debander"
msgstr "Gradientutjämnare"
-#: src/lib/util.cc:755
+#: src/lib/util.cc:790
msgid "Hearing impaired"
msgstr ""
@@ -342,6 +348,10 @@ msgstr ""
"Det är inte känt vad som orsakade detta fel. Bästa sättet att rapportera "
"problemet är till DCP-o-matics mejl-lista (carl@dcpomatic.com)"
+#: src/lib/config.cc:199
+msgid "KDM delivery: $CPL_NAME"
+msgstr ""
+
#: src/lib/filter.cc:66
msgid "Kernel deinterlacer"
msgstr "Kernel-avflätare"
@@ -350,24 +360,24 @@ msgstr "Kernel-avflätare"
msgid "Lanczos"
msgstr "Lanczos"
-#: src/lib/util.cc:749
+#: src/lib/util.cc:784
msgid "Left"
msgstr "Vänster"
-#: src/lib/util.cc:757
+#: src/lib/util.cc:792
msgid "Left centre"
msgstr ""
-#: src/lib/util.cc:759
+#: src/lib/util.cc:794
#, fuzzy
msgid "Left rear surround"
msgstr "Vänster surround"
-#: src/lib/util.cc:753
+#: src/lib/util.cc:788
msgid "Left surround"
msgstr "Vänster surround"
-#: src/lib/util.cc:752
+#: src/lib/util.cc:787
msgid "Lfe (sub)"
msgstr "Lfe (sub)"
@@ -379,11 +389,11 @@ msgstr "Diverse"
msgid "Motion compensating deinterlacer"
msgstr "Rörelsekompenserande avflätare"
-#: src/lib/video_content.cc:476
+#: src/lib/video_content_scale.cc:105
msgid "No scale"
msgstr ""
-#: src/lib/video_content.cc:473
+#: src/lib/video_content_scale.cc:102
#, fuzzy
msgid "No stretch"
msgstr "Flat utan utsträckning"
@@ -429,32 +439,32 @@ msgstr "Public Service Announcement"
msgid "Rating"
msgstr "Rating"
-#: src/lib/config.cc:84 src/lib/config.cc:173
+#: src/lib/config.cc:86 src/lib/config.cc:183
msgid "Rec. 709"
msgstr "Rec. 709"
-#: src/lib/util.cc:750
+#: src/lib/util.cc:785
msgid "Right"
msgstr "Höger"
-#: src/lib/util.cc:758
+#: src/lib/util.cc:793
msgid "Right centre"
msgstr ""
-#: src/lib/util.cc:760
+#: src/lib/util.cc:795
#, fuzzy
msgid "Right rear surround"
msgstr "Höger surround"
-#: src/lib/util.cc:754
+#: src/lib/util.cc:789
msgid "Right surround"
msgstr "Höger surround"
-#: src/lib/scp_dcp_job.cc:142
+#: src/lib/scp_dcp_job.cc:135
msgid "SSH error (%1)"
msgstr "SSH fel (%1)"
-#: src/lib/ratio.cc:42
+#: src/lib/ratio.cc:41
msgid "Scope"
msgstr "Scope"
@@ -494,7 +504,7 @@ msgstr ""
msgid "There was not enough memory to do this."
msgstr ""
-#: src/lib/film.cc:413
+#: src/lib/film.cc:414
#, fuzzy
msgid ""
"This film was created with a newer version of DCP-o-matic, and it cannot be "
@@ -504,7 +514,7 @@ msgstr ""
"inte öppnas i denna version. Du måste skapa en ny Film, lägga till ditt "
"innehåll och konfigurera allt igen. Ursäkta!"
-#: src/lib/film.cc:405
+#: src/lib/film.cc:406
msgid ""
"This film was created with an older version of DCP-o-matic, and "
"unfortunately it cannot be loaded into this version. You will need to "
@@ -526,11 +536,11 @@ msgstr "Konvertera %1"
msgid "Transitional"
msgstr "Transitional"
-#: src/lib/internet.cc:77
+#: src/lib/internet.cc:79
msgid "Unexpected ZIP file contents"
msgstr ""
-#: src/lib/image_proxy.cc:174
+#: src/lib/image_proxy.cc:193
msgid "Unexpected image type received by server"
msgstr ""
@@ -539,7 +549,7 @@ msgid "Unknown error"
msgstr "Okänt fel"
# Svengelska
-#: src/lib/ffmpeg_decoder.cc:295
+#: src/lib/ffmpeg_decoder.cc:293
msgid "Unrecognised audio sample format (%1)"
msgstr "Okänt audio-sampelformat (%1)"
@@ -547,15 +557,15 @@ msgstr "Okänt audio-sampelformat (%1)"
msgid "Unsharp mask and Gaussian blur"
msgstr "Oskärpemask och Gaussisk suddighet"
-#: src/lib/colour_conversion.cc:140
+#: src/lib/colour_conversion.cc:139
msgid "Untitled"
msgstr "Utan titel"
-#: src/lib/util.cc:756
+#: src/lib/util.cc:791
msgid "Visually impaired"
msgstr ""
-#: src/lib/scp_dcp_job.cc:104
+#: src/lib/scp_dcp_job.cc:103
msgid "Waiting"
msgstr "Väntar"
@@ -568,7 +578,7 @@ msgstr "X"
msgid "Yet Another Deinterlacing Filter"
msgstr "Yet Another Deinterlacing Filter"
-#: src/lib/film.cc:310
+#: src/lib/film.cc:311
msgid "You must add some content to the DCP before creating it"
msgstr "Du måste lägga till något innehåll till DCP:n innan du skapar den"
@@ -580,28 +590,28 @@ msgstr "[rörliga bilder]"
msgid "[still]"
msgstr "[stillbild]"
-#: src/lib/film.cc:258
+#: src/lib/film.cc:259
msgid "cannot contain slashes"
msgstr "får inte innehålla snedstreck"
# Svengelska
-#: src/lib/util.cc:530
+#: src/lib/util.cc:565
msgid "connect timed out"
msgstr "uppkopplingen tajmade ur"
-#: src/lib/scp_dcp_job.cc:128
+#: src/lib/scp_dcp_job.cc:121
msgid "connecting"
msgstr "kopplar upp"
-#: src/lib/film.cc:306
+#: src/lib/film.cc:307
msgid "container"
msgstr "behållare"
-#: src/lib/film.cc:314
+#: src/lib/film.cc:315
msgid "content type"
msgstr "innehållstyp"
-#: src/lib/scp_dcp_job.cc:177
+#: src/lib/scp_dcp_job.cc:170
msgid "copying %1"
msgstr "kopierar %1"
@@ -609,19 +619,19 @@ msgstr "kopierar %1"
msgid "could not create file %1"
msgstr "kunde inte skapa fil %1"
-#: src/lib/ffmpeg.cc:177
+#: src/lib/ffmpeg.cc:176
msgid "could not find audio decoder"
msgstr "kunde inte hitta audio-avkodare"
-#: src/lib/ffmpeg.cc:106
+#: src/lib/ffmpeg.cc:105
msgid "could not find stream information"
msgstr "kunde inte hitta information om strömmen"
-#: src/lib/ffmpeg.cc:156
+#: src/lib/ffmpeg.cc:155
msgid "could not find video decoder"
msgstr "kunde inte hitta video-avkodare"
-#: src/lib/writer.cc:435
+#: src/lib/writer.cc:439
msgid "could not move audio MXF into the DCP (%1)"
msgstr "kunde inte flytta audio-MXF in i DCP:n (%1)"
@@ -633,11 +643,11 @@ msgstr "kunde inte öppna audio-fil för läsning"
msgid "could not open file %1"
msgstr "kunde inte öppna fil %1"
-#: src/lib/dcp_video_frame.cc:334
+#: src/lib/dcp_video_frame.cc:331
msgid "could not open file for reading"
msgstr "kunde inte öppna fil för läsning"
-#: src/lib/dcp_video_frame.cc:340
+#: src/lib/dcp_video_frame.cc:337
msgid "could not read encoded data"
msgstr "kunde inte läsa kodat data"
@@ -654,11 +664,11 @@ msgid "could not run sample-rate converter for %1 samples (%2) (%3)"
msgstr ""
"kunde inte köra sampelhastighetskonverteraren under %1 sampel (%2) (%3)"
-#: src/lib/scp_dcp_job.cc:89
+#: src/lib/scp_dcp_job.cc:88
msgid "could not start SCP session (%1)"
msgstr "kunde inte starta SCP-session (%1)"
-#: src/lib/scp_dcp_job.cc:55
+#: src/lib/scp_dcp_job.cc:54
msgid "could not start SSH session"
msgstr "kunde inte starta SSH-session"
@@ -666,43 +676,43 @@ msgstr "kunde inte starta SSH-session"
msgid "could not write to file %1 (%2)"
msgstr "kunde inte skriva till fil %1 (%2)"
-#: src/lib/util.cc:550
+#: src/lib/util.cc:585
msgid "error during async_accept (%1)"
msgstr "fel vid async_accept (%1)"
-#: src/lib/util.cc:526
+#: src/lib/util.cc:561
msgid "error during async_connect (%1)"
msgstr "fel vid async_connect (%1)"
-#: src/lib/util.cc:599
+#: src/lib/util.cc:634
msgid "error during async_read (%1)"
msgstr "fel vid async_read (%1)"
-#: src/lib/util.cc:571
+#: src/lib/util.cc:606
msgid "error during async_write (%1)"
msgstr "fel vid async_write (%1)"
-#: src/lib/transcode_job.cc:103
+#: src/lib/transcode_job.cc:97
msgid "frames per second"
msgstr "bilder per sekund"
-#: src/lib/util.cc:152
+#: src/lib/util.cc:156
msgid "hour"
msgstr "timme"
-#: src/lib/util.cc:149 src/lib/util.cc:154
+#: src/lib/util.cc:152 src/lib/util.cc:158
msgid "hours"
msgstr "timmar"
-#: src/lib/util.cc:159
+#: src/lib/util.cc:174
msgid "minute"
msgstr "minut"
-#: src/lib/util.cc:161
+#: src/lib/util.cc:170 src/lib/util.cc:176
msgid "minutes"
msgstr "minuter"
-#: src/lib/util.cc:671
+#: src/lib/util.cc:706
msgid "missing key %1 in key-value set"
msgstr "saknad nyckel %1 i nyckel-värde grupp"
@@ -715,15 +725,15 @@ msgstr "saknad nödvändig inställning %1"
msgid "moving"
msgstr "rörlig"
-#: src/lib/ffmpeg_decoder.cc:591
+#: src/lib/ffmpeg_decoder.cc:589
msgid "multi-part subtitles not yet supported"
msgstr "undertexter i flera delar stöds inte ännu"
-#: src/lib/film.cc:258 src/lib/film.cc:318
+#: src/lib/film.cc:259 src/lib/film.cc:319
msgid "name"
msgstr "namn"
-#: src/lib/ffmpeg_decoder.cc:606
+#: src/lib/ffmpeg_decoder.cc:604
msgid "non-bitmap subtitles not yet supported"
msgstr "icke-rastergrafiska undertexter stöds inte ännu"
@@ -733,15 +743,20 @@ msgstr "icke-rastergrafiska undertexter stöds inte ännu"
msgid "remaining"
msgstr "återstående tid"
-#: src/lib/config.cc:82 src/lib/video_content.cc:175
+#: src/lib/config.cc:84 src/lib/video_content.cc:179
msgid "sRGB"
msgstr "sRGB"
-#: src/lib/config.cc:83
+#: src/lib/config.cc:85
msgid "sRGB non-linearised"
msgstr "sRGB icke-linjär"
-#: src/lib/util.cc:164
+#: src/lib/util.cc:189
+#, fuzzy
+msgid "second"
+msgstr "sekunder"
+
+#: src/lib/util.cc:191
msgid "seconds"
msgstr "sekunder"
diff --git a/src/lib/ratio.cc b/src/lib/ratio.cc
index 52577d3bb..554d3c36c 100644
--- a/src/lib/ratio.cc
+++ b/src/lib/ratio.cc
@@ -24,7 +24,6 @@
#include "i18n.h"
using std::string;
-using std::stringstream;
using std::vector;
vector<Ratio const *> Ratio::_ratios;
@@ -57,3 +56,20 @@ Ratio::from_id (string i)
return *j;
}
+
+/** @return Ratio corresponding to a given fractional ratio (+/- 0.01), or 0 */
+Ratio const *
+Ratio::from_ratio (float r)
+{
+ vector<Ratio const *>::iterator j = _ratios.begin ();
+ while (j != _ratios.end() && fabs ((*j)->ratio() - r) > 0.01) {
+ ++j;
+ }
+
+ if (j == _ratios.end ()) {
+ return 0;
+ }
+
+ return *j;
+}
+
diff --git a/src/lib/ratio.h b/src/lib/ratio.h
index 8b1a1fc71..ab157a9bc 100644
--- a/src/lib/ratio.h
+++ b/src/lib/ratio.h
@@ -52,6 +52,7 @@ public:
static void setup_ratios ();
static Ratio const * from_id (std::string i);
+ static Ratio const * from_ratio (float r);
static std::vector<Ratio const *> all () {
return _ratios;
}
diff --git a/src/lib/json_server.h b/src/lib/safe_stringstream.cc
index 623067558..01d545045 100644
--- a/src/lib/json_server.h
+++ b/src/lib/safe_stringstream.cc
@@ -17,15 +17,7 @@
*/
-class JSONServer
-{
-public:
- JSONServer (int port);
+#include <boost/thread/mutex.hpp>
+#include "safe_stringstream.h"
-private:
- void run (int port);
- void handle (boost::shared_ptr<boost::asio::ip::tcp::socket> socket);
- void request (std::string url, boost::shared_ptr<boost::asio::ip::tcp::socket> socket);
-};
-
-
+boost::mutex SafeStringStream::_mutex;
diff --git a/src/lib/safe_stringstream.h b/src/lib/safe_stringstream.h
new file mode 100644
index 000000000..e455de964
--- /dev/null
+++ b/src/lib/safe_stringstream.h
@@ -0,0 +1,115 @@
+/*
+ Copyright (C) 2014 Carl Hetherington <cth@carlh.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef DCPOMATIC_SAFE_STRINGSTREAM_H
+#define DCPOMATIC_SAFE_STRINGSTREAM_H
+
+#include <boost/thread/mutex.hpp>
+
+/* I've not been able to reproduce it, but there have been reports that DCP-o-matic crashes
+ * on OS X with two simultaneous backtraces that look like this:
+ *
+ * 0 libSystem.B.dylib 0x00007fff84ebe264 __numeric_load_locale + 125
+ * 1 libSystem.B.dylib 0x00007fff84e2aac4 loadlocale + 323
+ * 2 libstdc++.6.dylib 0x00007fff8976ba69 std::__convert_from_v(int* const&, char*, int, char const*, ...) + 199
+ * 3 libstdc++.6.dylib 0x00007fff8974e99b std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char,
+std::char_traits<char> > >::_M_insert_float<double>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, char, double) const + 199
+ * 4 libstdc++.6.dylib 0x00007fff8974ebc0 std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> >
+>::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, double) const + 28
+ * 5 libstdc++.6.dylib 0x00007fff897566a2 std::ostream& std::ostream::_M_insert<double>(double) + 178
+ * 6 libdcpomatic.dylib 0x0000000100331e21 StringPrivate::Composition& StringPrivate::Composition::arg<float>(float const&) + 33
+ *
+ * in two different threads. I'm assuming that for some bizarre reason it is unsafe to use two separate stringstream
+ * objects in different threads on OS X. This is a hack to work around it.
+ */
+
+class SafeStringStream
+{
+public:
+ SafeStringStream ()
+ {}
+
+ SafeStringStream (std::string s)
+ : _stream (s)
+ {}
+
+ template <class T>
+ std::ostream& operator<< (T val)
+ {
+ boost::mutex::scoped_lock lm (_mutex);
+ _stream << val;
+ return _stream;
+ }
+
+ template <class T>
+ std::istream& operator>> (T& val)
+ {
+ boost::mutex::scoped_lock lm (_mutex);
+ _stream >> val;
+ return _stream;
+ }
+
+ std::string str () const {
+ return _stream.str ();
+ }
+
+ void str (std::string const & s) {
+ _stream.str (s);
+ }
+
+ void imbue (std::locale const & loc)
+ {
+ boost::mutex::scoped_lock lm (_mutex);
+ _stream.imbue (loc);
+ }
+
+ void width (int w)
+ {
+ _stream.width (w);
+ }
+
+ void precision (int p)
+ {
+ _stream.precision (p);
+ }
+
+ bool good () const
+ {
+ return _stream.good ();
+ }
+
+ std::string getline ()
+ {
+ boost::mutex::scoped_lock lm (_mutex);
+ std::string s;
+ std::getline (_stream, s);
+ return s;
+ }
+
+ void setf (std::ios_base::fmtflags flags, std::ios_base::fmtflags mask)
+ {
+ _stream.setf (flags, mask);
+ }
+
+private:
+ static boost::mutex _mutex;
+ std::stringstream _stream;
+};
+
+#endif
diff --git a/src/lib/scp_dcp_job.cc b/src/lib/scp_dcp_job.cc
index 637840813..67a1fb802 100644
--- a/src/lib/scp_dcp_job.cc
+++ b/src/lib/scp_dcp_job.cc
@@ -40,7 +40,6 @@
#define LOG_GENERAL_NC(...) _film->log()->log (__VA_ARGS__, Log::TYPE_GENERAL);
using std::string;
-using std::stringstream;
using std::min;
using boost::shared_ptr;
@@ -112,12 +111,6 @@ SCPDCPJob::name () const
return _("Copy DCP to TMS");
}
-string
-SCPDCPJob::json_name () const
-{
- return N_("scp_dcp");
-}
-
void
SCPDCPJob::run ()
{
@@ -217,12 +210,11 @@ string
SCPDCPJob::status () const
{
boost::mutex::scoped_lock lm (_status_mutex);
- stringstream s;
- s << Job::status ();
+ string s = Job::status ();
if (!_status.empty ()) {
- s << N_("; ") << _status;
+ s += N_("; ") + _status;
}
- return s.str ();
+ return s;
}
void
diff --git a/src/lib/scp_dcp_job.h b/src/lib/scp_dcp_job.h
index e3960d73b..bdc83af18 100644
--- a/src/lib/scp_dcp_job.h
+++ b/src/lib/scp_dcp_job.h
@@ -29,7 +29,6 @@ public:
SCPDCPJob (boost::shared_ptr<const Film>);
std::string name () const;
- std::string json_name () const;
void run ();
std::string status () const;
diff --git a/src/lib/send_kdm_email_job.cc b/src/lib/send_kdm_email_job.cc
index 1dec2ffb0..164dfe987 100644
--- a/src/lib/send_kdm_email_job.cc
+++ b/src/lib/send_kdm_email_job.cc
@@ -52,12 +52,6 @@ SendKDMEmailJob::name () const
return String::compose (_("Email KDMs for %1"), _film->name());
}
-string
-SendKDMEmailJob::json_name () const
-{
- return N_("send_kdm_email");
-}
-
void
SendKDMEmailJob::run ()
{
diff --git a/src/lib/send_kdm_email_job.h b/src/lib/send_kdm_email_job.h
index 8a8903040..778d3927a 100644
--- a/src/lib/send_kdm_email_job.h
+++ b/src/lib/send_kdm_email_job.h
@@ -36,7 +36,6 @@ public:
);
std::string name () const;
- std::string json_name () const;
void run ();
private:
diff --git a/src/lib/server.cc b/src/lib/server.cc
index f1c6d6c44..9428ba611 100644
--- a/src/lib/server.cc
+++ b/src/lib/server.cc
@@ -24,7 +24,6 @@
#include <string>
#include <vector>
-#include <sstream>
#include <iostream>
#include <boost/algorithm/string.hpp>
#include <boost/scoped_array.hpp>
@@ -38,6 +37,7 @@
#include "config.h"
#include "cross.h"
#include "player_video_frame.h"
+#include "safe_stringstream.h"
#include "i18n.h"
@@ -47,7 +47,6 @@
#define LOG_ERROR_NC(...) _log->log (__VA_ARGS__, Log::TYPE_ERROR);
using std::string;
-using std::stringstream;
using std::multimap;
using std::vector;
using std::list;
@@ -82,9 +81,9 @@ Server::process (shared_ptr<Socket> socket, struct timeval& after_read, struct t
scoped_array<char> buffer (new char[length]);
socket->read (reinterpret_cast<uint8_t*> (buffer.get()), length);
- stringstream s (buffer.get());
+ string s (buffer.get());
shared_ptr<cxml::Document> xml (new cxml::Document ("EncodingRequest"));
- xml->read_stream (s);
+ xml->read_string (s);
if (xml->number_child<int> ("Version") != SERVER_LINK_VERSION) {
cerr << "Mismatched server/client versions\n";
LOG_ERROR_NC ("Mismatched server/client versions");
@@ -154,7 +153,7 @@ Server::worker_thread ()
struct timeval end;
gettimeofday (&end, 0);
- stringstream message;
+ SafeStringStream message;
message.precision (2);
message << fixed
<< "Encoded frame " << frame << " from " << ip << ": "
@@ -246,14 +245,16 @@ Server::broadcast_received ()
xmlpp::Document doc;
xmlpp::Element* root = doc.create_root_node ("ServerAvailable");
root->add_child("Threads")->add_child_text (raw_convert<string> (_worker_threads.size ()));
- stringstream xml;
- doc.write_to_stream (xml, "UTF-8");
+ string xml = doc.write_to_string ("UTF-8");
+ if (_verbose) {
+ cout << "Offering services to master " << _broadcast.send_endpoint.address().to_string () << "\n";
+ }
shared_ptr<Socket> socket (new Socket);
try {
socket->connect (boost::asio::ip::tcp::endpoint (_broadcast.send_endpoint.address(), Config::instance()->server_port_base() + 1));
- socket->write (xml.str().length() + 1);
- socket->write ((uint8_t *) xml.str().c_str(), xml.str().length() + 1);
+ socket->write (xml.length() + 1);
+ socket->write ((uint8_t *) xml.c_str(), xml.length() + 1);
} catch (...) {
}
diff --git a/src/lib/server_finder.cc b/src/lib/server_finder.cc
index 65e0940a0..a082f3bab 100644
--- a/src/lib/server_finder.cc
+++ b/src/lib/server_finder.cc
@@ -27,7 +27,6 @@
#include "ui_signaller.h"
using std::string;
-using std::stringstream;
using std::list;
using std::vector;
using std::cout;
@@ -103,24 +102,31 @@ void
ServerFinder::listen_thread ()
try
{
+ using namespace boost::asio::ip;
+
+ boost::asio::io_service io_service;
+ tcp::acceptor acceptor (io_service, tcp::endpoint (tcp::v4(), Config::instance()->server_port_base() + 1));
+
while (true) {
- shared_ptr<Socket> sock (new Socket (60));
+ tcp::socket socket (io_service);
+ acceptor.accept (socket);
- try {
- sock->accept (Config::instance()->server_port_base() + 1);
- } catch (std::exception& e) {
- continue;
- }
+ /* XXX: these reads should have timeouts, otherwise we will stop finding servers
+ if one dies during this conversation
+ */
+
+ uint32_t length = 0;
+ boost::asio::read (socket, boost::asio::buffer (&length, sizeof (uint32_t)));
+ length = ntohl (length);
- uint32_t length = sock->read_uint32 ();
scoped_array<char> buffer (new char[length]);
- sock->read (reinterpret_cast<uint8_t*> (buffer.get()), length);
+ boost::asio::read (socket, boost::asio::buffer (reinterpret_cast<uint8_t*> (buffer.get ()), length));
- stringstream s (buffer.get());
+ string s (buffer.get());
shared_ptr<cxml::Document> xml (new cxml::Document ("ServerAvailable"));
- xml->read_stream (s);
-
- string const ip = sock->socket().remote_endpoint().address().to_string ();
+ xml->read_string (s);
+
+ string const ip = socket.remote_endpoint().address().to_string ();
if (!server_found (ip)) {
ServerDescription sd (ip, xml->number_child<int> ("Threads"));
_servers.push_back (sd);
diff --git a/src/lib/sndfile_content.cc b/src/lib/sndfile_content.cc
index 3efba6fd5..ba3bd0a77 100644
--- a/src/lib/sndfile_content.cc
+++ b/src/lib/sndfile_content.cc
@@ -25,11 +25,11 @@
#include "compose.hpp"
#include "job.h"
#include "util.h"
+#include "safe_stringstream.h"
#include "i18n.h"
using std::string;
-using std::stringstream;
using std::cout;
using boost::shared_ptr;
using libdcp::raw_convert;
@@ -76,7 +76,7 @@ SndfileContent::information () const
return "";
}
- stringstream s;
+ SafeStringStream s;
s << String::compose (
_("%1 channels, %2kHz, %3 samples"),
diff --git a/src/lib/stack.cpp b/src/lib/stack.cpp
index a8183d344..167524017 100644
--- a/src/lib/stack.cpp
+++ b/src/lib/stack.cpp
@@ -9,7 +9,6 @@
#include <iomanip>
#include <ostream>
#include <stdexcept>
-#include <sstream>
#include "stack.hpp"
diff --git a/src/lib/subtitle.cc b/src/lib/subtitle.cc
index 0d18861c4..03d4ccf2f 100644
--- a/src/lib/subtitle.cc
+++ b/src/lib/subtitle.cc
@@ -60,9 +60,9 @@ Subtitle::update (shared_ptr<const Film> film, libdcp::Size video_container_size
in_rect.x += sc->subtitle_x_offset ();
in_rect.y += sc->subtitle_y_offset ();
- /* We will scale the subtitle up to fit _video_container_size, and also by the additional subtitle_scale */
- scaled_size.width = in_rect.width * video_container_size.width * sc->subtitle_scale ();
- scaled_size.height = in_rect.height * video_container_size.height * sc->subtitle_scale ();
+ /* We will scale the subtitle up to fit _video_container_size, and also by the additional subtitle scale */
+ scaled_size.width = in_rect.width * video_container_size.width * sc->subtitle_x_scale ();
+ scaled_size.height = in_rect.height * video_container_size.height * sc->subtitle_y_scale ();
/* Then we need a corrective translation, consisting of two parts:
*
@@ -70,14 +70,14 @@ Subtitle::update (shared_ptr<const Film> film, libdcp::Size video_container_size
* rect.x * _video_container_size.width and rect.y * _video_container_size.height.
*
* 2. that to shift the origin of the scale by subtitle_scale to the centre of the subtitle; this will be
- * (width_before_subtitle_scale * (1 - subtitle_scale) / 2) and
- * (height_before_subtitle_scale * (1 - subtitle_scale) / 2).
+ * (width_before_subtitle_scale * (1 - subtitle_x_scale) / 2) and
+ * (height_before_subtitle_scale * (1 - subtitle_y_scale) / 2).
*
* Combining these two translations gives these expressions.
*/
- _out_position.x = rint (video_container_size.width * (in_rect.x + (in_rect.width * (1 - sc->subtitle_scale ()) / 2)));
- _out_position.y = rint (video_container_size.height * (in_rect.y + (in_rect.height * (1 - sc->subtitle_scale ()) / 2)));
+ _out_position.x = rint (video_container_size.width * (in_rect.x + (in_rect.width * (1 - sc->subtitle_x_scale ()) / 2)));
+ _out_position.y = rint (video_container_size.height * (in_rect.y + (in_rect.height * (1 - sc->subtitle_y_scale ()) / 2)));
_out_image = _in_image->scale (
scaled_size,
diff --git a/src/lib/subtitle_content.cc b/src/lib/subtitle_content.cc
index 0abb7d491..3702eef41 100644
--- a/src/lib/subtitle_content.cc
+++ b/src/lib/subtitle_content.cc
@@ -33,13 +33,15 @@ using libdcp::raw_convert;
int const SubtitleContentProperty::SUBTITLE_X_OFFSET = 500;
int const SubtitleContentProperty::SUBTITLE_Y_OFFSET = 501;
-int const SubtitleContentProperty::SUBTITLE_SCALE = 502;
+int const SubtitleContentProperty::SUBTITLE_X_SCALE = 502;
+int const SubtitleContentProperty::SUBTITLE_Y_SCALE = 503;
SubtitleContent::SubtitleContent (shared_ptr<const Film> f, boost::filesystem::path p)
: Content (f, p)
, _subtitle_x_offset (0)
, _subtitle_y_offset (0)
- , _subtitle_scale (1)
+ , _subtitle_x_scale (1)
+ , _subtitle_y_scale (1)
{
}
@@ -48,7 +50,8 @@ SubtitleContent::SubtitleContent (shared_ptr<const Film> f, shared_ptr<const cxm
: Content (f, node)
, _subtitle_x_offset (0)
, _subtitle_y_offset (0)
- , _subtitle_scale (1)
+ , _subtitle_x_scale (1)
+ , _subtitle_y_scale (1)
{
if (version >= 7) {
_subtitle_x_offset = node->number_child<float> ("SubtitleXOffset");
@@ -56,8 +59,13 @@ SubtitleContent::SubtitleContent (shared_ptr<const Film> f, shared_ptr<const cxm
} else {
_subtitle_y_offset = node->number_child<float> ("SubtitleOffset");
}
-
- _subtitle_scale = node->number_child<float> ("SubtitleScale");
+
+ if (version >= 10) {
+ _subtitle_x_scale = node->number_child<float> ("SubtitleXScale");
+ _subtitle_y_scale = node->number_child<float> ("SubtitleYScale");
+ } else {
+ _subtitle_x_scale = _subtitle_y_scale = node->number_child<float> ("SubtitleScale");
+ }
}
SubtitleContent::SubtitleContent (shared_ptr<const Film> f, vector<shared_ptr<Content> > c)
@@ -77,14 +85,19 @@ SubtitleContent::SubtitleContent (shared_ptr<const Film> f, vector<shared_ptr<Co
throw JoinError (_("Content to be joined must have the same subtitle Y offset."));
}
- if (sc->subtitle_scale() != ref->subtitle_scale()) {
- throw JoinError (_("Content to be joined must have the same subtitle scale."));
+ if (sc->subtitle_x_scale() != ref->subtitle_x_scale()) {
+ throw JoinError (_("Content to be joined must have the same subtitle X scale."));
+ }
+
+ if (sc->subtitle_y_scale() != ref->subtitle_y_scale()) {
+ throw JoinError (_("Content to be joined must have the same subtitle Y scale."));
}
}
_subtitle_x_offset = ref->subtitle_x_offset ();
_subtitle_y_offset = ref->subtitle_y_offset ();
- _subtitle_scale = ref->subtitle_scale ();
+ _subtitle_x_scale = ref->subtitle_x_scale ();
+ _subtitle_y_scale = ref->subtitle_y_scale ();
}
void
@@ -92,7 +105,8 @@ SubtitleContent::as_xml (xmlpp::Node* root) const
{
root->add_child("SubtitleXOffset")->add_child_text (raw_convert<string> (_subtitle_x_offset));
root->add_child("SubtitleYOffset")->add_child_text (raw_convert<string> (_subtitle_y_offset));
- root->add_child("SubtitleScale")->add_child_text (raw_convert<string> (_subtitle_scale));
+ root->add_child("SubtitleXScale")->add_child_text (raw_convert<string> (_subtitle_x_scale));
+ root->add_child("SubtitleYScale")->add_child_text (raw_convert<string> (_subtitle_y_scale));
}
void
@@ -116,11 +130,21 @@ SubtitleContent::set_subtitle_y_offset (double o)
}
void
-SubtitleContent::set_subtitle_scale (double s)
+SubtitleContent::set_subtitle_x_scale (double s)
+{
+ {
+ boost::mutex::scoped_lock lm (_mutex);
+ _subtitle_x_scale = s;
+ }
+ signal_changed (SubtitleContentProperty::SUBTITLE_X_SCALE);
+}
+
+void
+SubtitleContent::set_subtitle_y_scale (double s)
{
{
boost::mutex::scoped_lock lm (_mutex);
- _subtitle_scale = s;
+ _subtitle_y_scale = s;
}
- signal_changed (SubtitleContentProperty::SUBTITLE_SCALE);
+ signal_changed (SubtitleContentProperty::SUBTITLE_Y_SCALE);
}
diff --git a/src/lib/subtitle_content.h b/src/lib/subtitle_content.h
index 388637688..329368e44 100644
--- a/src/lib/subtitle_content.h
+++ b/src/lib/subtitle_content.h
@@ -27,7 +27,8 @@ class SubtitleContentProperty
public:
static int const SUBTITLE_X_OFFSET;
static int const SUBTITLE_Y_OFFSET;
- static int const SUBTITLE_SCALE;
+ static int const SUBTITLE_X_SCALE;
+ static int const SUBTITLE_Y_SCALE;
};
class SubtitleContent : public virtual Content
@@ -41,7 +42,8 @@ public:
void set_subtitle_x_offset (double);
void set_subtitle_y_offset (double);
- void set_subtitle_scale (double);
+ void set_subtitle_x_scale (double);
+ void set_subtitle_y_scale (double);
double subtitle_x_offset () const {
boost::mutex::scoped_lock lm (_mutex);
@@ -53,9 +55,14 @@ public:
return _subtitle_y_offset;
}
- double subtitle_scale () const {
+ double subtitle_x_scale () const {
boost::mutex::scoped_lock lm (_mutex);
- return _subtitle_scale;
+ return _subtitle_x_scale;
+ }
+
+ double subtitle_y_scale () const {
+ boost::mutex::scoped_lock lm (_mutex);
+ return _subtitle_y_scale;
}
private:
@@ -69,8 +76,10 @@ private:
* +ve is further down the frame, -ve is further up.
*/
double _subtitle_y_offset;
- /** scale factor to apply to subtitles */
- double _subtitle_scale;
+ /** x scale factor to apply to subtitles */
+ double _subtitle_x_scale;
+ /** y scale factor to apply to subtitles */
+ double _subtitle_y_scale;
};
#endif
diff --git a/src/lib/transcode_job.cc b/src/lib/transcode_job.cc
index ef15f9f5e..831c74b3b 100644
--- a/src/lib/transcode_job.cc
+++ b/src/lib/transcode_job.cc
@@ -27,6 +27,7 @@
#include "film.h"
#include "transcoder.h"
#include "log.h"
+#include "safe_stringstream.h"
#include "i18n.h"
@@ -34,7 +35,6 @@
#define LOG_ERROR_NC(...) _film->log()->log (__VA_ARGS__, Log::TYPE_ERROR);
using std::string;
-using std::stringstream;
using std::fixed;
using std::setprecision;
using boost::shared_ptr;
@@ -53,12 +53,6 @@ TranscodeJob::name () const
return String::compose (_("Transcode %1"), _film->name());
}
-string
-TranscodeJob::json_name () const
-{
- return N_("transcode");
-}
-
void
TranscodeJob::run ()
{
@@ -95,7 +89,7 @@ TranscodeJob::status () const
return Job::status ();
}
- stringstream s;
+ SafeStringStream s;
s << Job::status ();
diff --git a/src/lib/transcode_job.h b/src/lib/transcode_job.h
index 6e3c1ead9..9128206d2 100644
--- a/src/lib/transcode_job.h
+++ b/src/lib/transcode_job.h
@@ -35,7 +35,6 @@ public:
TranscodeJob (boost::shared_ptr<const Film> f);
std::string name () const;
- std::string json_name () const;
void run ();
std::string status () const;
diff --git a/src/lib/ui_signaller.h b/src/lib/ui_signaller.h
index 1d62547f6..ee4d230d4 100644
--- a/src/lib/ui_signaller.h
+++ b/src/lib/ui_signaller.h
@@ -54,8 +54,15 @@ public:
}
}
+ /* Do something next time the UI is idle */
+ template <typename T>
+ void when_idle (T f) {
+ _service.post (f);
+ }
+
/** Call this in the UI when it is idle */
size_t ui_idle () {
+ /* This executes any functors that have been post()ed to _service */
return _service.poll ();
}
diff --git a/src/lib/update.cc b/src/lib/update.cc
index af3e46f0e..7bec061e9 100644
--- a/src/lib/update.cc
+++ b/src/lib/update.cc
@@ -18,7 +18,6 @@
*/
#include <string>
-#include <sstream>
#include <boost/algorithm/string.hpp>
#include <curl/curl.h>
#include <libcxml/cxml.h>
@@ -26,13 +25,13 @@
#include "update.h"
#include "version.h"
#include "ui_signaller.h"
+#include "safe_stringstream.h"
#define BUFFER_SIZE 1024
using std::cout;
using std::min;
using std::string;
-using std::stringstream;
using libdcp::raw_convert;
UpdateChecker* UpdateChecker::_instance = 0;
@@ -103,10 +102,9 @@ UpdateChecker::thread ()
}
_buffer[_offset] = '\0';
- stringstream s;
- s << _buffer;
+ string s (_buffer);
cxml::Document doc ("Update");
- doc.read_stream (s);
+ doc.read_string (s);
{
boost::mutex::scoped_lock lm (_data_mutex);
diff --git a/src/lib/util.cc b/src/lib/util.cc
index 86046bcf8..290dd20ef 100644
--- a/src/lib/util.cc
+++ b/src/lib/util.cc
@@ -22,7 +22,6 @@
* @brief Some utility functions and classes.
*/
-#include <sstream>
#include <iomanip>
#include <iostream>
#include <fstream>
@@ -70,6 +69,7 @@ extern "C" {
#include "cross.h"
#include "video_content.h"
#include "md5_digester.h"
+#include "safe_stringstream.h"
#ifdef DCPOMATIC_WINDOWS
#include "stack.hpp"
#endif
@@ -77,7 +77,6 @@ extern "C" {
#include "i18n.h"
using std::string;
-using std::stringstream;
using std::setfill;
using std::ostream;
using std::endl;
@@ -121,7 +120,7 @@ seconds_to_hms (int s)
int h = m / 60;
m -= (h * 60);
- stringstream hms;
+ SafeStringStream hms;
hms << h << N_(":");
hms.width (2);
hms << std::setfill ('0') << m << N_(":");
@@ -142,26 +141,55 @@ seconds_to_approximate_hms (int s)
int h = m / 60;
m -= (h * 60);
- stringstream ap;
-
- if (h > 0) {
- if (m > 30) {
+ SafeStringStream ap;
+
+ bool const hours = h > 0;
+ bool const minutes = h < 10 && m > 0;
+ bool const seconds = m < 10 && s > 0;
+
+ if (hours) {
+ if (m > 30 && !minutes) {
ap << (h + 1) << N_(" ") << _("hours");
} else {
+ ap << h << N_(" ");
if (h == 1) {
- ap << N_("1 ") << _("hour");
+ ap << _("hour");
} else {
- ap << h << N_(" ") << _("hours");
+ ap << _("hours");
}
}
- } else if (m > 0) {
- if (m == 1) {
- ap << N_("1 ") << _("minute");
+
+ if (minutes | seconds) {
+ ap << N_(" ");
+ }
+ }
+
+ if (minutes) {
+ /* Minutes */
+ if (s > 30 && !seconds) {
+ ap << (m + 1) << N_(" ") << _("minutes");
} else {
- ap << m << N_(" ") << _("minutes");
+ ap << m << N_(" ");
+ if (m == 1) {
+ ap << _("minute");
+ } else {
+ ap << _("minutes");
+ }
+ }
+
+ if (seconds) {
+ ap << N_(" ");
+ }
+ }
+
+ if (seconds) {
+ /* Seconds */
+ ap << s << N_(" ");
+ if (s == 1) {
+ ap << _("second");
+ } else {
+ ap << _("seconds");
}
- } else {
- ap << s << N_(" ") << _("seconds");
}
return ap.str ();
@@ -232,7 +260,7 @@ stacktrace (ostream& out, int levels)
static string
ffmpeg_version_to_string (int v)
{
- stringstream s;
+ SafeStringStream s;
s << ((v & 0xff0000) >> 16) << N_(".") << ((v & 0xff00) >> 8) << N_(".") << (v & 0xff);
return s.str ();
}
@@ -241,7 +269,7 @@ ffmpeg_version_to_string (int v)
string
dependency_version_summary ()
{
- stringstream s;
+ SafeStringStream s;
s << N_("libopenjpeg ") << opj_version () << N_(", ")
<< N_("libavcodec ") << ffmpeg_version_to_string (avcodec_version()) << N_(", ")
<< N_("libavfilter ") << ffmpeg_version_to_string (avfilter_version()) << N_(", ")
@@ -369,35 +397,42 @@ mo_path ()
}
#endif
+#ifdef DCPOMATIC_OSX
+boost::filesystem::path
+mo_path ()
+{
+ return "DCP-o-matic.app/Contents/Resources";
+}
+#endif
+
void
dcpomatic_setup_gettext_i18n (string lang)
{
-#ifdef DCPOMATIC_POSIX
+#ifdef DCPOMATIC_LINUX
lang += ".UTF8";
#endif
if (!lang.empty ()) {
- /* Override our environment language; this is essential on
- Windows.
+ /* Override our environment language. Note that the caller must not
+ free the string passed into putenv().
*/
- char cmd[64];
- snprintf (cmd, sizeof(cmd), "LANGUAGE=%s", lang.c_str ());
- putenv (cmd);
- snprintf (cmd, sizeof(cmd), "LANG=%s", lang.c_str ());
- putenv (cmd);
- snprintf (cmd, sizeof(cmd), "LC_ALL=%s", lang.c_str ());
- putenv (cmd);
+ string s = String::compose ("LANGUAGE=%1", lang);
+ putenv (strdup (s.c_str ()));
+ s = String::compose ("LANG=%1", lang);
+ putenv (strdup (s.c_str ()));
+ s = String::compose ("LC_ALL=%1", lang);
+ putenv (strdup (s.c_str ()));
}
setlocale (LC_ALL, "");
textdomain ("libdcpomatic");
-#ifdef DCPOMATIC_WINDOWS
+#if defined(DCPOMATIC_WINDOWS) || defined(DCPOMATIC_OSX)
bindtextdomain ("libdcpomatic", mo_path().string().c_str());
bind_textdomain_codeset ("libdcpomatic", "UTF8");
#endif
-#ifdef DCPOMATIC_POSIX
+#ifdef DCPOMATIC_LINUX
bindtextdomain ("libdcpomatic", POSIX_LOCALE_PREFIX);
#endif
}
@@ -541,7 +576,7 @@ Socket::accept (int port)
_acceptor->async_accept (_socket, boost::lambda::var(ec) = boost::lambda::_1);
do {
_io_service.run_one ();
- } while (ec == boost::asio::error::would_block );
+ } while (ec == boost::asio::error::would_block);
delete _acceptor;
_acceptor = 0;
diff --git a/src/lib/util.h b/src/lib/util.h
index 70bf495c6..675c8d03e 100644
--- a/src/lib/util.h
+++ b/src/lib/util.h
@@ -44,8 +44,8 @@ extern "C" {
/** The maximum number of audio channels that we can have in a DCP */
#define MAX_DCP_AUDIO_CHANNELS 12
-
#define DCPOMATIC_HELLO "Boys, you gotta learn not to talk to nuns that way"
+#define HISTORY_SIZE 10
namespace libdcp {
class Signer;
diff --git a/src/lib/video_content.cc b/src/lib/video_content.cc
index 676a694da..13f2cf516 100644
--- a/src/lib/video_content.cc
+++ b/src/lib/video_content.cc
@@ -31,6 +31,7 @@
#include "film.h"
#include "exceptions.h"
#include "frame_rate_change.h"
+#include "safe_stringstream.h"
#include "i18n.h"
@@ -42,7 +43,6 @@ int const VideoContentProperty::VIDEO_SCALE = 4;
int const VideoContentProperty::COLOUR_CONVERSION = 5;
using std::string;
-using std::stringstream;
using std::setprecision;
using std::cout;
using std::vector;
@@ -53,14 +53,13 @@ using boost::optional;
using boost::dynamic_pointer_cast;
using libdcp::raw_convert;
-vector<VideoContentScale> VideoContentScale::_scales;
-
VideoContent::VideoContent (shared_ptr<const Film> f)
: Content (f)
, _video_length (0)
+ , _original_video_frame_rate (0)
, _video_frame_rate (0)
, _video_frame_type (VIDEO_FRAME_TYPE_2D)
- , _scale (Ratio::from_id ("185"))
+ , _scale (Config::instance()->default_scale ())
{
setup_default_colour_conversion ();
}
@@ -68,9 +67,10 @@ VideoContent::VideoContent (shared_ptr<const Film> f)
VideoContent::VideoContent (shared_ptr<const Film> f, Time s, VideoContent::Frame len)
: Content (f, s)
, _video_length (len)
+ , _original_video_frame_rate (0)
, _video_frame_rate (0)
, _video_frame_type (VIDEO_FRAME_TYPE_2D)
- , _scale (Ratio::from_id ("185"))
+ , _scale (Config::instance()->default_scale ())
{
setup_default_colour_conversion ();
}
@@ -78,9 +78,10 @@ VideoContent::VideoContent (shared_ptr<const Film> f, Time s, VideoContent::Fram
VideoContent::VideoContent (shared_ptr<const Film> f, boost::filesystem::path p)
: Content (f, p)
, _video_length (0)
+ , _original_video_frame_rate (0)
, _video_frame_rate (0)
, _video_frame_type (VIDEO_FRAME_TYPE_2D)
- , _scale (Ratio::from_id ("185"))
+ , _scale (Config::instance()->default_scale ())
{
setup_default_colour_conversion ();
}
@@ -92,6 +93,7 @@ VideoContent::VideoContent (shared_ptr<const Film> f, shared_ptr<const cxml::Nod
_video_size.width = node->number_child<int> ("VideoWidth");
_video_size.height = node->number_child<int> ("VideoHeight");
_video_frame_rate = node->number_child<float> ("VideoFrameRate");
+ _original_video_frame_rate = node->optional_number_child<float> ("OriginalVideoFrameRate").get_value_or (_video_frame_rate);
_video_frame_type = static_cast<VideoFrameType> (node->number_child<int> ("VideoFrameType"));
_crop.left = node->number_child<int> ("LeftCrop");
_crop.right = node->number_child<int> ("RightCrop");
@@ -148,6 +150,7 @@ VideoContent::VideoContent (shared_ptr<const Film> f, vector<shared_ptr<Content>
}
_video_size = ref->video_size ();
+ _original_video_frame_rate = ref->original_video_frame_rate ();
_video_frame_rate = ref->video_frame_rate ();
_video_frame_type = ref->video_frame_type ();
_crop = ref->crop ();
@@ -163,6 +166,7 @@ VideoContent::as_xml (xmlpp::Node* node) const
node->add_child("VideoWidth")->add_child_text (raw_convert<string> (_video_size.width));
node->add_child("VideoHeight")->add_child_text (raw_convert<string> (_video_size.height));
node->add_child("VideoFrameRate")->add_child_text (raw_convert<string> (_video_frame_rate));
+ node->add_child("OriginalVideoFrameRate")->add_child_text (raw_convert<string> (_original_video_frame_rate));
node->add_child("VideoFrameType")->add_child_text (raw_convert<string> (static_cast<int> (_video_frame_type)));
_crop.as_xml (node);
_scale.as_xml (node->add_child("Scale"));
@@ -186,6 +190,7 @@ VideoContent::take_from_video_examiner (shared_ptr<VideoExaminer> d)
boost::mutex::scoped_lock lm (_mutex);
_video_size = vs;
_video_frame_rate = vfr;
+ _original_video_frame_rate = vfr;
}
signal_changed (VideoContentProperty::VIDEO_SIZE);
@@ -200,7 +205,7 @@ VideoContent::information () const
return "";
}
- stringstream s;
+ SafeStringStream s;
s << String::compose (
_("%1x%2 pixels (%3:1)"),
@@ -292,7 +297,7 @@ VideoContent::set_scale (VideoContentScale s)
string
VideoContent::identifier () const
{
- stringstream s;
+ SafeStringStream s;
s << Content::identifier()
<< "_" << crop().left
<< "_" << crop().right
@@ -420,123 +425,3 @@ VideoContent::set_video_frame_rate (float r)
signal_changed (VideoContentProperty::VIDEO_FRAME_RATE);
}
-VideoContentScale::VideoContentScale (Ratio const * r)
- : _ratio (r)
- , _scale (true)
-{
-
-}
-
-VideoContentScale::VideoContentScale ()
- : _ratio (0)
- , _scale (false)
-{
-
-}
-
-VideoContentScale::VideoContentScale (bool scale)
- : _ratio (0)
- , _scale (scale)
-{
-
-}
-
-VideoContentScale::VideoContentScale (shared_ptr<cxml::Node> node)
- : _ratio (0)
- , _scale (true)
-{
- optional<string> r = node->optional_string_child ("Ratio");
- if (r) {
- _ratio = Ratio::from_id (r.get ());
- } else {
- _scale = node->bool_child ("Scale");
- }
-}
-
-void
-VideoContentScale::as_xml (xmlpp::Node* node) const
-{
- if (_ratio) {
- node->add_child("Ratio")->add_child_text (_ratio->id ());
- } else {
- node->add_child("Scale")->add_child_text (_scale ? "1" : "0");
- }
-}
-
-string
-VideoContentScale::id () const
-{
- stringstream s;
-
- if (_ratio) {
- s << _ratio->id () << "_";
- } else {
- s << (_scale ? "S1" : "S0");
- }
-
- return s.str ();
-}
-
-string
-VideoContentScale::name () const
-{
- if (_ratio) {
- return _ratio->nickname ();
- }
-
- if (_scale) {
- return _("No stretch");
- }
-
- return _("No scale");
-}
-
-/** @param display_container Size of the container that we are displaying this content in.
- * @param film_container The size of the film's image.
- */
-libdcp::Size
-VideoContentScale::size (shared_ptr<const VideoContent> c, libdcp::Size display_container, libdcp::Size film_container) const
-{
- if (_ratio) {
- return fit_ratio_within (_ratio->ratio (), display_container);
- }
-
- libdcp::Size const ac = c->video_size_after_crop ();
-
- /* Force scale if the film_container is smaller than the content's image */
- if (_scale || film_container.width < ac.width || film_container.height < ac.height) {
- return fit_ratio_within (ac.ratio (), display_container);
- }
-
- /* Scale the image so that it will be in the right place in film_container, even if display_container is a
- different size.
- */
- return libdcp::Size (
- c->video_size().width * float(display_container.width) / film_container.width,
- c->video_size().height * float(display_container.height) / film_container.height
- );
-}
-
-void
-VideoContentScale::setup_scales ()
-{
- vector<Ratio const *> ratios = Ratio::all ();
- for (vector<Ratio const *>::const_iterator i = ratios.begin(); i != ratios.end(); ++i) {
- _scales.push_back (VideoContentScale (*i));
- }
-
- _scales.push_back (VideoContentScale (true));
- _scales.push_back (VideoContentScale (false));
-}
-
-bool
-operator== (VideoContentScale const & a, VideoContentScale const & b)
-{
- return (a.ratio() == b.ratio() && a.scale() == b.scale());
-}
-
-bool
-operator!= (VideoContentScale const & a, VideoContentScale const & b)
-{
- return (a.ratio() != b.ratio() || a.scale() != b.scale());
-}
diff --git a/src/lib/video_content.h b/src/lib/video_content.h
index d0b907cb8..3a7b44306 100644
--- a/src/lib/video_content.h
+++ b/src/lib/video_content.h
@@ -22,6 +22,7 @@
#include "content.h"
#include "colour_conversion.h"
+#include "video_content_scale.h"
class VideoExaminer;
class Ratio;
@@ -37,44 +38,6 @@ public:
static int const COLOUR_CONVERSION;
};
-class VideoContentScale
-{
-public:
- VideoContentScale ();
- VideoContentScale (Ratio const *);
- VideoContentScale (bool);
- VideoContentScale (boost::shared_ptr<cxml::Node>);
-
- libdcp::Size size (boost::shared_ptr<const VideoContent>, libdcp::Size, libdcp::Size) const;
- std::string id () const;
- std::string name () const;
- void as_xml (xmlpp::Node *) const;
-
- Ratio const * ratio () const {
- return _ratio;
- }
-
- bool scale () const {
- return _scale;
- }
-
- static void setup_scales ();
- static std::vector<VideoContentScale> all () {
- return _scales;
- }
-
-private:
- /** a ratio to stretch the content to, or 0 for no stretch */
- Ratio const * _ratio;
- /** true if we want to scale the content */
- bool _scale;
-
- static std::vector<VideoContentScale> _scales;
-};
-
-bool operator== (VideoContentScale const & a, VideoContentScale const & b);
-bool operator!= (VideoContentScale const & a, VideoContentScale const & b);
-
class VideoContent : public virtual Content
{
public:
@@ -115,6 +78,11 @@ public:
return _video_frame_rate;
}
+ float original_video_frame_rate () const {
+ boost::mutex::scoped_lock lm (_mutex);
+ return _original_video_frame_rate;
+ }
+
void set_video_frame_type (VideoFrameType);
void set_video_frame_rate (float);
@@ -179,6 +147,7 @@ protected:
void take_from_video_examiner (boost::shared_ptr<VideoExaminer>);
VideoContent::Frame _video_length;
+ float _original_video_frame_rate;
float _video_frame_rate;
private:
diff --git a/src/lib/video_content_scale.cc b/src/lib/video_content_scale.cc
new file mode 100644
index 000000000..e603582b8
--- /dev/null
+++ b/src/lib/video_content_scale.cc
@@ -0,0 +1,171 @@
+/*
+ Copyright (C) 2013-2014 Carl Hetherington <cth@carlh.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <boost/optional.hpp>
+#include <libxml++/libxml++.h>
+#include <libcxml/cxml.h>
+#include "video_content_scale.h"
+#include "ratio.h"
+#include "safe_stringstream.h"
+#include "util.h"
+
+#include "i18n.h"
+
+using std::vector;
+using std::string;
+using boost::shared_ptr;
+using boost::optional;
+
+vector<VideoContentScale> VideoContentScale::_scales;
+
+VideoContentScale::VideoContentScale (Ratio const * r)
+ : _ratio (r)
+ , _scale (true)
+{
+
+}
+
+VideoContentScale::VideoContentScale ()
+ : _ratio (0)
+ , _scale (false)
+{
+
+}
+
+VideoContentScale::VideoContentScale (bool scale)
+ : _ratio (0)
+ , _scale (scale)
+{
+
+}
+
+VideoContentScale::VideoContentScale (shared_ptr<cxml::Node> node)
+ : _ratio (0)
+ , _scale (true)
+{
+ optional<string> r = node->optional_string_child ("Ratio");
+ if (r) {
+ _ratio = Ratio::from_id (r.get ());
+ } else {
+ _scale = node->bool_child ("Scale");
+ }
+}
+
+void
+VideoContentScale::as_xml (xmlpp::Node* node) const
+{
+ if (_ratio) {
+ node->add_child("Ratio")->add_child_text (_ratio->id ());
+ } else {
+ node->add_child("Scale")->add_child_text (_scale ? "1" : "0");
+ }
+}
+
+string
+VideoContentScale::id () const
+{
+ SafeStringStream s;
+
+ if (_ratio) {
+ s << _ratio->id ();
+ } else {
+ s << (_scale ? "S1" : "S0");
+ }
+
+ return s.str ();
+}
+
+string
+VideoContentScale::name () const
+{
+ if (_ratio) {
+ return _ratio->nickname ();
+ }
+
+ if (_scale) {
+ return _("No stretch");
+ }
+
+ return _("No scale");
+}
+
+VideoContentScale
+VideoContentScale::from_id (string id)
+{
+ Ratio const * r = Ratio::from_id (id);
+ if (r) {
+ return VideoContentScale (r);
+ }
+
+ if (id == "S0") {
+ return VideoContentScale (false);
+ }
+
+ return VideoContentScale (true);
+}
+
+/** @param display_container Size of the container that we are displaying this content in.
+ * @param film_container The size of the film's image.
+ */
+libdcp::Size
+VideoContentScale::size (shared_ptr<const VideoContent> c, libdcp::Size display_container, libdcp::Size film_container) const
+{
+ if (_ratio) {
+ return fit_ratio_within (_ratio->ratio (), display_container);
+ }
+
+ libdcp::Size const ac = c->video_size_after_crop ();
+
+ /* Force scale if the film_container is smaller than the content's image */
+ if (_scale || film_container.width < ac.width || film_container.height < ac.height) {
+ return fit_ratio_within (ac.ratio (), display_container);
+ }
+
+ /* Scale the image so that it will be in the right place in film_container, even if display_container is a
+ different size.
+ */
+ return libdcp::Size (
+ c->video_size().width * float(display_container.width) / film_container.width,
+ c->video_size().height * float(display_container.height) / film_container.height
+ );
+}
+
+void
+VideoContentScale::setup_scales ()
+{
+ vector<Ratio const *> ratios = Ratio::all ();
+ for (vector<Ratio const *>::const_iterator i = ratios.begin(); i != ratios.end(); ++i) {
+ _scales.push_back (VideoContentScale (*i));
+ }
+
+ _scales.push_back (VideoContentScale (true));
+ _scales.push_back (VideoContentScale (false));
+}
+
+bool
+operator== (VideoContentScale const & a, VideoContentScale const & b)
+{
+ return (a.ratio() == b.ratio() && a.scale() == b.scale());
+}
+
+bool
+operator!= (VideoContentScale const & a, VideoContentScale const & b)
+{
+ return (a.ratio() != b.ratio() || a.scale() != b.scale());
+}
diff --git a/src/lib/video_content_scale.h b/src/lib/video_content_scale.h
new file mode 100644
index 000000000..87dd2f1fa
--- /dev/null
+++ b/src/lib/video_content_scale.h
@@ -0,0 +1,77 @@
+/*
+ Copyright (C) 2013-2014 Carl Hetherington <cth@carlh.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef DCPOMATIC_VIDEO_CONTENT_SCALE_H
+#define DCPOMATIC_VIDEO_CONTENT_SCALE_H
+
+#include <vector>
+#include <boost/shared_ptr.hpp>
+#include <libdcp/util.h>
+
+namespace cxml {
+ class Node;
+}
+
+namespace xmlpp {
+ class Node;
+}
+
+class Ratio;
+class VideoContent;
+
+class VideoContentScale
+{
+public:
+ VideoContentScale ();
+ VideoContentScale (Ratio const *);
+ VideoContentScale (bool);
+ VideoContentScale (boost::shared_ptr<cxml::Node>);
+
+ libdcp::Size size (boost::shared_ptr<const VideoContent>, libdcp::Size, libdcp::Size) const;
+ std::string id () const;
+ std::string name () const;
+ void as_xml (xmlpp::Node *) const;
+
+ Ratio const * ratio () const {
+ return _ratio;
+ }
+
+ bool scale () const {
+ return _scale;
+ }
+
+ static void setup_scales ();
+ static std::vector<VideoContentScale> all () {
+ return _scales;
+ }
+ static VideoContentScale from_id (std::string id);
+
+private:
+ /** a ratio to stretch the content to, or 0 for no stretch */
+ Ratio const * _ratio;
+ /** true if we want to scale the content */
+ bool _scale;
+
+ static std::vector<VideoContentScale> _scales;
+};
+
+bool operator== (VideoContentScale const & a, VideoContentScale const & b);
+bool operator!= (VideoContentScale const & a, VideoContentScale const & b);
+
+#endif
diff --git a/src/lib/writer.cc b/src/lib/writer.cc
index 66ddb58f7..5af1aea1e 100644
--- a/src/lib/writer.cc
+++ b/src/lib/writer.cc
@@ -38,12 +38,14 @@
#include "job.h"
#include "cross.h"
#include "md5_digester.h"
+#include "version.h"
#include "i18n.h"
#define LOG_GENERAL(...) _film->log()->log (String::compose (__VA_ARGS__), Log::TYPE_GENERAL);
#define LOG_TIMING(...) _film->log()->microsecond_log (String::compose (__VA_ARGS__), Log::TYPE_TIMING);
#define LOG_WARNING_NC(...) _film->log()->log (__VA_ARGS__, Log::TYPE_WARNING);
+#define LOG_ERROR(...) _film->log()->log (String::compose (__VA_ARGS__), Log::TYPE_ERROR);
/* OS X strikes again */
#undef set_key
@@ -53,7 +55,6 @@ using std::pair;
using std::string;
using std::list;
using std::cout;
-using std::stringstream;
using boost::shared_ptr;
using boost::weak_ptr;
@@ -412,9 +413,12 @@ Writer::finish ()
boost::system::error_code ec;
boost::filesystem::create_hard_link (video_from, video_to, ec);
if (ec) {
- /* hard link failed; copy instead */
- boost::filesystem::copy_file (video_from, video_to);
- LOG_WARNING_NC ("Hard-link failed; fell back to copying");
+ LOG_WARNING_NC ("Hard-link failed; copying instead");
+ boost::filesystem::copy_file (video_from, video_to, ec);
+ if (ec) {
+ LOG_ERROR ("Failed to copy video file from %1 to %2 (%3)", video_from.string(), video_to.string(), ec.message ());
+ throw FileError (ec.message(), video_from);
+ }
}
/* And update the asset */
@@ -472,7 +476,9 @@ Writer::finish ()
_sound_asset->compute_digest (boost::bind (&Job::set_progress, job.get(), _1, false));
}
- libdcp::XMLMetadata meta = Config::instance()->dcp_metadata ();
+ libdcp::XMLMetadata meta;
+ meta.issuer = Config::instance()->dcp_issuer ();
+ meta.creator = String::compose ("DCP-o-matic %1 %2", dcpomatic_version, dcpomatic_git_commit);
meta.set_issue_date_now ();
dcp.write_xml (_film->interop (), meta, _film->is_signed() ? make_signer () : shared_ptr<const libdcp::Signer> ());
diff --git a/src/lib/wscript b/src/lib/wscript
index 933368776..6c1da1772 100644
--- a/src/lib/wscript
+++ b/src/lib/wscript
@@ -40,7 +40,6 @@ sources = """
job.cc
job_manager.cc
kdm.cc
- json_server.cc
log.cc
md5_digester.cc
piece.cc
@@ -49,6 +48,7 @@ sources = """
playlist.cc
ratio.cc
resampler.cc
+ safe_stringstream.cc
scp_dcp_job.cc
scaler.cc
send_kdm_email_job.cc
@@ -68,6 +68,7 @@ sources = """
update.cc
util.cc
video_content.cc
+ video_content_scale.cc
video_decoder.cc
writer.cc
"""
@@ -83,8 +84,8 @@ def build(bld):
obj.uselib = """
AVCODEC AVUTIL AVFORMAT AVFILTER SWSCALE SWRESAMPLE
BOOST_FILESYSTEM BOOST_THREAD BOOST_DATETIME BOOST_SIGNALS2
- SNDFILE OPENJPEG POSTPROC TIFF MAGICK SSH DCP CXML GLIB LZMA XML++
- CURL ZIP QUICKMAIL
+ SNDFILE OPENJPEG POSTPROC TIFF MAGICK SSH DCP CXML GLIB LZMA XMLPP
+ CURL ZIP QUICKMAIL XMLSEC
"""
if bld.env.TARGET_OSX:
@@ -96,7 +97,7 @@ def build(bld):
obj.uselib += ' WINSOCK2 BFD DBGHELP IBERTY SHLWAPI MSWSOCK BOOST_LOCALE'
obj.source += ' stack.cpp'
if bld.env.BUILD_STATIC:
- obj.uselib += ' XML++'
+ obj.uselib += ' XMLPP'
obj.target = 'dcpomatic'