summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-04-15 15:00:35 +0100
committerCarl Hetherington <cth@carlh.net>2013-04-15 15:00:35 +0100
commita00ebbc68438e84076c65e99d0e70403afb4407d (patch)
tree6ee2f535eeb6b592c740e117d1f8f8657d6bcce8 /src
parent665bc942f86bd7a8aeb2b38f3e9c2cb6662e6edc (diff)
parent606b3f759238aa6c0d12de064b301bf36b428220 (diff)
Merge master.
Diffstat (limited to 'src')
-rw-r--r--src/lib/ab_transcoder.cc21
-rw-r--r--src/lib/analyse_audio_job.cc3
-rw-r--r--src/lib/audio_decoder.h2
-rw-r--r--src/lib/audio_sink.h7
-rw-r--r--src/lib/audio_source.cc6
-rw-r--r--src/lib/audio_source.h12
-rw-r--r--src/lib/combiner.cc10
-rw-r--r--src/lib/combiner.h8
-rw-r--r--src/lib/config.cc23
-rw-r--r--src/lib/config.h14
-rw-r--r--src/lib/dcp_video_frame.cc4
-rw-r--r--src/lib/dcp_video_frame.h4
-rw-r--r--src/lib/decoder_factory.cc6
-rw-r--r--src/lib/delay_line.cc4
-rw-r--r--src/lib/delay_line.h2
-rw-r--r--src/lib/encoder.cc14
-rw-r--r--src/lib/exceptions.cc63
-rw-r--r--src/lib/exceptions.h29
-rw-r--r--src/lib/film.cc160
-rw-r--r--src/lib/film.h38
-rw-r--r--src/lib/format.cc56
-rw-r--r--src/lib/format.h12
-rw-r--r--src/lib/gain.cc4
-rw-r--r--src/lib/gain.h4
-rw-r--r--src/lib/image.cc32
-rw-r--r--src/lib/imagemagick_decoder.h4
-rw-r--r--src/lib/job.cc30
-rw-r--r--src/lib/job.h14
-rw-r--r--src/lib/matcher.cc4
-rw-r--r--src/lib/matcher.h8
-rw-r--r--src/lib/po/es_ES.po626
-rw-r--r--src/lib/po/fr_FR.po626
-rw-r--r--src/lib/po/it_IT.po628
-rw-r--r--src/lib/po/sv_SE.po623
-rw-r--r--src/lib/processor.h46
-rw-r--r--src/lib/server.cc2
-rw-r--r--src/lib/server.h4
-rw-r--r--src/lib/sndfile_decoder.cc (renamed from src/lib/external_audio_decoder.cc)40
-rw-r--r--src/lib/sndfile_decoder.h (renamed from src/lib/external_audio_decoder.h)18
-rw-r--r--src/lib/stream.cc4
-rw-r--r--src/lib/transcode_job.cc3
-rw-r--r--src/lib/transcoder.cc10
-rw-r--r--src/lib/util.cc62
-rw-r--r--src/lib/util.h5
-rw-r--r--src/lib/video_decoder.h2
-rw-r--r--src/lib/video_sink.h12
-rw-r--r--src/lib/video_source.cc6
-rw-r--r--src/lib/video_source.h23
-rw-r--r--src/lib/writer.cc30
-rw-r--r--src/lib/wscript9
-rw-r--r--src/tools/dvdomatic.cc67
-rw-r--r--src/tools/po/es_ES.po128
-rw-r--r--src/tools/po/fr_FR.po125
-rw-r--r--src/tools/po/it_IT.po124
-rw-r--r--src/tools/po/sv_SE.po127
-rw-r--r--src/tools/servomatic_cli.cc9
-rw-r--r--src/tools/servomatic_gui.cc37
-rw-r--r--src/tools/servomatictest.cc6
-rw-r--r--src/tools/wscript3
-rw-r--r--src/wscript5
-rw-r--r--src/wx/audio_dialog.cc8
-rw-r--r--src/wx/audio_dialog.h2
-rw-r--r--src/wx/config_dialog.cc76
-rw-r--r--src/wx/config_dialog.h7
-rw-r--r--src/wx/film_editor.cc270
-rw-r--r--src/wx/film_editor.h10
-rw-r--r--src/wx/film_viewer.cc40
-rw-r--r--src/wx/film_viewer.h5
-rw-r--r--src/wx/gain_calculator_dialog.cc2
-rw-r--r--src/wx/job_manager_view.cc29
-rw-r--r--src/wx/job_manager_view.h2
-rw-r--r--src/wx/job_wrapper.cc4
-rw-r--r--src/wx/po/es_ES.po508
-rw-r--r--src/wx/po/fr_FR.po507
-rw-r--r--src/wx/po/it_IT.po508
-rw-r--r--src/wx/po/sv_SE.po508
-rw-r--r--src/wx/properties_dialog.cc4
-rw-r--r--src/wx/wscript3
78 files changed, 6041 insertions, 460 deletions
diff --git a/src/lib/ab_transcoder.cc b/src/lib/ab_transcoder.cc
index 3af32f988..7db13afcc 100644
--- a/src/lib/ab_transcoder.cc
+++ b/src/lib/ab_transcoder.cc
@@ -40,6 +40,7 @@
using std::string;
using boost::shared_ptr;
+using boost::dynamic_pointer_cast;
/** @param a Film to use for the left half of the screen.
* @param b Film to use for the right half of the screen.
@@ -54,6 +55,7 @@ ABTranscoder::ABTranscoder (
, _film_b (b)
, _job (j)
, _encoder (e)
+ , _combiner (new Combiner (a->log()))
{
_da = decoder_factory (_film_a, o);
_db = decoder_factory (_film_b, o);
@@ -68,8 +70,8 @@ ABTranscoder::ABTranscoder (
_db.video->set_subtitle_stream (_film_a->subtitle_stream ());
_da.audio->set_audio_stream (_film_a->audio_stream ());
- _da.video->Video.connect (bind (&Combiner::process_video, _combiner, _1, _2, _3, _4));
- _db.video->Video.connect (bind (&Combiner::process_video_b, _combiner, _1, _2, _3, _4));
+ _da.video->Video.connect (bind (&Combiner::process_video, _combiner, _1, _2, _3));
+ _db.video->Video.connect (bind (&Combiner::process_video_b, _combiner, _1, _2, _3));
_combiner->connect_video (_delay_line);
_delay_line->connect_video (_matcher);
@@ -85,17 +87,24 @@ void
ABTranscoder::go ()
{
_encoder->process_begin ();
+
+ bool done[3] = { false, false, false };
while (1) {
- bool const va = _da.video->pass ();
- bool const vb = _db.video->pass ();
- bool const a = _da.audio->pass ();
+ done[0] = _da.video->pass ();
+ done[1] = _db.video->pass ();
+
+ if (!done[2] && _da.audio && dynamic_pointer_cast<Decoder> (_da.audio) != dynamic_pointer_cast<Decoder> (_da.video)) {
+ done[2] = _da.audio->pass ();
+ } else {
+ done[2] = true;
+ }
if (_job) {
_da.video->set_progress (_job);
}
- if (va && vb && a) {
+ if (done[0] && done[1] && done[2]) {
break;
}
}
diff --git a/src/lib/analyse_audio_job.cc b/src/lib/analyse_audio_job.cc
index 41f918f34..43eecbcbd 100644
--- a/src/lib/analyse_audio_job.cc
+++ b/src/lib/analyse_audio_job.cc
@@ -29,6 +29,7 @@
using std::string;
using std::max;
+using std::min;
using std::cout;
using boost::shared_ptr;
@@ -67,7 +68,7 @@ AnalyseAudioJob::run ()
decoders.audio->Audio.connect (bind (&AnalyseAudioJob::audio, this, _1));
int64_t total_audio_frames = video_frames_to_audio_frames (_film->length().get(), _film->audio_stream()->sample_rate(), _film->source_frame_rate());
- _samples_per_point = total_audio_frames / _num_points;
+ _samples_per_point = max (int64_t (1), total_audio_frames / _num_points);
_current.resize (_film->audio_stream()->channels ());
_analysis.reset (new AudioAnalysis (_film->audio_stream()->channels()));
diff --git a/src/lib/audio_decoder.h b/src/lib/audio_decoder.h
index cfe94b528..9bef8e0e7 100644
--- a/src/lib/audio_decoder.h
+++ b/src/lib/audio_decoder.h
@@ -31,7 +31,7 @@
/** @class AudioDecoder.
* @brief Parent class for audio decoders.
*/
-class AudioDecoder : public TimedAudioSource, public virtual Decoder
+class AudioDecoder : public AudioSource, public virtual Decoder
{
public:
AudioDecoder (boost::shared_ptr<Film>, DecodeOptions);
diff --git a/src/lib/audio_sink.h b/src/lib/audio_sink.h
index a222bd6a0..11d578a60 100644
--- a/src/lib/audio_sink.h
+++ b/src/lib/audio_sink.h
@@ -27,11 +27,4 @@ public:
virtual void process_audio (boost::shared_ptr<AudioBuffers>) = 0;
};
-class TimedAudioSink
-{
-public:
- /** Call with some audio data */
- virtual void process_audio (boost::shared_ptr<AudioBuffers>, double t) = 0;
-};
-
#endif
diff --git a/src/lib/audio_source.cc b/src/lib/audio_source.cc
index bca3562cf..53b0dda15 100644
--- a/src/lib/audio_source.cc
+++ b/src/lib/audio_source.cc
@@ -28,9 +28,3 @@ AudioSource::connect_audio (shared_ptr<AudioSink> s)
{
Audio.connect (bind (&AudioSink::process_audio, s, _1));
}
-
-void
-TimedAudioSource::connect_audio (shared_ptr<TimedAudioSink> s)
-{
- Audio.connect (bind (&TimedAudioSink::process_audio, s, _1, _2));
-}
diff --git a/src/lib/audio_source.h b/src/lib/audio_source.h
index 3dc998cca..5a1510d3c 100644
--- a/src/lib/audio_source.h
+++ b/src/lib/audio_source.h
@@ -28,7 +28,6 @@
class AudioBuffers;
class AudioSink;
-class TimedAudioSink;
/** A class that emits audio data */
class AudioSource
@@ -40,15 +39,4 @@ public:
void connect_audio (boost::shared_ptr<AudioSink>);
};
-
-/** A class that emits audio data with timestamps */
-class TimedAudioSource
-{
-public:
- /** Emitted when some audio data is ready */
- boost::signals2::signal<void (boost::shared_ptr<AudioBuffers>, double)> Audio;
-
- void connect_audio (boost::shared_ptr<TimedAudioSink>);
-};
-
#endif
diff --git a/src/lib/combiner.cc b/src/lib/combiner.cc
index e628f3a84..12ce4a96e 100644
--- a/src/lib/combiner.cc
+++ b/src/lib/combiner.cc
@@ -22,8 +22,8 @@
using boost::shared_ptr;
-Combiner::Combiner (Log* log)
- : Processor (log)
+Combiner::Combiner (shared_ptr<Log> log)
+ : VideoProcessor (log)
{
}
@@ -33,7 +33,7 @@ Combiner::Combiner (Log* log)
* @param image Frame image.
*/
void
-Combiner::process_video (shared_ptr<Image> image, bool, shared_ptr<Subtitle>, double)
+Combiner::process_video (shared_ptr<Image> image, bool, shared_ptr<Subtitle>)
{
_image = image;
}
@@ -43,7 +43,7 @@ Combiner::process_video (shared_ptr<Image> image, bool, shared_ptr<Subtitle>, do
* @param sub Subtitle (which will be put onto the whole frame)
*/
void
-Combiner::process_video_b (shared_ptr<Image> image, bool, shared_ptr<Subtitle> sub, double t)
+Combiner::process_video_b (shared_ptr<Image> image, bool, shared_ptr<Subtitle> sub)
{
/* Copy the right half of this image into our _image */
/* XXX: this should probably be in the Image class */
@@ -62,6 +62,6 @@ Combiner::process_video_b (shared_ptr<Image> image, bool, shared_ptr<Subtitle> s
}
}
- Video (_image, false, sub, t);
+ Video (_image, false, sub);
_image.reset ();
}
diff --git a/src/lib/combiner.h b/src/lib/combiner.h
index c52c53ed9..68026eaff 100644
--- a/src/lib/combiner.h
+++ b/src/lib/combiner.h
@@ -28,13 +28,13 @@
* one image used for the left half of the screen and the other for
* the right.
*/
-class Combiner : public Processor, public TimedVideoSink, public TimedVideoSource
+class Combiner : public VideoProcessor
{
public:
- Combiner (Log* log);
+ Combiner (boost::shared_ptr<Log> log);
- void process_video (boost::shared_ptr<Image> i, bool, boost::shared_ptr<Subtitle> s, double t);
- void process_video_b (boost::shared_ptr<Image> i, bool, boost::shared_ptr<Subtitle> s, double t);
+ void process_video (boost::shared_ptr<Image> i, bool, boost::shared_ptr<Subtitle> s);
+ void process_video_b (boost::shared_ptr<Image> i, bool, boost::shared_ptr<Subtitle> s);
private:
/** The image that we are currently working on */
diff --git a/src/lib/config.cc b/src/lib/config.cc
index f5273b875..5dce3748d 100644
--- a/src/lib/config.cc
+++ b/src/lib/config.cc
@@ -94,6 +94,8 @@ Config::Config ()
_tms_password = v;
} else if (k == N_("sound_processor")) {
_sound_processor = SoundProcessor::from_id (v);
+ } else if (k == "language") {
+ _language = v;
}
_default_dci_metadata.read (k, v);
@@ -128,8 +130,11 @@ Config::write () const
ofstream f (file().c_str ());
f << N_("num_local_encoding_threads ") << _num_local_encoding_threads << N_("\n")
<< N_("default_directory ") << _default_directory << N_("\n")
- << N_("server_port ") << _server_port << N_("\n")
- << N_("reference_scaler ") << _reference_scaler->id () << N_("\n");
+ << N_("server_port ") << _server_port << N_("\n");
+
+ if (_reference_scaler) {
+ f << "reference_scaler " << _reference_scaler->id () << "\n";
+ }
for (vector<Filter const *>::const_iterator i = _reference_filters.begin(); i != _reference_filters.end(); ++i) {
f << N_("reference_filter ") << (*i)->id () << N_("\n");
@@ -143,7 +148,12 @@ Config::write () const
f << N_("tms_path ") << _tms_path << N_("\n");
f << N_("tms_user ") << _tms_user << N_("\n");
f << N_("tms_password ") << _tms_password << N_("\n");
- f << N_("sound_processor ") << _sound_processor->id () << N_("\n");
+ if (_sound_processor) {
+ f << "sound_processor " << _sound_processor->id () << "\n";
+ }
+ if (_language) {
+ f << "language " << _language.get() << "\n";
+ }
_default_dci_metadata.write (f);
}
@@ -157,3 +167,10 @@ Config::default_directory_or (string a) const
return _default_directory;
}
+
+void
+Config::drop ()
+{
+ delete _instance;
+ _instance = 0;
+}
diff --git a/src/lib/config.h b/src/lib/config.h
index fed297ad0..011ca716f 100644
--- a/src/lib/config.h
+++ b/src/lib/config.h
@@ -103,6 +103,10 @@ public:
return _default_dci_metadata;
}
+ boost::optional<std::string> language () const {
+ return _language;
+ }
+
/** @param n New number of local encoding threads */
void set_num_local_encoding_threads (int n) {
_num_local_encoding_threads = n;
@@ -157,10 +161,19 @@ public:
void set_default_dci_metadata (DCIMetadata d) {
_default_dci_metadata = d;
}
+
+ void set_language (std::string l) {
+ _language = l;
+ }
+
+ void unset_language () {
+ _language = boost::none;
+ }
void write () const;
static Config* instance ();
+ static void drop ();
private:
Config ();
@@ -192,6 +205,7 @@ private:
std::list<int> _allowed_dcp_frame_rates;
/** Default DCI metadata for newly-created Films */
DCIMetadata _default_dci_metadata;
+ boost::optional<std::string> _language;
/** Singleton instance, or 0 */
static Config* _instance;
diff --git a/src/lib/dcp_video_frame.cc b/src/lib/dcp_video_frame.cc
index 67617c63c..d674393a9 100644
--- a/src/lib/dcp_video_frame.cc
+++ b/src/lib/dcp_video_frame.cc
@@ -70,7 +70,7 @@ using libdcp::Size;
* @param out Required size of output, in pixels (including any padding).
* @param s Scaler to use.
* @param p Number of pixels of padding either side of the image.
- * @param f Index of the frame within the DCP's intrinsic duration.
+ * @param f Index of the frame within the DCP.
* @param fps Frames per second of the Film's source.
* @param pp FFmpeg post-processing string to use.
* @param clut Colour look-up table to use (see Config::colour_lut_index ())
@@ -80,7 +80,7 @@ using libdcp::Size;
DCPVideoFrame::DCPVideoFrame (
shared_ptr<const Image> yuv, shared_ptr<Subtitle> sub,
Size out, int p, int subtitle_offset, float subtitle_scale,
- Scaler const * s, int f, int dcp_fps, string pp, int clut, int bw, Log* l
+ Scaler const * s, int f, int dcp_fps, string pp, int clut, int bw, shared_ptr<Log> l
)
: _input (yuv)
, _subtitle (sub)
diff --git a/src/lib/dcp_video_frame.h b/src/lib/dcp_video_frame.h
index 6794765ac..4ceb07d26 100644
--- a/src/lib/dcp_video_frame.h
+++ b/src/lib/dcp_video_frame.h
@@ -107,7 +107,7 @@ class DCPVideoFrame
public:
DCPVideoFrame (
boost::shared_ptr<const Image>, boost::shared_ptr<Subtitle>, libdcp::Size,
- int, int, float, Scaler const *, int, int, std::string, int, int, Log *
+ int, int, float, Scaler const *, int, int, std::string, int, int, boost::shared_ptr<Log>
);
virtual ~DCPVideoFrame ();
@@ -135,7 +135,7 @@ private:
int _colour_lut; ///< Colour look-up table to use
int _j2k_bandwidth; ///< J2K bandwidth to use
- Log* _log; ///< log
+ boost::shared_ptr<Log> _log; ///< log
opj_image_cmptparm_t _cmptparm[3]; ///< libopenjpeg's opj_image_cmptparm_t
opj_image* _image; ///< libopenjpeg's image container
diff --git a/src/lib/decoder_factory.cc b/src/lib/decoder_factory.cc
index 478ccd1c1..f7f9f4074 100644
--- a/src/lib/decoder_factory.cc
+++ b/src/lib/decoder_factory.cc
@@ -25,7 +25,7 @@
#include "ffmpeg_decoder.h"
#include "imagemagick_decoder.h"
#include "film.h"
-#include "external_audio_decoder.h"
+#include "sndfile_decoder.h"
#include "decoder_factory.h"
using std::string;
@@ -47,7 +47,7 @@ decoder_factory (
/* A single image file, or a directory of them */
return Decoders (
shared_ptr<VideoDecoder> (new ImageMagickDecoder (f, o)),
- shared_ptr<AudioDecoder> (new ExternalAudioDecoder (f, o))
+ shared_ptr<AudioDecoder> (new SndfileDecoder (f, o))
);
}
@@ -56,5 +56,5 @@ decoder_factory (
return Decoders (fd, fd);
}
- return Decoders (fd, shared_ptr<AudioDecoder> (new ExternalAudioDecoder (f, o)));
+ return Decoders (fd, shared_ptr<AudioDecoder> (new SndfileDecoder (f, o)));
}
diff --git a/src/lib/delay_line.cc b/src/lib/delay_line.cc
index 924a1f082..c8e593a18 100644
--- a/src/lib/delay_line.cc
+++ b/src/lib/delay_line.cc
@@ -29,7 +29,7 @@ using boost::shared_ptr;
/* @param seconds Delay in seconds, +ve to move audio later.
*/
-DelayLine::DelayLine (Log* log, double seconds)
+DelayLine::DelayLine (shared_ptr<Log> log, double seconds)
: Processor (log)
, _seconds (seconds)
{
@@ -37,7 +37,7 @@ DelayLine::DelayLine (Log* log, double seconds)
}
void
-DelayLine::process_audio (shared_ptr<AudioBuffers> data, double t)
+DelayLine::process_audio (shared_ptr<AudioBuffers> data)
{
if (_seconds > 0) {
t += _seconds;
diff --git a/src/lib/delay_line.h b/src/lib/delay_line.h
index a52fb981c..7a8b11c69 100644
--- a/src/lib/delay_line.h
+++ b/src/lib/delay_line.h
@@ -24,7 +24,7 @@
class DelayLine : public Processor, public TimedAudioSink, public TimedAudioSource, public TimedVideoSink, public TimedVideoSource
{
public:
- DelayLine (Log* log, double);
+ DelayLine (boost::shared_ptr<Log> log, double);
void process_video (boost::shared_ptr<Image>, bool, boost::shared_ptr<Subtitle>, double);
void process_audio (boost::shared_ptr<AudioBuffers>, double);
diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc
index 687dfdd2b..7b338407e 100644
--- a/src/lib/encoder.cc
+++ b/src/lib/encoder.cc
@@ -244,9 +244,9 @@ Encoder::process_video (shared_ptr<Image> image, bool same, boost::shared_ptr<Su
/* Wait until the queue has gone down a bit */
while (_queue.size() >= _threads.size() * 2 && !_terminate) {
- TIMING (_("decoder sleeps with queue of %1"), _queue.size());
+ TIMING ("decoder sleeps with queue of %1", _queue.size());
_condition.wait (lock);
- TIMING (_("decoder wakes with queue of %1"), _queue.size());
+ TIMING ("decoder wakes with queue of %1", _queue.size());
}
if (_terminate) {
@@ -268,7 +268,7 @@ Encoder::process_video (shared_ptr<Image> image, bool same, boost::shared_ptr<Su
} else {
/* Queue this new frame for encoding */
pair<string, string> const s = Filter::ffmpeg_strings (_film->filters());
- TIMING (_("adding to queue of %1"), _queue.size ());
+ TIMING ("adding to queue of %1", _queue.size ());
_queue.push_back (boost::shared_ptr<DCPVideoFrame> (
new DCPVideoFrame (
image, sub, _film->format()->dcp_size(), _film->format()->dcp_padding (_film),
@@ -349,7 +349,7 @@ Encoder::encoder_thread (ServerDescription* server)
while (1) {
- TIMING (N_("encoder thread %1 sleeps"), boost::this_thread::get_id());
+ TIMING ("encoder thread %1 sleeps", boost::this_thread::get_id());
boost::mutex::scoped_lock lock (_mutex);
while (_queue.empty () && !_terminate) {
_condition.wait (lock);
@@ -359,7 +359,7 @@ Encoder::encoder_thread (ServerDescription* server)
return;
}
- TIMING (N_("encoder thread %1 wakes with queue of %2"), boost::this_thread::get_id(), _queue.size());
+ TIMING ("encoder thread %1 wakes with queue of %2", boost::this_thread::get_id(), _queue.size());
boost::shared_ptr<DCPVideoFrame> vf = _queue.front ();
_film->log()->log (String::compose (N_("Encoder thread %1 pops frame %2 from queue"), boost::this_thread::get_id(), vf->frame()), Log::VERBOSE);
_queue.pop_front ();
@@ -393,9 +393,9 @@ Encoder::encoder_thread (ServerDescription* server)
} else {
try {
- TIMING (N_("encoder thread %1 begins local encode of %2"), boost::this_thread::get_id(), vf->frame());
+ TIMING ("encoder thread %1 begins local encode of %2", boost::this_thread::get_id(), vf->frame());
encoded = vf->encode_locally ();
- TIMING (N_("encoder thread %1 finishes local encode of %2"), boost::this_thread::get_id(), vf->frame());
+ TIMING ("encoder thread %1 finishes local encode of %2", boost::this_thread::get_id(), vf->frame());
} catch (std::exception& e) {
_film->log()->log (String::compose (N_("Local encode failed (%1)"), e.what ()));
}
diff --git a/src/lib/exceptions.cc b/src/lib/exceptions.cc
new file mode 100644
index 000000000..bc6ac27c8
--- /dev/null
+++ b/src/lib/exceptions.cc
@@ -0,0 +1,63 @@
+/*
+ Copyright (C) 2012-2013 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 "exceptions.h"
+#include "compose.hpp"
+
+#include "i18n.h"
+
+using std::string;
+
+/** @param f File that we were trying to open */
+OpenFileError::OpenFileError (string f)
+ : FileError (String::compose (_("could not open file %1"), f), f)
+{
+
+}
+
+/** @param f File that we were trying to create */
+CreateFileError::CreateFileError (string f)
+ : FileError (String::compose (_("could not create file %1"), f), f)
+{
+
+}
+
+ReadFileError::ReadFileError (string f, int e)
+ : FileError ("", f)
+{
+ _what = String::compose (_("could not read from file %1 (%2)"), f, strerror (e));
+}
+
+WriteFileError::WriteFileError (std::string f, int e)
+ : FileError ("", f)
+{
+ _what = String::compose (_("could not write to file %1 (%2)"), f, strerror (e));
+}
+
+MissingSettingError::MissingSettingError (string s)
+ : SettingError (s, String::compose (_("missing required setting %1"), s))
+{
+
+}
+
+PixelFormatError::PixelFormatError (std::string o, AVPixelFormat f)
+ : StringError (String::compose (_("Cannot handle pixel format %1 during %2"), f, o))
+{
+
+}
diff --git a/src/lib/exceptions.h b/src/lib/exceptions.h
index 277355117..e45a62353 100644
--- a/src/lib/exceptions.h
+++ b/src/lib/exceptions.h
@@ -31,7 +31,6 @@
extern "C" {
#include <libavutil/pixfmt.h>
}
-#include "compose.hpp"
/** @class StringError
* @brief A parent class for exceptions using messages held in a std::string
@@ -113,9 +112,7 @@ class OpenFileError : public FileError
{
public:
/** @param f File that we were trying to open */
- OpenFileError (std::string f)
- : FileError ("could not open file " + f, f)
- {}
+ OpenFileError (std::string f);
};
/** @class CreateFileError.
@@ -125,9 +122,7 @@ class CreateFileError : public FileError
{
public:
/** @param f File that we were trying to create */
- CreateFileError (std::string f)
- : FileError ("could not create file " + f, f)
- {}
+ CreateFileError (std::string f);
};
@@ -140,11 +135,7 @@ public:
/** @param f File that we were trying to read from.
* @param e errno value, or 0.
*/
- ReadFileError (std::string f, int e = 0)
- : FileError ("", f)
- {
- _what = String::compose ("could not read from file %1 (%2)", f, strerror (e));
- }
+ ReadFileError (std::string f, int e = 0);
};
/** @class WriteFileError.
@@ -156,11 +147,7 @@ public:
/** @param f File that we were trying to write to.
* @param e errno value, or 0.
*/
- WriteFileError (std::string f, int e)
- : FileError ("", f)
- {
- _what = String::compose ("could not write to file %1 (%2)", f, strerror (e));
- }
+ WriteFileError (std::string f, int e);
};
/** @class SettingError.
@@ -195,9 +182,7 @@ class MissingSettingError : public SettingError
{
public:
/** @param s Name of setting that was required */
- MissingSettingError (std::string s)
- : SettingError (s, "missing required setting " + s)
- {}
+ MissingSettingError (std::string s);
};
/** @class BadSettingError
@@ -226,9 +211,7 @@ public:
class PixelFormatError : public StringError
{
public:
- PixelFormatError (std::string o, AVPixelFormat f)
- : StringError (String::compose ("Cannot handle pixel format %1 during %2", f, o))
- {}
+ PixelFormatError (std::string o, AVPixelFormat f);
};
class ExceptionStore
diff --git a/src/lib/film.cc b/src/lib/film.cc
index 8f545952b..a42b874e8 100644
--- a/src/lib/film.cc
+++ b/src/lib/film.cc
@@ -50,7 +50,7 @@
#include "ui_signaller.h"
#include "video_decoder.h"
#include "audio_decoder.h"
-#include "external_audio_decoder.h"
+#include "sndfile_decoder.h"
#include "analyse_audio_job.h"
#include "i18n.h"
@@ -93,6 +93,7 @@ Film::Film (string d, bool must_exist)
, _scaler (Scaler::from_id ("bicubic"))
, _trim_start (0)
, _trim_end (0)
+ , _trim_type (CPL)
, _dcp_ab (false)
, _use_content_audio (true)
, _audio_gain (0)
@@ -138,18 +139,19 @@ Film::Film (string d, bool must_exist)
}
}
- _external_audio_stream = ExternalAudioStream::create ();
+ _sndfile_stream = SndfileStream::create ();
if (must_exist) {
read_metadata ();
}
- _log = new FileLog (file ("log"));
+ _log.reset (new FileLog (file ("log")));
}
Film::Film (Film const & o)
: boost::enable_shared_from_this<Film> (o)
- , _log (0)
+ /* note: the copied film shares the original's log */
+ , _log (o._log)
, _directory (o._directory)
, _name (o._name)
, _use_dci_name (o._use_dci_name)
@@ -162,6 +164,7 @@ Film::Film (Film const & o)
, _scaler (o._scaler)
, _trim_start (o._trim_start)
, _trim_end (o._trim_end)
+ , _trim_type (o._trim_type)
, _dcp_ab (o._dcp_ab)
, _content_audio_stream (o._content_audio_stream)
, _external_audio (o._external_audio)
@@ -180,20 +183,19 @@ Film::Film (Film const & o)
, _dcp_frame_rate (o._dcp_frame_rate)
, _size (o._size)
, _length (o._length)
- , _dcp_intrinsic_duration (o._dcp_intrinsic_duration)
, _content_digest (o._content_digest)
, _content_audio_streams (o._content_audio_streams)
- , _external_audio_stream (o._external_audio_stream)
+ , _sndfile_stream (o._sndfile_stream)
, _subtitle_streams (o._subtitle_streams)
, _source_frame_rate (o._source_frame_rate)
, _dirty (o._dirty)
{
-
+
}
Film::~Film ()
{
- delete _log;
+
}
string
@@ -232,19 +234,47 @@ Film::info_dir () const
}
string
-Film::video_mxf_dir () const
+Film::internal_video_mxf_dir () const
{
boost::filesystem::path p;
return dir ("video");
}
string
-Film::video_mxf_filename () const
+Film::internal_video_mxf_filename () const
{
return video_state_identifier() + ".mxf";
}
string
+Film::dcp_video_mxf_filename () const
+{
+ return filename_safe_name() + "_video.mxf";
+}
+
+string
+Film::dcp_audio_mxf_filename () const
+{
+ return filename_safe_name() + "_audio.mxf";
+}
+
+string
+Film::filename_safe_name () const
+{
+ string const n = name ();
+ string o;
+ for (size_t i = 0; i < n.length(); ++i) {
+ if (isalnum (n[i])) {
+ o += n[i];
+ } else {
+ o += "_";
+ }
+ }
+
+ return o;
+}
+
+string
Film::audio_analysis_path () const
{
boost::filesystem::path p;
@@ -350,9 +380,12 @@ void
Film::analyse_audio_finished ()
{
ensure_ui_thread ();
- _analyse_audio_job.reset ();
- AudioAnalysisFinished ();
+ if (_analyse_audio_job->finished_ok ()) {
+ AudioAnalysisSucceeded ();
+ }
+
+ _analyse_audio_job.reset ();
}
void
@@ -425,6 +458,14 @@ Film::write_metadata () const
f << "scaler " << _scaler->id () << endl;
f << "trim_start " << _trim_start << endl;
f << "trim_end " << _trim_end << endl;
+ switch (_trim_type) {
+ case CPL:
+ f << "trim_type cpl\n";
+ break;
+ case ENCODE:
+ f << "trim_type encode\n";
+ break;
+ }
f << "dcp_ab " << (_dcp_ab ? "1" : "0") << endl;
if (_content_audio_stream) {
f << "selected_content_audio_stream " << _content_audio_stream->to_string() << endl;
@@ -450,14 +491,13 @@ Film::write_metadata () const
f << "width " << _size.width << endl;
f << "height " << _size.height << endl;
f << "length " << _length.get_value_or(0) << endl;
- f << "dcp_intrinsic_duration " << _dcp_intrinsic_duration.get_value_or(0) << endl;
f << "content_digest " << _content_digest << endl;
for (vector<shared_ptr<AudioStream> >::const_iterator i = _content_audio_streams.begin(); i != _content_audio_streams.end(); ++i) {
f << "content_audio_stream " << (*i)->to_string () << endl;
}
- f << "external_audio_stream " << _external_audio_stream->to_string() << endl;
+ f << "external_audio_stream " << _sndfile_stream->to_string() << endl;
for (vector<shared_ptr<SubtitleStream> >::const_iterator i = _subtitle_streams.begin(); i != _subtitle_streams.end(); ++i) {
f << "subtitle_stream " << (*i)->to_string () << endl;
@@ -539,6 +579,12 @@ Film::read_metadata ()
_trim_start = atoi (v.c_str ());
} else if ( ((!version || version < 2) && k == "dcp_trim_end") || k == "trim_end") {
_trim_end = atoi (v.c_str ());
+ } else if (k == "trim_type") {
+ if (v == "cpl") {
+ _trim_type = CPL;
+ } else if (v == "encode") {
+ _trim_type = ENCODE;
+ }
} else if (k == "dcp_ab") {
_dcp_ab = (v == "1");
} else if (k == "selected_content_audio_stream" || (!version && k == "selected_audio_stream")) {
@@ -591,17 +637,12 @@ Film::read_metadata ()
if (vv) {
_length = vv;
}
- } else if (k == "dcp_intrinsic_duration") {
- int const vv = atoi (v.c_str ());
- if (vv) {
- _dcp_intrinsic_duration = vv;
- }
} else if (k == "content_digest") {
_content_digest = v;
} else if (k == "content_audio_stream" || (!version && k == "audio_stream")) {
_content_audio_streams.push_back (audio_stream_factory (v, version));
} else if (k == "external_audio_stream") {
- _external_audio_stream = audio_stream_factory (v, version);
+ _sndfile_stream = audio_stream_factory (v, version);
} else if (k == "subtitle_stream") {
_subtitle_streams.push_back (subtitle_stream_factory (v, version));
} else if (k == "source_frame_rate") {
@@ -758,70 +799,67 @@ Film::dci_name (bool if_created_now) const
fixed_name = fixed_name.substr (0, 14);
}
- d << fixed_name << "_";
+ d << fixed_name;
if (dcp_content_type()) {
- d << dcp_content_type()->dci_name() << "_";
+ d << "_" << dcp_content_type()->dci_name();
}
if (format()) {
- d << format()->dci_name() << "_";
+ d << "_" << format()->dci_name();
}
DCIMetadata const dm = dci_metadata ();
if (!dm.audio_language.empty ()) {
- d << dm.audio_language;
- if (!dm.subtitle_language.empty() && with_subtitles()) {
+ d << "_" << dm.audio_language;
+ if (!dm.subtitle_language.empty()) {
d << "-" << dm.subtitle_language;
} else {
d << "-XX";
}
-
- d << "_";
}
if (!dm.territory.empty ()) {
- d << dm.territory;
+ d << "_" << dm.territory;
if (!dm.rating.empty ()) {
d << "-" << dm.rating;
}
- d << "_";
}
switch (audio_channels()) {
case 1:
- d << "10_";
+ d << "_10";
break;
case 2:
- d << "20_";
+ d << "_20";
break;
case 6:
- d << "51_";
+ d << "_51";
break;
case 8:
- d << "71_";
+ d << "_71";
break;
}
- d << "2K_";
+ d << "_2K";
if (!dm.studio.empty ()) {
- d << dm.studio << "_";
+ d << "_" << dm.studio;
}
if (if_created_now) {
- d << boost::gregorian::to_iso_string (boost::gregorian::day_clock::local_day ()) << "_";
+ d << "_" << boost::gregorian::to_iso_string (boost::gregorian::day_clock::local_day ());
} else {
- d << boost::gregorian::to_iso_string (_dci_date) << "_";
+ d << "_" << boost::gregorian::to_iso_string (_dci_date);
}
if (!dm.facility.empty ()) {
- d << dm.facility << "_";
+ d << "_" << dm.facility;
}
if (!dm.package_type.empty ()) {
- d << dm.package_type;
+ d << "_" << dm.package_type;
}
return d.str ();
@@ -1103,6 +1141,16 @@ Film::set_trim_end (int t)
}
void
+Film::set_trim_type (TrimType t)
+{
+ {
+ boost::mutex::scoped_lock lm (_state_mutex);
+ _trim_type = t;
+ }
+ signal_changed (TRIM_TYPE);
+}
+
+void
Film::set_dcp_ab (bool a)
{
{
@@ -1130,9 +1178,9 @@ Film::set_external_audio (vector<string> a)
_external_audio = a;
}
- shared_ptr<ExternalAudioDecoder> decoder (new ExternalAudioDecoder (shared_from_this(), DecodeOptions()));
+ shared_ptr<SndfileDecoder> decoder (new SndfileDecoder (shared_from_this(), DecodeOptions()));
if (decoder->audio_stream()) {
- _external_audio_stream = decoder->audio_stream ();
+ _sndfile_stream = decoder->audio_stream ();
}
signal_changed (EXTERNAL_AUDIO);
@@ -1291,16 +1339,6 @@ Film::unset_length ()
}
void
-Film::set_dcp_intrinsic_duration (int d)
-{
- {
- boost::mutex::scoped_lock lm (_state_mutex);
- _dcp_intrinsic_duration = d;
- }
- signal_changed (DCP_INTRINSIC_DURATION);
-}
-
-void
Film::set_content_digest (string d)
{
{
@@ -1377,7 +1415,7 @@ Film::audio_stream () const
return _content_audio_stream;
}
- return _external_audio_stream;
+ return _sndfile_stream;
}
string
@@ -1434,3 +1472,21 @@ Film::have_dcp () const
return true;
}
+
+bool
+Film::has_audio () const
+{
+ if (use_content_audio()) {
+ return audio_stream();
+ }
+
+ vector<string> const e = external_audio ();
+ for (vector<string>::const_iterator i = e.begin(); i != e.end(); ++i) {
+ if (!i->empty ()) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
diff --git a/src/lib/film.h b/src/lib/film.h
index 9921acbb4..dd0a83d94 100644
--- a/src/lib/film.h
+++ b/src/lib/film.h
@@ -64,10 +64,13 @@ public:
std::string info_dir () const;
std::string j2c_path (int f, bool t) const;
std::string info_path (int f) const;
- std::string video_mxf_dir () const;
- std::string video_mxf_filename () const;
+ std::string internal_video_mxf_dir () const;
+ std::string internal_video_mxf_filename () const;
std::string audio_analysis_path () const;
+ std::string dcp_video_mxf_filename () const;
+ std::string dcp_audio_mxf_filename () const;
+
void examine_content ();
void analyse_audio ();
void send_dcp_to_tms ();
@@ -77,7 +80,7 @@ public:
/** @return Logger.
* It is safe to call this from any thread.
*/
- Log* log () const {
+ boost::shared_ptr<Log> log () const {
return _log;
}
@@ -98,10 +101,6 @@ public:
std::string dci_name (bool if_created_now) const;
std::string dcp_name (bool if_created_now = false) const;
- boost::optional<int> dcp_intrinsic_duration () const {
- return _dcp_intrinsic_duration;
- }
-
/** @return true if our state has changed since we last saved it */
bool dirty () const {
return _dirty;
@@ -113,6 +112,11 @@ public:
bool have_dcp () const;
+ enum TrimType {
+ CPL,
+ ENCODE
+ };
+
/** Identifiers for the parts of our state;
used for signalling changes.
*/
@@ -129,6 +133,7 @@ public:
SCALER,
TRIM_START,
TRIM_END,
+ TRIM_TYPE,
DCP_AB,
CONTENT_AUDIO_STREAM,
EXTERNAL_AUDIO,
@@ -145,7 +150,6 @@ public:
DCI_METADATA,
SIZE,
LENGTH,
- DCP_INTRINSIC_DURATION,
CONTENT_AUDIO_STREAMS,
SUBTITLE_STREAMS,
SOURCE_FRAME_RATE,
@@ -215,6 +219,11 @@ public:
return _trim_end;
}
+ TrimType trim_type () const {
+ boost::mutex::scoped_lock lm (_state_mutex);
+ return _trim_type;
+ }
+
bool dcp_ab () const {
boost::mutex::scoped_lock lm (_state_mutex);
return _dcp_ab;
@@ -327,7 +336,7 @@ public:
}
boost::shared_ptr<AudioStream> audio_stream () const;
-
+ bool has_audio () const;
/* SET */
@@ -347,6 +356,7 @@ public:
void set_scaler (Scaler const *);
void set_trim_start (int);
void set_trim_end (int);
+ void set_trim_type (TrimType);
void set_dcp_ab (bool);
void set_content_audio_stream (boost::shared_ptr<AudioStream>);
void set_external_audio (std::vector<std::string>);
@@ -365,7 +375,6 @@ public:
void set_size (libdcp::Size);
void set_length (SourceFrame);
void unset_length ();
- void set_dcp_intrinsic_duration (int);
void set_content_digest (std::string);
void set_content_audio_streams (std::vector<boost::shared_ptr<AudioStream> >);
void set_subtitle_streams (std::vector<boost::shared_ptr<SubtitleStream> >);
@@ -374,7 +383,7 @@ public:
/** Emitted when some property has changed */
mutable boost::signals2::signal<void (Property)> Changed;
- boost::signals2::signal<void ()> AudioAnalysisFinished;
+ boost::signals2::signal<void ()> AudioAnalysisSucceeded;
/** Current version number of the state file */
static int const state_version;
@@ -382,7 +391,7 @@ public:
private:
/** Log to write to */
- Log* _log;
+ boost::shared_ptr<Log> _log;
/** Any running ExamineContentJob, or 0 */
boost::shared_ptr<ExamineContentJob> _examine_content_job;
@@ -393,6 +402,7 @@ private:
void examine_content_finished ();
void analyse_audio_finished ();
std::string video_state_identifier () const;
+ std::string filename_safe_name () const;
/** Complete path to directory containing the film metadata;
* must not be relative.
@@ -428,6 +438,7 @@ private:
int _trim_start;
/** Frames to trim off the end of the DCP */
int _trim_end;
+ TrimType _trim_type;
/** true to create an A/B comparison DCP, where the left half of the image
is the video without any filters or post-processing, and the right half
has the specified filters and post-processing.
@@ -477,13 +488,12 @@ private:
libdcp::Size _size;
/** The length of the source, in video frames (as far as we know) */
boost::optional<SourceFrame> _length;
- boost::optional<int> _dcp_intrinsic_duration;
/** MD5 digest of our content file */
std::string _content_digest;
/** The audio streams in our content */
std::vector<boost::shared_ptr<AudioStream> > _content_audio_streams;
/** A stream to represent possible external audio (will always exist) */
- boost::shared_ptr<AudioStream> _external_audio_stream;
+ boost::shared_ptr<AudioStream> _sndfile_stream;
/** the subtitle streams that we can use */
std::vector<boost::shared_ptr<SubtitleStream> > _subtitle_streams;
/** Frames per second of the source */
diff --git a/src/lib/format.cc b/src/lib/format.cc
index b506c7000..faadcd797 100644
--- a/src/lib/format.cc
+++ b/src/lib/format.cc
@@ -72,68 +72,59 @@ Format::setup_formats ()
{
/// TRANSLATORS: these are film picture aspect ratios; "Academy" means 1.37, "Flat" 1.85 and "Scope" 2.39.
_formats.push_back (
- new FixedFormat (119, libdcp::Size (1285, 1080), N_("119"), _("1.19"), N_("F"),
- _("Source scaled to 1.19:1")
+ new FixedFormat (119, libdcp::Size (1285, 1080), N_("119"), _("1.19"), N_("F")
));
_formats.push_back (
- new FixedFormat (133, libdcp::Size (1436, 1080), N_("133"), _("1.33"), N_("F"),
- _("Source scaled to 1.33:1")
+ new FixedFormat (133, libdcp::Size (1436, 1080), N_("133"), _("1.33"), N_("F")
));
_formats.push_back (
- new FixedFormat (138, libdcp::Size (1485, 1080), N_("138"), _("1.375"), N_("F"),
- _("Source scaled to 1.375:1")
+ new FixedFormat (138, libdcp::Size (1485, 1080), N_("138"), _("1.375"), N_("F")
));
_formats.push_back (
- new FixedFormat (133, libdcp::Size (1998, 1080), N_("133-in-flat"), _("4:3 within Flat"), N_("F"),
- _("Source scaled to 1.33:1 then pillarboxed to Flat")
+ new FixedFormat (133, libdcp::Size (1998, 1080), N_("133-in-flat"), _("4:3 within Flat"), N_("F")
));
_formats.push_back (
- new FixedFormat (137, libdcp::Size (1480, 1080), N_("137"), _("Academy"), N_("F"),
- _("Source scaled to 1.37:1 (Academy ratio)")
+ new FixedFormat (137, libdcp::Size (1480, 1080), N_("137"), _("Academy"), N_("F")
));
_formats.push_back (
- new FixedFormat (166, libdcp::Size (1793, 1080), N_("166"), _("1.66"), N_("F"),
- _("Source scaled to 1.66:1")
+ new FixedFormat (166, libdcp::Size (1793, 1080), N_("166"), _("1.66"), N_("F")
));
_formats.push_back (
- new FixedFormat (166, libdcp::Size (1998, 1080), N_("166-in-flat"), _("1.66 within Flat"), N_("F"),
- _("Source scaled to 1.66:1 then pillarboxed to Flat")
+ new FixedFormat (166, libdcp::Size (1998, 1080), N_("166-in-flat"), _("1.66 within Flat"), N_("F")
));
_formats.push_back (
- new FixedFormat (178, libdcp::Size (1998, 1080), N_("178-in-flat"), _("16:9 within Flat"), N_("F"),
- _("Source scaled to 1.78:1 then pillarboxed to Flat")
+ new FixedFormat (178, libdcp::Size (1998, 1080), N_("178-in-flat"), _("16:9 within Flat"), N_("F")
));
_formats.push_back (
- new FixedFormat (178, libdcp::Size (1920, 1080), N_("178"), _("16:9"), N_("F"),
- _("Source scaled to 1.78:1")
+ new FixedFormat (178, libdcp::Size (1920, 1080), N_("178"), _("16:9"), N_("F")
));
_formats.push_back (
- new FixedFormat (185, libdcp::Size (1998, 1080), N_("185"), _("Flat"), N_("F"),
- _("Source scaled to Flat (1.85:1)")
+ new FixedFormat (185, libdcp::Size (1998, 1080), N_("185"), _("Flat"), N_("F")
));
_formats.push_back (
- new FixedFormat (239, libdcp::Size (2048, 858), N_("239"), _("Scope"), N_("S"),
- _("Source scaled to Scope (2.39:1)")
+ new FixedFormat (178, libdcp::Size (2048, 858), N_("178-in-scope"), _("16:9 within Scope"), N_("S")
+ ));
+
+ _formats.push_back (
+ new FixedFormat (239, libdcp::Size (2048, 858), N_("239"), _("Scope"), N_("S")
));
_formats.push_back (
- new VariableFormat (libdcp::Size (1998, 1080), N_("var-185"), _("Flat without stretch"), N_("F"),
- _("Source scaled to fit Flat preserving its aspect ratio")
+ new VariableFormat (libdcp::Size (1998, 1080), N_("var-185"), _("Flat without stretch"), N_("F")
));
_formats.push_back (
- new VariableFormat (libdcp::Size (2048, 858), N_("var-239"), _("Scope without stretch"), N_("S"),
- _("Source scaled to fit Scope preserving its aspect ratio")
+ new VariableFormat (libdcp::Size (2048, 858), N_("var-239"), _("Scope without stretch"), N_("S")
));
}
@@ -195,8 +186,8 @@ Format::all ()
* @param id ID (e.g. 185)
* @param n Nick name (e.g. Flat)
*/
-FixedFormat::FixedFormat (int r, libdcp::Size dcp, string id, string n, string d, string e)
- : Format (dcp, id, n, d, e)
+FixedFormat::FixedFormat (int r, libdcp::Size dcp, string id, string n, string d)
+ : Format (dcp, id, n, d)
, _ratio (r)
{
@@ -208,7 +199,7 @@ FixedFormat::FixedFormat (int r, libdcp::Size dcp, string id, string n, string d
int
Format::dcp_padding (shared_ptr<const Film> f) const
{
- int p = rint ((_dcp_size.width - (_dcp_size.height * ratio_as_integer(f) / 100.0)) / 2.0);
+ int p = rint ((_dcp_size.width - (_dcp_size.height * ratio_as_float(f))) / 2.0);
/* This comes out -ve for Scope; bodge it */
if (p < 0) {
@@ -224,8 +215,8 @@ Format::container_ratio_as_float () const
return static_cast<float> (_dcp_size.width) / _dcp_size.height;
}
-VariableFormat::VariableFormat (libdcp::Size dcp, string id, string n, string d, string e)
- : Format (dcp, id, n, d, e)
+VariableFormat::VariableFormat (libdcp::Size dcp, string id, string n, string d)
+ : Format (dcp, id, n, d)
{
}
@@ -239,7 +230,8 @@ VariableFormat::ratio_as_integer (shared_ptr<const Film> f) const
float
VariableFormat::ratio_as_float (shared_ptr<const Film> f) const
{
- return float (f->size().width) / f->size().height;
+ libdcp::Size const c = f->cropped_size (f->size ());
+ return float (c.width) / c.height;
}
/** @return A name to be presented to the user */
diff --git a/src/lib/format.h b/src/lib/format.h
index 305524628..783ff25ce 100644
--- a/src/lib/format.h
+++ b/src/lib/format.h
@@ -31,12 +31,11 @@ class Film;
class Format
{
public:
- Format (libdcp::Size dcp, std::string id, std::string n, std::string d, std::string e)
+ Format (libdcp::Size dcp, std::string id, std::string n, std::string d)
: _dcp_size (dcp)
, _id (id)
, _nickname (n)
, _dci_name (d)
- , _description (e)
{}
/** @return the aspect ratio multiplied by 100
@@ -76,10 +75,6 @@ public:
return _dci_name;
}
- std::string description () const {
- return _description;
- }
-
std::string as_metadata () const;
static Format const * from_nickname (std::string n);
@@ -99,7 +94,6 @@ protected:
/** nickname (e.g. Flat, Scope) */
std::string _nickname;
std::string _dci_name;
- std::string _description;
private:
/** all available formats */
@@ -113,7 +107,7 @@ private:
class FixedFormat : public Format
{
public:
- FixedFormat (int, libdcp::Size, std::string, std::string, std::string, std::string);
+ FixedFormat (int, libdcp::Size, std::string, std::string, std::string);
int ratio_as_integer (boost::shared_ptr<const Film>) const {
return _ratio;
@@ -134,7 +128,7 @@ private:
class VariableFormat : public Format
{
public:
- VariableFormat (libdcp::Size, std::string, std::string, std::string, std::string);
+ VariableFormat (libdcp::Size, std::string, std::string, std::string);
int ratio_as_integer (boost::shared_ptr<const Film> f) const;
float ratio_as_float (boost::shared_ptr<const Film> f) const;
diff --git a/src/lib/gain.cc b/src/lib/gain.cc
index 35ce27cea..df7011d2e 100644
--- a/src/lib/gain.cc
+++ b/src/lib/gain.cc
@@ -22,8 +22,8 @@
using boost::shared_ptr;
/** @param gain gain in dB */
-Gain::Gain (Log* log, float gain)
- : Processor (log)
+Gain::Gain (shared_ptr<Log> log, float gain)
+ : AudioProcessor (log)
, _gain (gain)
{
diff --git a/src/lib/gain.h b/src/lib/gain.h
index 449473582..d462e5aee 100644
--- a/src/lib/gain.h
+++ b/src/lib/gain.h
@@ -19,10 +19,10 @@
#include "processor.h"
-class Gain : public Processor, public AudioSink, public AudioSource
+class Gain : public AudioProcessor
{
public:
- Gain (Log* log, float gain);
+ Gain (boost::shared_ptr<Log> log, float gain);
void process_audio (boost::shared_ptr<AudioBuffers>);
diff --git a/src/lib/image.cc b/src/lib/image.cc
index 268c08173..2355d22e5 100644
--- a/src/lib/image.cc
+++ b/src/lib/image.cc
@@ -75,6 +75,7 @@ Image::lines (int n) const
case PIX_FMT_YUV444P9LE:
case PIX_FMT_YUV444P10BE:
case PIX_FMT_YUV444P10LE:
+ case PIX_FMT_UYVY422:
return size().height;
default:
throw PixelFormatError (N_("lines()"), _pixel_format);
@@ -99,6 +100,7 @@ Image::components () const
return 3;
case PIX_FMT_RGB24:
case PIX_FMT_RGBA:
+ case PIX_FMT_UYVY422:
return 1;
default:
throw PixelFormatError (N_("components()"), _pixel_format);
@@ -211,6 +213,7 @@ Image::post_process (string pp, bool aligned) const
break;
case PIX_FMT_YUV422P10LE:
case PIX_FMT_YUV422P:
+ case PIX_FMT_UYVY422:
pp_format = PP_FORMAT_422;
break;
case PIX_FMT_YUV444P:
@@ -291,6 +294,9 @@ Image::swap_16 (uint16_t v)
void
Image::make_black ()
{
+ /* U/V black value for 8-bit colour */
+ static uint8_t const eight_bit_uv = (1 << 7) - 1;
+
/* U/V black value for 9-bit colour */
static uint16_t const nine_bit_uv = (1 << 8) - 1;
@@ -302,8 +308,8 @@ Image::make_black ()
case PIX_FMT_YUV422P:
case PIX_FMT_YUV444P:
memset (data()[0], 0, lines(0) * stride()[0]);
- memset (data()[1], 0x7f, lines(1) * stride()[1]);
- memset (data()[2], 0x7f, lines(2) * stride()[2]);
+ memset (data()[1], eight_bit_uv, lines(1) * stride()[1]);
+ memset (data()[2], eight_bit_uv, lines(2) * stride()[2]);
break;
case PIX_FMT_YUV422P9LE:
@@ -329,8 +335,24 @@ Image::make_black ()
memset (data()[0], 0, lines(0) * stride()[0]);
break;
+ case PIX_FMT_UYVY422:
+ {
+ int const Y = lines(0);
+ int const X = line_size()[0];
+ uint8_t* p = data()[0];
+ for (int y = 0; y < Y; ++y) {
+ for (int x = 0; x < X / 4; ++x) {
+ *p++ = eight_bit_uv; // Cb
+ *p++ = 0; // Y0
+ *p++ = eight_bit_uv; // Cr
+ *p++ = 0; // Y1
+ }
+ }
+ break;
+ }
+
default:
- assert (false);
+ throw PixelFormatError (N_("make_black()"), _pixel_format);
}
}
@@ -428,6 +450,8 @@ Image::bytes_per_pixel (int c) const
} else {
return 1;
}
+ case PIX_FMT_UYVY422:
+ return 2;
case PIX_FMT_YUV444P:
return 3;
case PIX_FMT_YUV444P9BE:
@@ -436,7 +460,7 @@ Image::bytes_per_pixel (int c) const
case PIX_FMT_YUV444P10BE:
return 6;
default:
- assert (false);
+ throw PixelFormatError (N_("bytes_per_pixel()"), _pixel_format);
}
return 0;
diff --git a/src/lib/imagemagick_decoder.h b/src/lib/imagemagick_decoder.h
index ca8e819d3..80a08f81f 100644
--- a/src/lib/imagemagick_decoder.h
+++ b/src/lib/imagemagick_decoder.h
@@ -49,10 +49,6 @@ public:
return 0;
}
- bool has_subtitles () const {
- return false;
- }
-
bool seek (double);
bool seek_to_last ();
diff --git a/src/lib/job.cc b/src/lib/job.cc
index 78a7a7577..1c66d87d3 100644
--- a/src/lib/job.cc
+++ b/src/lib/job.cc
@@ -38,6 +38,7 @@ using boost::shared_ptr;
*/
Job::Job (shared_ptr<Film> f)
: _film (f)
+ , _thread (0)
, _state (NEW)
, _start_time (0)
, _progress_unknown (false)
@@ -52,7 +53,7 @@ Job::start ()
{
set_state (RUNNING);
_start_time = time (0);
- boost::thread (boost::bind (&Job::run_wrapper, this));
+ _thread = new boost::thread (boost::bind (&Job::run_wrapper, this));
}
/** A wrapper for the ::run() method to catch exceptions */
@@ -81,6 +82,10 @@ Job::run_wrapper ()
}
set_error (e.what(), m);
+
+ } catch (boost::thread_interrupted &) {
+
+ set_state (FINISHED_CANCELLED);
} catch (std::exception& e) {
@@ -124,7 +129,7 @@ bool
Job::finished () const
{
boost::mutex::scoped_lock lm (_state_mutex);
- return _state == FINISHED_OK || _state == FINISHED_ERROR;
+ return _state == FINISHED_OK || _state == FINISHED_ERROR || _state == FINISHED_CANCELLED;
}
/** @return true if the job has finished successfully */
@@ -143,6 +148,13 @@ Job::finished_in_error () const
return _state == FINISHED_ERROR;
}
+bool
+Job::finished_cancelled () const
+{
+ boost::mutex::scoped_lock lm (_state_mutex);
+ return _state == FINISHED_CANCELLED;
+}
+
/** Set the state of this job.
* @param s New state.
*/
@@ -177,6 +189,7 @@ Job::set_progress (float p)
boost::mutex::scoped_lock lm (_progress_mutex);
_progress_unknown = false;
_stack.back().normalised = p;
+ boost::this_thread::interruption_point ();
}
/** @return fractional overall progress, or -1 if not known */
@@ -289,6 +302,8 @@ Job::status () const
s << String::compose (_("OK (ran for %1)"), seconds_to_hms (_ran_for));
} else if (finished_in_error ()) {
s << String::compose (_("Error (%1)"), error_summary());
+ } else if (finished_cancelled ()) {
+ s << _("Cancelled");
}
return s.str ();
@@ -300,3 +315,14 @@ Job::remaining_time () const
{
return elapsed_time() / overall_progress() - elapsed_time();
}
+
+void
+Job::cancel ()
+{
+ if (!_thread) {
+ return;
+ }
+
+ _thread->interrupt ();
+ _thread->join ();
+}
diff --git a/src/lib/job.h b/src/lib/job.h
index c98dbaea1..fd036bce2 100644
--- a/src/lib/job.h
+++ b/src/lib/job.h
@@ -28,6 +28,7 @@
#include <boost/thread/mutex.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/signals2.hpp>
+#include <boost/thread.hpp>
class Film;
@@ -46,12 +47,14 @@ public:
virtual void run () = 0;
void start ();
+ void cancel ();
bool is_new () const;
bool running () const;
bool finished () const;
bool finished_ok () const;
bool finished_in_error () const;
+ bool finished_cancelled () const;
std::string error_summary () const;
std::string error_details () const;
@@ -74,10 +77,11 @@ protected:
/** Description of a job's state */
enum State {
- NEW, ///< the job hasn't been started yet
- RUNNING, ///< the job is running
- FINISHED_OK, ///< the job has finished successfully
- FINISHED_ERROR ///< the job has finished in error
+ NEW, ///< the job hasn't been started yet
+ RUNNING, ///< the job is running
+ FINISHED_OK, ///< the job has finished successfully
+ FINISHED_ERROR, ///< the job has finished in error
+ FINISHED_CANCELLED ///< the job was cancelled
};
void set_state (State);
@@ -90,6 +94,8 @@ private:
void run_wrapper ();
+ boost::thread* _thread;
+
/** mutex for _state and _error */
mutable boost::mutex _state_mutex;
/** current state of the job */
diff --git a/src/lib/matcher.cc b/src/lib/matcher.cc
index a74eeabbb..69d12e2c4 100644
--- a/src/lib/matcher.cc
+++ b/src/lib/matcher.cc
@@ -28,8 +28,8 @@ using std::cout;
using std::list;
using boost::shared_ptr;
-Matcher::Matcher (Log* log, int sample_rate, float frames_per_second)
- : Processor (log)
+Matcher::Matcher (shared_ptr<Log> log, int sample_rate, float frames_per_second)
+ : AudioVideoProcessor (log)
, _sample_rate (sample_rate)
, _frames_per_second (frames_per_second)
, _video_frames (0)
diff --git a/src/lib/matcher.h b/src/lib/matcher.h
index a7054f540..4ec0a3e96 100644
--- a/src/lib/matcher.h
+++ b/src/lib/matcher.h
@@ -21,12 +21,12 @@
#include "processor.h"
#include "ffmpeg_compatibility.h"
-class Matcher : public Processor, public TimedVideoSink, public TimedAudioSink, public VideoSource, public AudioSource
+class Matcher : public AudioVideoProcessor
{
public:
- Matcher (Log* log, int sample_rate, float frames_per_second);
- void process_video (boost::shared_ptr<Image> i, bool, boost::shared_ptr<Subtitle> s, double t);
- void process_audio (boost::shared_ptr<AudioBuffers>, double t);
+ Matcher (boost::shared_ptr<Log> log, int sample_rate, float frames_per_second);
+ void process_video (boost::shared_ptr<Image> i, bool, boost::shared_ptr<Subtitle> s);
+ void process_audio (boost::shared_ptr<AudioBuffers>);
void process_end ();
private:
diff --git a/src/lib/po/es_ES.po b/src/lib/po/es_ES.po
new file mode 100644
index 000000000..17051bd98
--- /dev/null
+++ b/src/lib/po/es_ES.po
@@ -0,0 +1,626 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: LIBDVDOMATIC\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-04-09 11:14+0100\n"
+"PO-Revision-Date: 2013-04-02 19:10-0500\n"
+"Last-Translator: Manuel AC <manuel.acevedo@civantos.>\n"
+"Language-Team: Manuel AC <manuel.acevedo@civantos.com>\n"
+"Language: es-ES\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.5\n"
+
+#: src/lib/transcode_job.cc:87
+msgid "0%"
+msgstr "0%"
+
+#: src/lib/format.cc:75
+msgid "1.19"
+msgstr "1.19"
+
+#: src/lib/format.cc:79
+msgid "1.33"
+msgstr "1.33"
+
+#: src/lib/format.cc:83
+msgid "1.375"
+msgstr "1.375"
+
+#: src/lib/format.cc:95
+msgid "1.66"
+msgstr "1.66"
+
+#: src/lib/format.cc:99
+msgid "1.66 within Flat"
+msgstr "1.66 en Flat"
+
+#: src/lib/format.cc:107
+msgid "16:9"
+msgstr "16:9"
+
+#: src/lib/format.cc:103
+msgid "16:9 within Flat"
+msgstr "16:9 en Flat"
+
+#: src/lib/format.cc:115
+#, fuzzy
+msgid "16:9 within Scope"
+msgstr "16:9 en Flat"
+
+#: src/lib/filter.cc:88
+msgid "3D denoiser"
+msgstr "reducción de ruido 3D"
+
+#: src/lib/format.cc:87
+msgid "4:3 within Flat"
+msgstr "4:3 en Flat"
+
+#: src/lib/ab_transcode_job.cc:49
+msgid "A/B transcode %1"
+msgstr "Codificación A/B %1"
+
+#: src/lib/format.cc:91
+msgid "Academy"
+msgstr "Academy"
+
+#: src/lib/dcp_content_type.cc:53
+msgid "Advertisement"
+msgstr "Publicidad"
+
+#: src/lib/job.cc:72
+msgid "An error occurred whilst handling the file %1."
+msgstr "Ha ocurrido un error con el fichero %1."
+
+#: src/lib/analyse_audio_job.cc:49
+msgid "Analyse audio of %1"
+msgstr "Analizar audio de %1"
+
+#: src/lib/scaler.cc:64
+msgid "Area"
+msgstr "Área"
+
+#: src/lib/scaler.cc:62
+msgid "Bicubic"
+msgstr "Bicúbico"
+
+#: src/lib/scaler.cc:69
+msgid "Bilinear"
+msgstr "Bilineal"
+
+#: src/lib/job.cc:302
+msgid "Cancelled"
+msgstr ""
+
+#: src/lib/exceptions.cc:60
+msgid "Cannot handle pixel format %1 during %2"
+msgstr ""
+
+#: src/lib/encoder.cc:101
+msgid "Cannot resample audio as libswresample is not present"
+msgstr ""
+"No se puede redimensionar el sonido porque no se encuentra libswresample"
+
+#: src/lib/util.cc:932
+msgid "Centre"
+msgstr ""
+
+#: src/lib/scp_dcp_job.cc:109
+msgid "Copy DCP to TMS"
+msgstr "Copiar DCP al TMS"
+
+#: src/lib/scp_dcp_job.cc:128
+msgid "Could not connect to server %1 (%2)"
+msgstr "No se pudo conectar al servidor %1 (%2)"
+
+#: src/lib/scp_dcp_job.cc:150
+msgid "Could not create remote directory %1 (%2)"
+msgstr "No se pudo crear la carpeta remota %1 (%2)"
+
+#: src/lib/scp_dcp_job.cc:175
+msgid "Could not open %1 to send"
+msgstr "No se pudo abrir %1 para enviar"
+
+#: src/lib/scp_dcp_job.cc:145
+msgid "Could not start SCP session (%1)"
+msgstr "No se pudo iniciar la sesión SCP (%1)"
+
+#: src/lib/scp_dcp_job.cc:187
+msgid "Could not write to remote file (%1)"
+msgstr "No se pudo escribir el fichero remoto (%1)"
+
+#: src/lib/filter.cc:77
+msgid "Cubic interpolating deinterlacer"
+msgstr "Desentrelazado por interpolación cúbica"
+
+#: src/lib/util.cc:1007
+msgid "DCP and source have the same rate.\n"
+msgstr "La fuente y el DCP tienen la misma velocidad.\n"
+
+#: src/lib/util.cc:1017
+#, fuzzy
+msgid "DCP will run at %1%% of the source speed.\n"
+msgstr "El DCP se reproducirá al %1%% de la velocidad de la fuente.\n"
+
+#: src/lib/util.cc:1010
+msgid "DCP will use every other frame of the source.\n"
+msgstr "El DCP usará fotogramas alternos de la fuente.\n"
+
+#: src/lib/filter.cc:68 src/lib/filter.cc:69 src/lib/filter.cc:70
+#: src/lib/filter.cc:71 src/lib/filter.cc:72 src/lib/filter.cc:73
+msgid "De-blocking"
+msgstr "De-blocking"
+
+#: src/lib/filter.cc:75 src/lib/filter.cc:76 src/lib/filter.cc:77
+#: src/lib/filter.cc:78 src/lib/filter.cc:79 src/lib/filter.cc:80
+#: src/lib/filter.cc:81 src/lib/filter.cc:82 src/lib/filter.cc:83
+msgid "De-interlacing"
+msgstr "Desentrelazado"
+
+#: src/lib/filter.cc:74
+msgid "Deringing filter"
+msgstr "Deringing filter"
+
+#: src/lib/dolby_cp750.cc:27
+msgid "Dolby CP750"
+msgstr "Dolby CP750"
+
+#: src/lib/util.cc:1012
+msgid "Each source frame will be doubled in the DCP.\n"
+msgstr "Se doblará cada fotograma de la fuente en el DCP.\n"
+
+#: src/lib/job.cc:300
+msgid "Error (%1)"
+msgstr "Error (%1)"
+
+#: src/lib/examine_content_job.cc:55
+msgid "Examine content"
+msgstr "Examinar contenido"
+
+#: src/lib/examine_content_job.cc:58
+msgid "Examine content of %1"
+msgstr "Examinar contenido de %1"
+
+#: src/lib/filter.cc:72
+msgid "Experimental horizontal deblocking filter 1"
+msgstr "Experimental horizontal deblocking filter 1"
+
+#: src/lib/filter.cc:73
+msgid "Experimental vertical deblocking filter 1"
+msgstr "Experimental vertical deblocking filter 1"
+
+#: src/lib/filter.cc:79
+msgid "FFMPEG deinterlacer"
+msgstr "Desentrelazado FFMPEG"
+
+#: src/lib/filter.cc:80
+msgid "FIR low-pass deinterlacer"
+msgstr "Desentrelazado paso bajo FIR"
+
+#: src/lib/scp_dcp_job.cc:138
+msgid "Failed to authenticate with server (%1)"
+msgstr "Fallo al identificarse con el servidor (%1)"
+
+#: src/lib/scaler.cc:70
+msgid "Fast Bilinear"
+msgstr "Bilineal rápido"
+
+#: src/lib/dcp_content_type.cc:44
+msgid "Feature"
+msgstr "Película"
+
+#: src/lib/format.cc:111
+msgid "Flat"
+msgstr "Flat"
+
+#: src/lib/format.cc:123
+msgid "Flat without stretch"
+msgstr "Flat sin deformación"
+
+#: src/lib/filter.cc:85
+msgid "Force quantizer"
+msgstr "Force quantizer"
+
+#: src/lib/scaler.cc:65
+msgid "Gaussian"
+msgstr "Gaussiano"
+
+#: src/lib/filter.cc:86
+msgid "Gradient debander"
+msgstr "Gradient debander"
+
+#: src/lib/filter.cc:89
+msgid "High quality 3D denoiser"
+msgstr "Reductor de ruido 3D de alta calidad"
+
+#: src/lib/filter.cc:68
+msgid "Horizontal deblocking filter"
+msgstr "Horizontal deblocking filter"
+
+#: src/lib/filter.cc:70
+msgid "Horizontal deblocking filter A"
+msgstr "Horizontal deblocking filter A"
+
+#: src/lib/job.cc:92 src/lib/job.cc:101
+msgid ""
+"It is not known what caused this error. The best idea is to report the "
+"problem to the DVD-o-matic mailing list (dvdomatic@carlh.net)"
+msgstr ""
+"Error desconocido. La mejor idea es informar del problema a la lista de "
+"correo de DVD-O-matic (dvdomatic@carlh.net)"
+
+#: src/lib/filter.cc:82
+msgid "Kernel deinterlacer"
+msgstr "Kernel deinterlacer"
+
+#: src/lib/scaler.cc:66
+msgid "Lanczos"
+msgstr "Lanczos"
+
+#: src/lib/util.cc:930
+msgid "Left"
+msgstr ""
+
+#: src/lib/util.cc:934
+msgid "Left surround"
+msgstr ""
+
+#: src/lib/util.cc:933
+msgid "Lfe (sub)"
+msgstr ""
+
+#: src/lib/filter.cc:75
+msgid "Linear blend deinterlacer"
+msgstr "Linear blend deinterlacer"
+
+#: src/lib/filter.cc:76
+msgid "Linear interpolating deinterlacer"
+msgstr "Linear interpolating deinterlacer"
+
+#: src/lib/filter.cc:78
+msgid "Median deinterlacer"
+msgstr "Median deinterlacer"
+
+#: src/lib/filter.cc:74 src/lib/filter.cc:85 src/lib/filter.cc:86
+#: src/lib/filter.cc:87 src/lib/filter.cc:90
+msgid "Misc"
+msgstr "Miscelánea"
+
+#: src/lib/filter.cc:81
+msgid "Motion compensating deinterlacer"
+msgstr "Motion compensating deinterlacer"
+
+#: src/lib/filter.cc:84 src/lib/filter.cc:88 src/lib/filter.cc:89
+#: src/lib/filter.cc:91
+msgid "Noise reduction"
+msgstr "Reducción de ruido"
+
+#: src/lib/job.cc:298
+msgid "OK (ran for %1)"
+msgstr "OK (ejecución %1)"
+
+#: src/lib/filter.cc:91
+msgid "Overcomplete wavelet denoiser"
+msgstr "Overcomplete wavelet denoiser"
+
+#: src/lib/dcp_content_type.cc:51
+msgid "Policy"
+msgstr "Policy"
+
+#: src/lib/dcp_content_type.cc:52
+msgid "Public Service Announcement"
+msgstr "Anuncio de servicio público"
+
+#: src/lib/dcp_content_type.cc:49
+msgid "Rating"
+msgstr "Clasificación"
+
+#: src/lib/util.cc:500
+msgid "Rec 709"
+msgstr "Rec 709"
+
+#: src/lib/util.cc:931
+msgid "Right"
+msgstr ""
+
+#: src/lib/util.cc:935
+msgid "Right surround"
+msgstr ""
+
+#: src/lib/scp_dcp_job.cc:133
+msgid "SSH error (%1)"
+msgstr "error SSH (%1)"
+
+#: src/lib/format.cc:119
+msgid "Scope"
+msgstr "Scope"
+
+#: src/lib/format.cc:127
+msgid "Scope without stretch"
+msgstr "Scope sin deformación"
+
+#: src/lib/dcp_content_type.cc:45
+msgid "Short"
+msgstr "Cortometraje"
+
+#: src/lib/scaler.cc:67
+msgid "Sinc"
+msgstr "Sinc"
+
+#: src/lib/scaler.cc:68
+msgid "Spline"
+msgstr "Spline"
+
+#: src/lib/dcp_content_type.cc:50
+msgid "Teaser"
+msgstr "Teaser"
+
+#: src/lib/filter.cc:90
+msgid "Telecine filter"
+msgstr "Filtro telecine"
+
+#: src/lib/filter.cc:84
+msgid "Temporal noise reducer"
+msgstr "Temporal noise reducer"
+
+#: src/lib/dcp_content_type.cc:47
+msgid "Test"
+msgstr "Test"
+
+#: src/lib/job.cc:77
+msgid ""
+"The drive that the film is stored on is low in disc space. Free some more "
+"space and try again."
+msgstr ""
+"En el dispositivo donde se encuentra la película queda poco espacio. Libere "
+"espacio en el disco y pruebe de nuevo."
+
+#: src/lib/dcp_content_type.cc:46
+msgid "Trailer"
+msgstr "Trailer"
+
+#: src/lib/transcode_job.cc:54
+msgid "Transcode %1"
+msgstr "Codificar %1"
+
+#: src/lib/dcp_content_type.cc:48
+msgid "Transitional"
+msgstr "Transitional"
+
+#: src/lib/job.cc:100
+msgid "Unknown error"
+msgstr "Error desconocido"
+
+#: src/lib/ffmpeg_decoder.cc:396
+msgid "Unrecognised audio sample format (%1)"
+msgstr "Formato de audio desconocido (%1)"
+
+#: src/lib/filter.cc:87
+msgid "Unsharp mask and Gaussian blur"
+msgstr "Máscara de desenfoque Gaussiano"
+
+#: src/lib/filter.cc:69
+msgid "Vertical deblocking filter"
+msgstr "Vertical deblocking filter"
+
+#: src/lib/filter.cc:71
+msgid "Vertical deblocking filter A"
+msgstr "Vertical deblocking filter A"
+
+#: src/lib/scp_dcp_job.cc:101
+msgid "Waiting"
+msgstr "Esperando"
+
+#: src/lib/scaler.cc:63
+msgid "X"
+msgstr "X"
+
+#: src/lib/filter.cc:83
+msgid "Yet Another Deinterlacing Filter"
+msgstr "Yet Another Deinterlacing Filter"
+
+#: src/lib/film.cc:263
+msgid "cannot contain slashes"
+msgstr "no puede contener barras"
+
+#: src/lib/util.cc:541
+msgid "connect timed out"
+msgstr "tiempo de conexión agotado"
+
+#: src/lib/scp_dcp_job.cc:119
+msgid "connecting"
+msgstr "conectando"
+
+#: src/lib/film.cc:300
+msgid "content"
+msgstr "contenido"
+
+#: src/lib/film.cc:304
+msgid "content type"
+msgstr "tipo de contenido"
+
+#: src/lib/scp_dcp_job.cc:168
+msgid "copying %1"
+msgstr "copiando %1"
+
+#: src/lib/exceptions.cc:36
+#, fuzzy
+msgid "could not create file %1"
+msgstr "No se pudo escribir el fichero remoto (%1)"
+
+#: src/lib/ffmpeg_decoder.cc:191
+msgid "could not find audio decoder"
+msgstr "no se encontró el decodificador de audio"
+
+#: src/lib/ffmpeg_decoder.cc:118
+msgid "could not find stream information"
+msgstr "no se pudo encontrar información del flujo"
+
+#: src/lib/ffmpeg_decoder.cc:210
+msgid "could not find subtitle decoder"
+msgstr "no se pudo encontrar decodificador de subtítutlos"
+
+#: src/lib/ffmpeg_decoder.cc:169
+msgid "could not find video decoder"
+msgstr "no se pudo encontrar decodificador de vídeo"
+
+#: src/lib/sndfile_decoder.cc:72
+msgid "could not open external audio file for reading"
+msgstr "no se pudo leer el fichero externo de audio"
+
+#: src/lib/exceptions.cc:29
+#, fuzzy
+msgid "could not open file %1"
+msgstr "no se pudo abrir el fichero para lectura"
+
+#: src/lib/dcp_video_frame.cc:388
+msgid "could not open file for reading"
+msgstr "no se pudo abrir el fichero para lectura"
+
+#: src/lib/exceptions.cc:44
+#, fuzzy
+msgid "could not read from file %1 (%2)"
+msgstr "No se pudo crear la carpeta remota %1 (%2)"
+
+#: src/lib/encoder.cc:137 src/lib/encoder.cc:314
+msgid "could not run sample-rate converter"
+msgstr "no se pudo ejecutar el conversor de velocidad"
+
+#: src/lib/scp_dcp_job.cc:86
+msgid "could not start SCP session (%1)"
+msgstr "no se pudo abrir la sesión SCP (%1)"
+
+#: src/lib/scp_dcp_job.cc:52
+msgid "could not start SSH session"
+msgstr "no se pudo abrir la sesión SSH"
+
+#: src/lib/exceptions.cc:50
+#, fuzzy
+msgid "could not write to file %1 (%2)"
+msgstr "No se pudo escribir el fichero remoto (%1)"
+
+#: src/lib/sndfile_decoder.cc:94
+msgid "external audio files have differing lengths"
+msgstr "los ficheros externos de sonido tienen duraciones diferentes"
+
+#: src/lib/sndfile_decoder.cc:76
+msgid "external audio files must be mono"
+msgstr "los ficheros externos de sonido deben ser mono"
+
+#: src/lib/film.cc:296
+msgid "format"
+msgstr "formato"
+
+#: src/lib/transcode_job.cc:100
+msgid "frames per second"
+msgstr "fotogramas por segundo"
+
+#: src/lib/util.cc:115
+msgid "hour"
+msgstr "hora"
+
+#: src/lib/util.cc:112 src/lib/util.cc:117
+msgid "hours"
+msgstr "horas"
+
+#: src/lib/util.cc:122
+msgid "minute"
+msgstr "minuto"
+
+#: src/lib/util.cc:124
+msgid "minutes"
+msgstr "minutos"
+
+#: src/lib/util.cc:684
+msgid "missing key %1 in key-value set"
+msgstr "falta la clave %1 en el par clave-valor"
+
+#: src/lib/exceptions.cc:54
+msgid "missing required setting %1"
+msgstr ""
+
+#: src/lib/subtitle.cc:52
+msgid "multi-part subtitles not yet supported"
+msgstr "todavía no se soportan subtítulos en múltiples partes"
+
+#: src/lib/film.cc:263 src/lib/film.cc:308
+msgid "name"
+msgstr "nombre"
+
+#: src/lib/imagemagick_decoder.cc:60
+msgid "no still image files found"
+msgstr "no se encuentran imágenes fijas"
+
+#: src/lib/subtitle.cc:58
+msgid "non-bitmap subtitles not yet supported"
+msgstr "todavía no se soportan subtítulos que no son en mapas de bits"
+
+#. / TRANSLATORS: remaining here follows an amount of time that is remaining
+#. / on an operation.
+#: src/lib/job.cc:295
+msgid "remaining"
+msgstr "pendiente"
+
+#: src/lib/util.cc:498
+msgid "sRGB"
+msgstr "sRGB"
+
+#: src/lib/util.cc:127
+msgid "seconds"
+msgstr "segundos"
+
+#: src/lib/film.cc:274
+msgid "still"
+msgstr "imagen fija"
+
+#: src/lib/film.cc:274
+msgid "video"
+msgstr "vídeo"
+
+#~ msgid "Source scaled to 1.19:1"
+#~ msgstr "Fuente escalada a 1.19:1"
+
+#~ msgid "Source scaled to 1.33:1"
+#~ msgstr "Fuente escalada a 1.33:1"
+
+#~ msgid "Source scaled to 1.33:1 then pillarboxed to Flat"
+#~ msgstr "Fuente escalada a 1.33:1 con bandas hasta Flat"
+
+#~ msgid "Source scaled to 1.375:1"
+#~ msgstr "Fuente escalada a 1.375:1"
+
+#~ msgid "Source scaled to 1.37:1 (Academy ratio)"
+#~ msgstr "Fuente escalada a 1.37:1 (Academy)"
+
+#~ msgid "Source scaled to 1.66:1"
+#~ msgstr "Fuente escalada a 1.66:1"
+
+#~ msgid "Source scaled to 1.66:1 then pillarboxed to Flat"
+#~ msgstr "Fuente escalada a 1.66:1 con bandas hasta Flat"
+
+#~ msgid "Source scaled to 1.78:1"
+#~ msgstr "Fuente escalada a 1.78:1"
+
+#~ msgid "Source scaled to 1.78:1 then pillarboxed to Flat"
+#~ msgstr "Fuente escalada a 1.78:1 con bandas hasta Flat"
+
+#~ msgid "Source scaled to Flat (1.85:1)"
+#~ msgstr "Fuente escalada a Flat (1.85:1)"
+
+#~ msgid "Source scaled to Scope (2.39:1)"
+#~ msgstr "Fuente escalada a Scope (2.39:1)"
+
+#~ msgid "Source scaled to fit Flat preserving its aspect ratio"
+#~ msgstr "Fuente escalada a Flat conservando el ratio de aspecto"
+
+#~ msgid "Source scaled to fit Scope preserving its aspect ratio"
+#~ msgstr "Fuente escalada a Scope conservando el ratio de aspecto"
+
+#~ msgid "adding to queue of %1"
+#~ msgstr "añadiendo a la cola de %1"
diff --git a/src/lib/po/fr_FR.po b/src/lib/po/fr_FR.po
new file mode 100644
index 000000000..d9d945b52
--- /dev/null
+++ b/src/lib/po/fr_FR.po
@@ -0,0 +1,626 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: DVD-o-matic FRENCH\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-04-09 11:14+0100\n"
+"PO-Revision-Date: 2013-03-20 00:39+0100\n"
+"Last-Translator: FreeDCP.net <freedcp.net@gmail.com>\n"
+"Language-Team: \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/lib/transcode_job.cc:87
+msgid "0%"
+msgstr "0%"
+
+#: src/lib/format.cc:75
+msgid "1.19"
+msgstr "1.19"
+
+#: src/lib/format.cc:79
+msgid "1.33"
+msgstr "1.33"
+
+#: src/lib/format.cc:83
+msgid "1.375"
+msgstr "1.375"
+
+#: src/lib/format.cc:95
+msgid "1.66"
+msgstr "1.66"
+
+#: src/lib/format.cc:99
+msgid "1.66 within Flat"
+msgstr "1.66 dans Flat"
+
+#: src/lib/format.cc:107
+msgid "16:9"
+msgstr "16:9"
+
+#: src/lib/format.cc:103
+msgid "16:9 within Flat"
+msgstr "16:9 dans Flat"
+
+#: src/lib/format.cc:115
+#, fuzzy
+msgid "16:9 within Scope"
+msgstr "16:9 dans Flat"
+
+#: src/lib/filter.cc:88
+msgid "3D denoiser"
+msgstr "Débruitage 3D"
+
+#: src/lib/format.cc:87
+msgid "4:3 within Flat"
+msgstr "4:3 dans Flat"
+
+#: src/lib/ab_transcode_job.cc:49
+msgid "A/B transcode %1"
+msgstr "Transcodage A/B %1"
+
+#: src/lib/format.cc:91
+msgid "Academy"
+msgstr "Academy"
+
+#: src/lib/dcp_content_type.cc:53
+msgid "Advertisement"
+msgstr "Advertisement"
+
+#: src/lib/job.cc:72
+msgid "An error occurred whilst handling the file %1."
+msgstr "Une erreur s'est produite lors du traitement du fichier %1."
+
+#: src/lib/analyse_audio_job.cc:49
+msgid "Analyse audio of %1"
+msgstr "Analyse du son de %1"
+
+#: src/lib/scaler.cc:64
+msgid "Area"
+msgstr "Area"
+
+#: src/lib/scaler.cc:62
+msgid "Bicubic"
+msgstr "Bicubique"
+
+#: src/lib/scaler.cc:69
+msgid "Bilinear"
+msgstr "Bilinéaire"
+
+#: src/lib/job.cc:302
+msgid "Cancelled"
+msgstr ""
+
+#: src/lib/exceptions.cc:60
+msgid "Cannot handle pixel format %1 during %2"
+msgstr ""
+
+#: src/lib/encoder.cc:101
+msgid "Cannot resample audio as libswresample is not present"
+msgstr "Ré-échantillonnage du son impossible : libswresample est absent"
+
+#: src/lib/util.cc:932
+msgid "Centre"
+msgstr ""
+
+#: src/lib/scp_dcp_job.cc:109
+msgid "Copy DCP to TMS"
+msgstr "Copier le DCP dans le TMS"
+
+#: src/lib/scp_dcp_job.cc:128
+msgid "Could not connect to server %1 (%2)"
+msgstr "Connexion au serveur %1 (%2) impossible"
+
+#: src/lib/scp_dcp_job.cc:150
+msgid "Could not create remote directory %1 (%2)"
+msgstr "Création du dossier distant %1 (%2) impossible"
+
+#: src/lib/scp_dcp_job.cc:175
+msgid "Could not open %1 to send"
+msgstr "Ouverture de %1 pour envoi impossible"
+
+#: src/lib/scp_dcp_job.cc:145
+msgid "Could not start SCP session (%1)"
+msgstr "Démarrage de session SCP (%1) impossible"
+
+#: src/lib/scp_dcp_job.cc:187
+msgid "Could not write to remote file (%1)"
+msgstr "Écriture vers fichier distant (%1) impossible"
+
+#: src/lib/filter.cc:77
+msgid "Cubic interpolating deinterlacer"
+msgstr "Désentrelacement cubique interpolé"
+
+#: src/lib/util.cc:1007
+msgid "DCP and source have the same rate.\n"
+msgstr "Le DCP et la source ont les mêmes cadences.\n"
+
+#: src/lib/util.cc:1017
+#, fuzzy
+msgid "DCP will run at %1%% of the source speed.\n"
+msgstr "La cadence du DCP sera %1%% par rapport à la source.\n"
+
+#: src/lib/util.cc:1010
+msgid "DCP will use every other frame of the source.\n"
+msgstr "Le DCP utilisera une image sur deux de la source.\n"
+
+#: src/lib/filter.cc:68 src/lib/filter.cc:69 src/lib/filter.cc:70
+#: src/lib/filter.cc:71 src/lib/filter.cc:72 src/lib/filter.cc:73
+msgid "De-blocking"
+msgstr "De-bloc"
+
+#: src/lib/filter.cc:75 src/lib/filter.cc:76 src/lib/filter.cc:77
+#: src/lib/filter.cc:78 src/lib/filter.cc:79 src/lib/filter.cc:80
+#: src/lib/filter.cc:81 src/lib/filter.cc:82 src/lib/filter.cc:83
+msgid "De-interlacing"
+msgstr "Désentrelacement"
+
+#: src/lib/filter.cc:74
+msgid "Deringing filter"
+msgstr "Filtre anti bourdonnement"
+
+#: src/lib/dolby_cp750.cc:27
+msgid "Dolby CP750"
+msgstr "Dolby CP750"
+
+#: src/lib/util.cc:1012
+msgid "Each source frame will be doubled in the DCP.\n"
+msgstr "Chaque image source sera dupliquée dans le DCP.\n"
+
+#: src/lib/job.cc:300
+msgid "Error (%1)"
+msgstr "Erreur (%1)"
+
+#: src/lib/examine_content_job.cc:55
+msgid "Examine content"
+msgstr "Examen du contenu"
+
+#: src/lib/examine_content_job.cc:58
+msgid "Examine content of %1"
+msgstr "Examen du contenu de %1"
+
+#: src/lib/filter.cc:72
+msgid "Experimental horizontal deblocking filter 1"
+msgstr "Filtre dé-bloc horizontal 1"
+
+#: src/lib/filter.cc:73
+msgid "Experimental vertical deblocking filter 1"
+msgstr "Filtre dé-bloc vertical 1"
+
+#: src/lib/filter.cc:79
+msgid "FFMPEG deinterlacer"
+msgstr "Désentrelaceur FFMPEG"
+
+#: src/lib/filter.cc:80
+msgid "FIR low-pass deinterlacer"
+msgstr "Désentrelaceur passe-bas FIR"
+
+#: src/lib/scp_dcp_job.cc:138
+msgid "Failed to authenticate with server (%1)"
+msgstr "L'authentification du serveur (%1) a échouée"
+
+#: src/lib/scaler.cc:70
+msgid "Fast Bilinear"
+msgstr "Bilinéaire rapide"
+
+#: src/lib/dcp_content_type.cc:44
+msgid "Feature"
+msgstr "Feature"
+
+#: src/lib/format.cc:111
+msgid "Flat"
+msgstr "Flat"
+
+#: src/lib/format.cc:123
+msgid "Flat without stretch"
+msgstr "Flat sans déformation"
+
+#: src/lib/filter.cc:85
+msgid "Force quantizer"
+msgstr "Forcer la quantification"
+
+#: src/lib/scaler.cc:65
+msgid "Gaussian"
+msgstr "Gaussien"
+
+#: src/lib/filter.cc:86
+msgid "Gradient debander"
+msgstr "Corrections des bandes du dégradé"
+
+#: src/lib/filter.cc:89
+msgid "High quality 3D denoiser"
+msgstr "Débruiteur 3D haute qualité"
+
+#: src/lib/filter.cc:68
+msgid "Horizontal deblocking filter"
+msgstr "Filtre dé-bloc horizontal"
+
+#: src/lib/filter.cc:70
+msgid "Horizontal deblocking filter A"
+msgstr "Filtre dé-bloc horizontal"
+
+#: src/lib/job.cc:92 src/lib/job.cc:101
+msgid ""
+"It is not known what caused this error. The best idea is to report the "
+"problem to the DVD-o-matic mailing list (dvdomatic@carlh.net)"
+msgstr ""
+"Erreur indéterminée. Merci de rapporter le problème à la liste DVD-o-matic "
+"(dvdomatic@carlh.net)"
+
+#: src/lib/filter.cc:82
+msgid "Kernel deinterlacer"
+msgstr "Désentrelaceur noyau"
+
+#: src/lib/scaler.cc:66
+msgid "Lanczos"
+msgstr "Lanczos"
+
+#: src/lib/util.cc:930
+msgid "Left"
+msgstr "Gauche"
+
+#: src/lib/util.cc:934
+msgid "Left surround"
+msgstr "Arrière gauche"
+
+#: src/lib/util.cc:933
+msgid "Lfe (sub)"
+msgstr "Basses fréquences"
+
+#: src/lib/filter.cc:75
+msgid "Linear blend deinterlacer"
+msgstr "Désentrelaceur par mélange interpolé"
+
+#: src/lib/filter.cc:76
+msgid "Linear interpolating deinterlacer"
+msgstr "Désentrelaceur linéaire interpolé"
+
+#: src/lib/filter.cc:78
+msgid "Median deinterlacer"
+msgstr "Désentrelaceur médian"
+
+#: src/lib/filter.cc:74 src/lib/filter.cc:85 src/lib/filter.cc:86
+#: src/lib/filter.cc:87 src/lib/filter.cc:90
+msgid "Misc"
+msgstr "Divers"
+
+#: src/lib/filter.cc:81
+msgid "Motion compensating deinterlacer"
+msgstr "Désentrelaceur par compensation de mouvement"
+
+#: src/lib/filter.cc:84 src/lib/filter.cc:88 src/lib/filter.cc:89
+#: src/lib/filter.cc:91
+msgid "Noise reduction"
+msgstr "Réduction de bruit"
+
+#: src/lib/job.cc:298
+msgid "OK (ran for %1)"
+msgstr "OK (processus %1)"
+
+#: src/lib/filter.cc:91
+msgid "Overcomplete wavelet denoiser"
+msgstr "Réduction de bruit par ondelettes"
+
+#: src/lib/dcp_content_type.cc:51
+msgid "Policy"
+msgstr "Policy"
+
+#: src/lib/dcp_content_type.cc:52
+msgid "Public Service Announcement"
+msgstr "Public Service Announcement"
+
+#: src/lib/dcp_content_type.cc:49
+msgid "Rating"
+msgstr "Classification"
+
+#: src/lib/util.cc:500
+msgid "Rec 709"
+msgstr "Rec 709"
+
+#: src/lib/util.cc:931
+msgid "Right"
+msgstr "Droite"
+
+#: src/lib/util.cc:935
+msgid "Right surround"
+msgstr "Arrière droite"
+
+#: src/lib/scp_dcp_job.cc:133
+msgid "SSH error (%1)"
+msgstr "Erreur SSH (%1)"
+
+#: src/lib/format.cc:119
+msgid "Scope"
+msgstr "Scope"
+
+#: src/lib/format.cc:127
+msgid "Scope without stretch"
+msgstr "Scope sans déformation"
+
+#: src/lib/dcp_content_type.cc:45
+msgid "Short"
+msgstr "Short"
+
+#: src/lib/scaler.cc:67
+msgid "Sinc"
+msgstr "Sinc"
+
+#: src/lib/scaler.cc:68
+msgid "Spline"
+msgstr "Spline"
+
+#: src/lib/dcp_content_type.cc:50
+msgid "Teaser"
+msgstr "Teaser"
+
+#: src/lib/filter.cc:90
+msgid "Telecine filter"
+msgstr "Filtre télécinéma"
+
+#: src/lib/filter.cc:84
+msgid "Temporal noise reducer"
+msgstr "Réduction de bruit temporel"
+
+#: src/lib/dcp_content_type.cc:47
+msgid "Test"
+msgstr "Test"
+
+#: src/lib/job.cc:77
+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."
+
+#: src/lib/dcp_content_type.cc:46
+msgid "Trailer"
+msgstr "Trailer"
+
+#: src/lib/transcode_job.cc:54
+msgid "Transcode %1"
+msgstr "Transcodage %1"
+
+#: src/lib/dcp_content_type.cc:48
+msgid "Transitional"
+msgstr "Transitional"
+
+#: src/lib/job.cc:100
+msgid "Unknown error"
+msgstr "Erreur inconnue"
+
+#: src/lib/ffmpeg_decoder.cc:396
+msgid "Unrecognised audio sample format (%1)"
+msgstr "Échantillonnage audio (%1) inconnu"
+
+#: src/lib/filter.cc:87
+msgid "Unsharp mask and Gaussian blur"
+msgstr "Adoucissement et flou Gaussien"
+
+#: src/lib/filter.cc:69
+msgid "Vertical deblocking filter"
+msgstr "Filtre dé-bloc vertical"
+
+#: src/lib/filter.cc:71
+msgid "Vertical deblocking filter A"
+msgstr "Filtre dé-bloc vertical A"
+
+#: src/lib/scp_dcp_job.cc:101
+msgid "Waiting"
+msgstr "En cours"
+
+#: src/lib/scaler.cc:63
+msgid "X"
+msgstr "X"
+
+#: src/lib/filter.cc:83
+msgid "Yet Another Deinterlacing Filter"
+msgstr "Un autre filtre de désentrelacement"
+
+#: src/lib/film.cc:263
+msgid "cannot contain slashes"
+msgstr "slash interdit"
+
+#: src/lib/util.cc:541
+msgid "connect timed out"
+msgstr "temps de connexion expiré"
+
+#: src/lib/scp_dcp_job.cc:119
+msgid "connecting"
+msgstr "connexion"
+
+#: src/lib/film.cc:300
+msgid "content"
+msgstr "contenu"
+
+#: src/lib/film.cc:304
+msgid "content type"
+msgstr "type de contenu"
+
+#: src/lib/scp_dcp_job.cc:168
+msgid "copying %1"
+msgstr "copie de %1"
+
+#: src/lib/exceptions.cc:36
+msgid "could not create file %1"
+msgstr "Écriture vers fichier distant (%1) impossible"
+
+#: src/lib/ffmpeg_decoder.cc:191
+msgid "could not find audio decoder"
+msgstr "décodeur audio introuvable"
+
+#: src/lib/ffmpeg_decoder.cc:118
+msgid "could not find stream information"
+msgstr "information du flux introuvable"
+
+#: src/lib/ffmpeg_decoder.cc:210
+msgid "could not find subtitle decoder"
+msgstr "décodeur de sous-titre introuvable"
+
+#: src/lib/ffmpeg_decoder.cc:169
+msgid "could not find video decoder"
+msgstr "décodeur vidéo introuvable"
+
+#: src/lib/sndfile_decoder.cc:72
+msgid "could not open external audio file for reading"
+msgstr "lecture du fichier audio externe impossible"
+
+#: src/lib/exceptions.cc:29
+msgid "could not open file %1"
+msgstr "lecture du fichier (%1) impossible"
+
+#: src/lib/dcp_video_frame.cc:388
+msgid "could not open file for reading"
+msgstr "lecture du fichier impossible"
+
+#: src/lib/exceptions.cc:44
+msgid "could not read from file %1 (%2)"
+msgstr "Création du dossier distant %1 impossible (%2)"
+
+#: src/lib/encoder.cc:137 src/lib/encoder.cc:314
+msgid "could not run sample-rate converter"
+msgstr "conversion de la fréquence d'échantillonnage impossible"
+
+#: src/lib/scp_dcp_job.cc:86
+msgid "could not start SCP session (%1)"
+msgstr "démarrage de session SCP (%1) impossible"
+
+#: src/lib/scp_dcp_job.cc:52
+msgid "could not start SSH session"
+msgstr "démarrage de session SSH impossible"
+
+#: src/lib/exceptions.cc:50
+msgid "could not write to file %1 (%2)"
+msgstr "Écriture vers fichier distant (%1) impossible (%2)"
+
+#: src/lib/sndfile_decoder.cc:94
+msgid "external audio files have differing lengths"
+msgstr "Les fichiers audio externes ont des durées différentes"
+
+#: src/lib/sndfile_decoder.cc:76
+msgid "external audio files must be mono"
+msgstr "les fichiers audio externes doivent être en mono"
+
+#: src/lib/film.cc:296
+msgid "format"
+msgstr "format"
+
+#: src/lib/transcode_job.cc:100
+msgid "frames per second"
+msgstr "images par seconde"
+
+#: src/lib/util.cc:115
+msgid "hour"
+msgstr "heure"
+
+#: src/lib/util.cc:112 src/lib/util.cc:117
+msgid "hours"
+msgstr "heures"
+
+#: src/lib/util.cc:122
+msgid "minute"
+msgstr "minute"
+
+#: src/lib/util.cc:124
+msgid "minutes"
+msgstr "minutes"
+
+#: src/lib/util.cc:684
+msgid "missing key %1 in key-value set"
+msgstr "clé %1 non sélectionnée"
+
+#: src/lib/exceptions.cc:54
+msgid "missing required setting %1"
+msgstr ""
+
+#: src/lib/subtitle.cc:52
+msgid "multi-part subtitles not yet supported"
+msgstr "sous-titres en plusieurs parties non supportés"
+
+#: src/lib/film.cc:263 src/lib/film.cc:308
+msgid "name"
+msgstr "nom"
+
+#: src/lib/imagemagick_decoder.cc:60
+msgid "no still image files found"
+msgstr "aucune image fixe trouvée"
+
+#: src/lib/subtitle.cc:58
+msgid "non-bitmap subtitles not yet supported"
+msgstr "sous-titres non-bitmap non supportés actuellement"
+
+#. / TRANSLATORS: remaining here follows an amount of time that is remaining
+#. / on an operation.
+#: src/lib/job.cc:295
+msgid "remaining"
+msgstr "restant"
+
+#: src/lib/util.cc:498
+msgid "sRGB"
+msgstr "sRGB"
+
+#: src/lib/util.cc:127
+msgid "seconds"
+msgstr "secondes"
+
+#: src/lib/film.cc:274
+msgid "still"
+msgstr "fixe"
+
+#: src/lib/film.cc:274
+msgid "video"
+msgstr "vidéo"
+
+#~ msgid "Source scaled to 1.19:1"
+#~ msgstr "Source mise à l'échelle en 1.19:1"
+
+#~ msgid "Source scaled to 1.33:1"
+#~ msgstr "Source mise à l'échelle en 1.33:1"
+
+#~ msgid "Source scaled to 1.33:1 then pillarboxed to Flat"
+#~ msgstr "Source mise à l'échelle en 1.33:1 puis contenue dans Flat"
+
+#~ msgid "Source scaled to 1.375:1"
+#~ msgstr "Source mise à l'échelle en 1.375:1"
+
+#~ msgid "Source scaled to 1.37:1 (Academy ratio)"
+#~ msgstr "Source mise à l'échelle en 1.37:1 (ratio \"academy\")"
+
+#~ msgid "Source scaled to 1.66:1"
+#~ msgstr "Source mise à l'échelle en 1.66:1"
+
+#~ msgid "Source scaled to 1.66:1 then pillarboxed to Flat"
+#~ msgstr "Source mise à l'échelle en 1.66:1 puis contenue dans Flat"
+
+#~ msgid "Source scaled to 1.78:1"
+#~ msgstr "Source mise à l'échelle en 1.78:1"
+
+#~ msgid "Source scaled to 1.78:1 then pillarboxed to Flat"
+#~ msgstr "Source mise à l'échelle en 1.78:1 puis contenue dans Flat"
+
+#~ msgid "Source scaled to Flat (1.85:1)"
+#~ msgstr "Source mise à l'échelle en Flat (1.85:1)"
+
+#~ msgid "Source scaled to Scope (2.39:1)"
+#~ msgstr "Source mise à l'échelle en Scope (2.39:1)"
+
+#~ msgid "Source scaled to fit Flat preserving its aspect ratio"
+#~ msgstr "Source réduite en Flat afin de préserver ses dimensions"
+
+#~ msgid "Source scaled to fit Scope preserving its aspect ratio"
+#~ msgstr "Source réduite en Scope afin de préserver ses dimensions"
+
+#~ msgid "adding to queue of %1"
+#~ msgstr "Mise en file d'attente de %1"
+
+#~ msgid "decoder sleeps with queue of %1"
+#~ msgstr "décodeur en veille avec %1 en file d'attente"
+
+#~ msgid "decoder wakes with queue of %1"
+#~ msgstr "reprise du décodage avec %1 en file d'attente"
diff --git a/src/lib/po/it_IT.po b/src/lib/po/it_IT.po
new file mode 100644
index 000000000..992eda107
--- /dev/null
+++ b/src/lib/po/it_IT.po
@@ -0,0 +1,628 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: IT VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-04-09 11:14+0100\n"
+"PO-Revision-Date: 2013-04-03 15:04+0100\n"
+"Last-Translator: Maci <macibro@gmail.com>\n"
+"Language-Team: \n"
+"Language: Italiano\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.5\n"
+
+#: src/lib/transcode_job.cc:87
+msgid "0%"
+msgstr "0%"
+
+#: src/lib/format.cc:75
+msgid "1.19"
+msgstr "1.19"
+
+#: src/lib/format.cc:79
+msgid "1.33"
+msgstr "1.33"
+
+#: src/lib/format.cc:83
+msgid "1.375"
+msgstr "1.375"
+
+#: src/lib/format.cc:95
+msgid "1.66"
+msgstr "1.66"
+
+#: src/lib/format.cc:99
+msgid "1.66 within Flat"
+msgstr "1.66 all'interno di Flat"
+
+#: src/lib/format.cc:107
+msgid "16:9"
+msgstr "16:9"
+
+#: src/lib/format.cc:103
+msgid "16:9 within Flat"
+msgstr "16:9 all'interno di Flat"
+
+#: src/lib/format.cc:115
+#, fuzzy
+msgid "16:9 within Scope"
+msgstr "16:9 all'interno di Flat"
+
+#: src/lib/filter.cc:88
+msgid "3D denoiser"
+msgstr "Riduttore di rumore 3D"
+
+#: src/lib/format.cc:87
+msgid "4:3 within Flat"
+msgstr "4:3 all'interno di Flat"
+
+#: src/lib/ab_transcode_job.cc:49
+msgid "A/B transcode %1"
+msgstr "Transcodifica A/B %1"
+
+#: src/lib/format.cc:91
+msgid "Academy"
+msgstr "Academy"
+
+#: src/lib/dcp_content_type.cc:53
+msgid "Advertisement"
+msgstr "Pubblicità"
+
+#: src/lib/job.cc:72
+msgid "An error occurred whilst handling the file %1."
+msgstr "Errore durante l'elaborazione del file %1."
+
+#: src/lib/analyse_audio_job.cc:49
+msgid "Analyse audio of %1"
+msgstr "Analizzo l'audio di %1"
+
+#: src/lib/scaler.cc:64
+msgid "Area"
+msgstr "Area"
+
+#: src/lib/scaler.cc:62
+msgid "Bicubic"
+msgstr "Bicubica"
+
+#: src/lib/scaler.cc:69
+msgid "Bilinear"
+msgstr "Bilineare"
+
+#: src/lib/job.cc:302
+msgid "Cancelled"
+msgstr "Cancellato"
+
+#: src/lib/exceptions.cc:60
+msgid "Cannot handle pixel format %1 during %2"
+msgstr "Non posso gestire il formato di pixel %1 durante %2"
+
+#: src/lib/encoder.cc:101
+msgid "Cannot resample audio as libswresample is not present"
+msgstr "Non posso ricampionare l'audio perchè libswresample non è presente"
+
+#: src/lib/util.cc:932
+msgid "Centre"
+msgstr "Centro"
+
+#: src/lib/scp_dcp_job.cc:109
+msgid "Copy DCP to TMS"
+msgstr "Copia del DCP al TMS"
+
+#: src/lib/scp_dcp_job.cc:128
+msgid "Could not connect to server %1 (%2)"
+msgstr "Non posso connetermi al server %1 (%2)"
+
+#: src/lib/scp_dcp_job.cc:150
+msgid "Could not create remote directory %1 (%2)"
+msgstr "Non posso creare la directory remota %1 (%2)"
+
+#: src/lib/scp_dcp_job.cc:175
+msgid "Could not open %1 to send"
+msgstr "Non posso aprire %1 da inviare"
+
+#: src/lib/scp_dcp_job.cc:145
+msgid "Could not start SCP session (%1)"
+msgstr "Non posso avviare la sessione SCP (%1)"
+
+#: src/lib/scp_dcp_job.cc:187
+msgid "Could not write to remote file (%1)"
+msgstr "Non posso scrivere il file remoto (%1)"
+
+#: src/lib/filter.cc:77
+msgid "Cubic interpolating deinterlacer"
+msgstr "Deinterlacciatore cubico interpolato"
+
+#: src/lib/util.cc:1007
+msgid "DCP and source have the same rate.\n"
+msgstr "Il DCP e il sorgente hanno la stessa frequenza.\n"
+
+#: src/lib/util.cc:1017
+msgid "DCP will run at %1%% of the source speed.\n"
+msgstr "Il DCP andrà al %1%% della velocità del sorgente.\n"
+
+#: src/lib/util.cc:1010
+msgid "DCP will use every other frame of the source.\n"
+msgstr "Il DCP userà ogni altro fotogramma del sorgente.\n"
+
+#: src/lib/filter.cc:68 src/lib/filter.cc:69 src/lib/filter.cc:70
+#: src/lib/filter.cc:71 src/lib/filter.cc:72 src/lib/filter.cc:73
+msgid "De-blocking"
+msgstr "Sbloccaggio"
+
+#: src/lib/filter.cc:75 src/lib/filter.cc:76 src/lib/filter.cc:77
+#: src/lib/filter.cc:78 src/lib/filter.cc:79 src/lib/filter.cc:80
+#: src/lib/filter.cc:81 src/lib/filter.cc:82 src/lib/filter.cc:83
+msgid "De-interlacing"
+msgstr "De-interlacciamento"
+
+#: src/lib/filter.cc:74
+msgid "Deringing filter"
+msgstr "Filtro deringing"
+
+#: src/lib/dolby_cp750.cc:27
+msgid "Dolby CP750"
+msgstr "Dolby CP750"
+
+#: src/lib/util.cc:1012
+msgid "Each source frame will be doubled in the DCP.\n"
+msgstr "Ogni fotogramma del sorgente sarà raddoppiato nel DCP.\n"
+
+#: src/lib/job.cc:300
+msgid "Error (%1)"
+msgstr "Errore (%1)"
+
+#: src/lib/examine_content_job.cc:55
+msgid "Examine content"
+msgstr "Esamino il contenuto"
+
+#: src/lib/examine_content_job.cc:58
+msgid "Examine content of %1"
+msgstr "Esamo il contenuto di %1"
+
+#: src/lib/filter.cc:72
+msgid "Experimental horizontal deblocking filter 1"
+msgstr "Filtro di sblocco sperimentale orizzontale 1"
+
+#: src/lib/filter.cc:73
+msgid "Experimental vertical deblocking filter 1"
+msgstr "Filtro di sblocco sperimentale verticale 1"
+
+#: src/lib/filter.cc:79
+msgid "FFMPEG deinterlacer"
+msgstr "Deinterlacciatore FFMPEG"
+
+#: src/lib/filter.cc:80
+msgid "FIR low-pass deinterlacer"
+msgstr "Deinterlacciatore FIR low-pass"
+
+#: src/lib/scp_dcp_job.cc:138
+msgid "Failed to authenticate with server (%1)"
+msgstr "Autenticazione col server fallita (%1) "
+
+#: src/lib/scaler.cc:70
+msgid "Fast Bilinear"
+msgstr "Bilineare rapida"
+
+#: src/lib/dcp_content_type.cc:44
+msgid "Feature"
+msgstr "Caratteristica"
+
+#: src/lib/format.cc:111
+msgid "Flat"
+msgstr "Flat"
+
+#: src/lib/format.cc:123
+msgid "Flat without stretch"
+msgstr "Flat senza stiramento"
+
+#: src/lib/filter.cc:85
+msgid "Force quantizer"
+msgstr "Forza quantizzatore"
+
+#: src/lib/scaler.cc:65
+msgid "Gaussian"
+msgstr "Gaussiana"
+
+#: src/lib/filter.cc:86
+msgid "Gradient debander"
+msgstr "Gradiente debander"
+
+#: src/lib/filter.cc:89
+msgid "High quality 3D denoiser"
+msgstr "Riduttore di rumore 3D di alta qualità"
+
+#: src/lib/filter.cc:68
+msgid "Horizontal deblocking filter"
+msgstr "Filtro sblocco orizzontale"
+
+#: src/lib/filter.cc:70
+msgid "Horizontal deblocking filter A"
+msgstr "Filtro A sblocco orizzontale"
+
+#: src/lib/job.cc:92 src/lib/job.cc:101
+msgid ""
+"It is not known what caused this error. The best idea is to report the "
+"problem to the DVD-o-matic mailing list (dvdomatic@carlh.net)"
+msgstr ""
+"Non sappiamo cosa ha causato questo errore. La cosa migliore è inviare un "
+"report del problema alla mailing list di DVD-o-matic (dvdomatic@carlh.net)"
+
+#: src/lib/filter.cc:82
+msgid "Kernel deinterlacer"
+msgstr "Deinterlacciatore Kernel"
+
+#: src/lib/scaler.cc:66
+msgid "Lanczos"
+msgstr "Lanczos"
+
+#: src/lib/util.cc:930
+msgid "Left"
+msgstr "Sinistro"
+
+#: src/lib/util.cc:934
+msgid "Left surround"
+msgstr "Surround sinistro"
+
+#: src/lib/util.cc:933
+msgid "Lfe (sub)"
+msgstr "Lfe(sub)"
+
+#: src/lib/filter.cc:75
+msgid "Linear blend deinterlacer"
+msgstr "Deinterlacciatore lineare miscelato"
+
+#: src/lib/filter.cc:76
+msgid "Linear interpolating deinterlacer"
+msgstr "Deinterlacciatore lineare interpolato"
+
+#: src/lib/filter.cc:78
+msgid "Median deinterlacer"
+msgstr "Deinterlacciatore mediano"
+
+#: src/lib/filter.cc:74 src/lib/filter.cc:85 src/lib/filter.cc:86
+#: src/lib/filter.cc:87 src/lib/filter.cc:90
+msgid "Misc"
+msgstr "Varie"
+
+#: src/lib/filter.cc:81
+msgid "Motion compensating deinterlacer"
+msgstr "Dinterlacciatore compensativo di movimento"
+
+#: src/lib/filter.cc:84 src/lib/filter.cc:88 src/lib/filter.cc:89
+#: src/lib/filter.cc:91
+msgid "Noise reduction"
+msgstr "Riduzione del rumore"
+
+#: src/lib/job.cc:298
+msgid "OK (ran for %1)"
+msgstr "OK (procede al %1)"
+
+#: src/lib/filter.cc:91
+msgid "Overcomplete wavelet denoiser"
+msgstr "Overcomplete wavelet denoiser"
+
+#: src/lib/dcp_content_type.cc:51
+msgid "Policy"
+msgstr "Politica"
+
+#: src/lib/dcp_content_type.cc:52
+msgid "Public Service Announcement"
+msgstr "Annuncio di pubblico servizio"
+
+#: src/lib/dcp_content_type.cc:49
+msgid "Rating"
+msgstr "Punteggio"
+
+#: src/lib/util.cc:500
+msgid "Rec 709"
+msgstr "Rec 709"
+
+#: src/lib/util.cc:931
+msgid "Right"
+msgstr "Destro"
+
+#: src/lib/util.cc:935
+msgid "Right surround"
+msgstr "Surround destro"
+
+#: src/lib/scp_dcp_job.cc:133
+msgid "SSH error (%1)"
+msgstr "Errore SSH (%1)"
+
+#: src/lib/format.cc:119
+msgid "Scope"
+msgstr "Scope"
+
+#: src/lib/format.cc:127
+msgid "Scope without stretch"
+msgstr "Scope senza stiramento"
+
+#: src/lib/dcp_content_type.cc:45
+msgid "Short"
+msgstr "Corto"
+
+#: src/lib/scaler.cc:67
+msgid "Sinc"
+msgstr "Sinc"
+
+#: src/lib/scaler.cc:68
+msgid "Spline"
+msgstr "Spline"
+
+#: src/lib/dcp_content_type.cc:50
+msgid "Teaser"
+msgstr "Teaser"
+
+#: src/lib/filter.cc:90
+msgid "Telecine filter"
+msgstr "Filtro telecinema"
+
+#: src/lib/filter.cc:84
+msgid "Temporal noise reducer"
+msgstr "Riduttore temporale di rumore"
+
+#: src/lib/dcp_content_type.cc:47
+msgid "Test"
+msgstr "Prova"
+
+#: src/lib/job.cc:77
+msgid ""
+"The drive that the film is stored on is low in disc space. Free some more "
+"space and try again."
+msgstr ""
+"Sul disco dove è memorizzato il film non c'è abbastanza spazio. Liberare "
+"altro spazio e riprovare."
+
+#: src/lib/dcp_content_type.cc:46
+msgid "Trailer"
+msgstr "Prossimamente"
+
+#: src/lib/transcode_job.cc:54
+msgid "Transcode %1"
+msgstr "Transcodifica %1"
+
+#: src/lib/dcp_content_type.cc:48
+msgid "Transitional"
+msgstr "Di transizione"
+
+#: src/lib/job.cc:100
+msgid "Unknown error"
+msgstr "Errore sconosciuto"
+
+#: src/lib/ffmpeg_decoder.cc:396
+msgid "Unrecognised audio sample format (%1)"
+msgstr "Formato di campionamento audio non riconosciuto (%1)"
+
+#: src/lib/filter.cc:87
+msgid "Unsharp mask and Gaussian blur"
+msgstr "Maschera unsharp e sfocatura Gaussiana"
+
+#: src/lib/filter.cc:69
+msgid "Vertical deblocking filter"
+msgstr "Filtro di sblocco verticale"
+
+#: src/lib/filter.cc:71
+msgid "Vertical deblocking filter A"
+msgstr "Filtro A di sblocco verticale"
+
+#: src/lib/scp_dcp_job.cc:101
+msgid "Waiting"
+msgstr "Aspetta"
+
+#: src/lib/scaler.cc:63
+msgid "X"
+msgstr "X"
+
+#: src/lib/filter.cc:83
+msgid "Yet Another Deinterlacing Filter"
+msgstr "Altro filtro di deinterlacciamento"
+
+#: src/lib/film.cc:263
+msgid "cannot contain slashes"
+msgstr "non può contenere barre"
+
+#: src/lib/util.cc:541
+msgid "connect timed out"
+msgstr "connessione scaduta"
+
+#: src/lib/scp_dcp_job.cc:119
+msgid "connecting"
+msgstr "mi sto connettendo"
+
+#: src/lib/film.cc:300
+msgid "content"
+msgstr "contenuto"
+
+#: src/lib/film.cc:304
+msgid "content type"
+msgstr "tipo di contenuto"
+
+#: src/lib/scp_dcp_job.cc:168
+msgid "copying %1"
+msgstr "copia %1"
+
+#: src/lib/exceptions.cc:36
+msgid "could not create file %1"
+msgstr "Non posso scrivere il file remoto (%1)"
+
+#: src/lib/ffmpeg_decoder.cc:191
+msgid "could not find audio decoder"
+msgstr "non riesco a trovare il decoder audio"
+
+#: src/lib/ffmpeg_decoder.cc:118
+msgid "could not find stream information"
+msgstr "non riesco a trovare informazioni sullo streaming"
+
+#: src/lib/ffmpeg_decoder.cc:210
+msgid "could not find subtitle decoder"
+msgstr "non riesco a trovare il decoder dei sottotitoli"
+
+#: src/lib/ffmpeg_decoder.cc:169
+msgid "could not find video decoder"
+msgstr "non riesco a trovare il decoder video"
+
+#: src/lib/sndfile_decoder.cc:72
+msgid "could not open external audio file for reading"
+msgstr "non riesco ad aprire il file dell'audio esterno per leggerlo"
+
+#: src/lib/exceptions.cc:29
+msgid "could not open file %1"
+msgstr "non riesco ad aprire il file per leggerlo"
+
+#: src/lib/dcp_video_frame.cc:388
+msgid "could not open file for reading"
+msgstr "non riesco ad aprire il file per leggerlo"
+
+#: src/lib/exceptions.cc:44
+msgid "could not read from file %1 (%2)"
+msgstr "Non posso creare la directory remota %1 (%2)"
+
+#: src/lib/encoder.cc:137 src/lib/encoder.cc:314
+msgid "could not run sample-rate converter"
+msgstr "non riesco a lanciare il convertitore della frequenza di campionamento"
+
+#: src/lib/scp_dcp_job.cc:86
+msgid "could not start SCP session (%1)"
+msgstr "non posso avviare la sessione SCP (%1)"
+
+#: src/lib/scp_dcp_job.cc:52
+msgid "could not start SSH session"
+msgstr "non posso avviare la sessione SSH"
+
+#: src/lib/exceptions.cc:50
+msgid "could not write to file %1 (%2)"
+msgstr "Non posso scrivere il file remoto (%1)"
+
+#: src/lib/sndfile_decoder.cc:94
+msgid "external audio files have differing lengths"
+msgstr "i files dell'audio esterno hanno durata diversa"
+
+#: src/lib/sndfile_decoder.cc:76
+msgid "external audio files must be mono"
+msgstr "i files dell'audio esterno devono essere mono"
+
+#: src/lib/film.cc:296
+msgid "format"
+msgstr "formato"
+
+#: src/lib/transcode_job.cc:100
+msgid "frames per second"
+msgstr "fotogrammi al secondo"
+
+#: src/lib/util.cc:115
+msgid "hour"
+msgstr "ora"
+
+#: src/lib/util.cc:112 src/lib/util.cc:117
+msgid "hours"
+msgstr "ore"
+
+#: src/lib/util.cc:122
+msgid "minute"
+msgstr "minuto"
+
+#: src/lib/util.cc:124
+msgid "minutes"
+msgstr "minuti"
+
+#: src/lib/util.cc:684
+msgid "missing key %1 in key-value set"
+msgstr "persa la chiave %1 tra i valori chiave"
+
+#: src/lib/exceptions.cc:54
+msgid "missing required setting %1"
+msgstr "persa la regolazione richiesta %1"
+
+#: src/lib/subtitle.cc:52
+msgid "multi-part subtitles not yet supported"
+msgstr "sottotitoli multi-part non ancora supportati"
+
+#: src/lib/film.cc:263 src/lib/film.cc:308
+msgid "name"
+msgstr "nome"
+
+#: src/lib/imagemagick_decoder.cc:60
+msgid "no still image files found"
+msgstr "file del fermo immagine non trovati"
+
+#: src/lib/subtitle.cc:58
+msgid "non-bitmap subtitles not yet supported"
+msgstr "sottotitoli non-bitmap non ancora supportati"
+
+#. / TRANSLATORS: remaining here follows an amount of time that is remaining
+#. / on an operation.
+#: src/lib/job.cc:295
+msgid "remaining"
+msgstr "restano"
+
+#: src/lib/util.cc:498
+msgid "sRGB"
+msgstr "sRGB"
+
+#: src/lib/util.cc:127
+msgid "seconds"
+msgstr "secondi"
+
+#: src/lib/film.cc:274
+msgid "still"
+msgstr "ancora"
+
+#: src/lib/film.cc:274
+msgid "video"
+msgstr "video"
+
+#~ msgid "Source scaled to 1.19:1"
+#~ msgstr "Sorgente scalato a 1.19:1"
+
+#~ msgid "Source scaled to 1.33:1"
+#~ msgstr "Sorgente scalato a 1.33:1"
+
+#~ msgid "Source scaled to 1.33:1 then pillarboxed to Flat"
+#~ msgstr "Sorgente scalato a 1.33:1 e poi inviato come Flat"
+
+#~ msgid "Source scaled to 1.375:1"
+#~ msgstr "Sorgente scalato a 1.375:1"
+
+#~ msgid "Source scaled to 1.37:1 (Academy ratio)"
+#~ msgstr "Sorgente scalato a 1.37:1 (Academy ratio)"
+
+#~ msgid "Source scaled to 1.66:1"
+#~ msgstr "Sorgente scalato a 1.66:1"
+
+#~ msgid "Source scaled to 1.66:1 then pillarboxed to Flat"
+#~ msgstr "Sorgente scalato a 1.66:1 e poi inviato come Flat"
+
+#~ msgid "Source scaled to 1.78:1"
+#~ msgstr "Sorgente scalato a 1.78:1"
+
+#~ msgid "Source scaled to 1.78:1 then pillarboxed to Flat"
+#~ msgstr "Sorgente scalato a 1.78:1 e poi inviato come Flat"
+
+#~ msgid "Source scaled to Flat (1.85:1)"
+#~ msgstr "Sorgente scalato a Flat (1.85:1)"
+
+#~ msgid "Source scaled to Scope (2.39:1)"
+#~ msgstr "Sorgente scalato a Scope (2.39:1)"
+
+#~ msgid "Source scaled to fit Flat preserving its aspect ratio"
+#~ msgstr ""
+#~ "Sorgente scalato per adattarsi a Flat mantentendo le sue proporzioni"
+
+#~ msgid "Source scaled to fit Scope preserving its aspect ratio"
+#~ msgstr ""
+#~ "Sorgente scalato per adattarsi a Scope mantentendo le sue proporzioni"
+
+#~ msgid "adding to queue of %1"
+#~ msgstr "aggiungo alla coda %1"
+
+#~ msgid "decoder sleeps with queue of %1"
+#~ msgstr "il decoder è in pausa con la coda di %1"
+
+#~ msgid "decoder wakes with queue of %1"
+#~ msgstr "il decoder riparte con la coda di %1"
diff --git a/src/lib/po/sv_SE.po b/src/lib/po/sv_SE.po
new file mode 100644
index 000000000..ef8109dfa
--- /dev/null
+++ b/src/lib/po/sv_SE.po
@@ -0,0 +1,623 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: DVD-o-matic\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-04-09 11:14+0100\n"
+"PO-Revision-Date: 2013-04-10 15:35+0100\n"
+"Last-Translator: Adam Klotblixt <adam.klotblixt@gmail.com>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.5\n"
+
+#: src/lib/transcode_job.cc:87
+msgid "0%"
+msgstr "0%"
+
+#: src/lib/format.cc:75
+msgid "1.19"
+msgstr "1,19"
+
+#: src/lib/format.cc:79
+msgid "1.33"
+msgstr "1,33"
+
+#: src/lib/format.cc:83
+msgid "1.375"
+msgstr "1,375"
+
+#: src/lib/format.cc:95
+msgid "1.66"
+msgstr "1,66"
+
+#: src/lib/format.cc:99
+msgid "1.66 within Flat"
+msgstr "1,66 innanför Flat"
+
+#: src/lib/format.cc:107
+msgid "16:9"
+msgstr "16:9"
+
+#: src/lib/format.cc:103
+msgid "16:9 within Flat"
+msgstr "16:9 innanför Flat"
+
+#: src/lib/format.cc:115
+msgid "16:9 within Scope"
+msgstr "16:9 innanför Scope"
+
+#: src/lib/filter.cc:88
+msgid "3D denoiser"
+msgstr "3D brusreducering"
+
+#: src/lib/format.cc:87
+msgid "4:3 within Flat"
+msgstr "4:3 innanför Flat"
+
+#: src/lib/ab_transcode_job.cc:49
+msgid "A/B transcode %1"
+msgstr "A/B konvertera %1"
+
+#: src/lib/format.cc:91
+msgid "Academy"
+msgstr "Academy"
+
+#: src/lib/dcp_content_type.cc:53
+msgid "Advertisement"
+msgstr "Reklam"
+
+#: src/lib/job.cc:72
+msgid "An error occurred whilst handling the file %1."
+msgstr "Ett fel inträffade vid hantering av filen %1"
+
+#: src/lib/analyse_audio_job.cc:49
+msgid "Analyse audio of %1"
+msgstr "Analysera %1s audio"
+
+#: src/lib/scaler.cc:64
+msgid "Area"
+msgstr "Yta"
+
+#: src/lib/scaler.cc:62
+msgid "Bicubic"
+msgstr "Bikubisk"
+
+#: src/lib/scaler.cc:69
+msgid "Bilinear"
+msgstr "Bilinjär"
+
+#: src/lib/job.cc:302
+msgid "Cancelled"
+msgstr "Avbruten"
+
+#: src/lib/exceptions.cc:60
+msgid "Cannot handle pixel format %1 during %2"
+msgstr "Kan inte hantera pixelformat %1 under %2"
+
+#: src/lib/encoder.cc:101
+msgid "Cannot resample audio as libswresample is not present"
+msgstr ""
+"Kan inte omsampla ljudet eftersom libswresample inte finns tillgängligt"
+
+#: src/lib/util.cc:932
+msgid "Centre"
+msgstr "Mitt"
+
+#: src/lib/scp_dcp_job.cc:109
+msgid "Copy DCP to TMS"
+msgstr "Kopiera DCP till TMS"
+
+#: src/lib/scp_dcp_job.cc:128
+msgid "Could not connect to server %1 (%2)"
+msgstr "Kunde inte ansluta till server %1 (%2)"
+
+#: src/lib/scp_dcp_job.cc:150
+msgid "Could not create remote directory %1 (%2)"
+msgstr "Kunde inte skapa fjärrkatalog %1 (%2)"
+
+#: src/lib/scp_dcp_job.cc:175
+msgid "Could not open %1 to send"
+msgstr "Kunde inte öppna %1 för att skicka"
+
+#: src/lib/scp_dcp_job.cc:145
+msgid "Could not start SCP session (%1)"
+msgstr "Kunde inte starta SCP-session (%1)"
+
+#: src/lib/scp_dcp_job.cc:187
+msgid "Could not write to remote file (%1)"
+msgstr "Kunde inte skriva till fjärrfil (%1)"
+
+#: src/lib/filter.cc:77
+msgid "Cubic interpolating deinterlacer"
+msgstr "Kubiskt interpolerande avflätare"
+
+#: src/lib/util.cc:1007
+msgid "DCP and source have the same rate.\n"
+msgstr "DCP och källa har samma bildfrekvens.\n"
+
+#: src/lib/util.cc:1017
+msgid "DCP will run at %1%% of the source speed.\n"
+msgstr "DCP kommer att köras på %1%% av källans hastighet.\n"
+
+#: src/lib/util.cc:1010
+msgid "DCP will use every other frame of the source.\n"
+msgstr "DCP kommer att använda varannan bild från källan.\n"
+
+#: src/lib/filter.cc:68 src/lib/filter.cc:69 src/lib/filter.cc:70
+#: src/lib/filter.cc:71 src/lib/filter.cc:72 src/lib/filter.cc:73
+msgid "De-blocking"
+msgstr "Kantighetsutjämning"
+
+#: src/lib/filter.cc:75 src/lib/filter.cc:76 src/lib/filter.cc:77
+#: src/lib/filter.cc:78 src/lib/filter.cc:79 src/lib/filter.cc:80
+#: src/lib/filter.cc:81 src/lib/filter.cc:82 src/lib/filter.cc:83
+msgid "De-interlacing"
+msgstr "Avflätning"
+
+#: src/lib/filter.cc:74
+msgid "Deringing filter"
+msgstr "Avringningsfilter"
+
+#: src/lib/dolby_cp750.cc:27
+msgid "Dolby CP750"
+msgstr "Dolby CP750"
+
+#: src/lib/util.cc:1012
+msgid "Each source 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/job.cc:300
+msgid "Error (%1)"
+msgstr "Fel (%1)"
+
+#: src/lib/examine_content_job.cc:55
+msgid "Examine content"
+msgstr "Undersök innehållet"
+
+#: src/lib/examine_content_job.cc:58
+msgid "Examine content of %1"
+msgstr "Undersök innehållet i %1"
+
+#: src/lib/filter.cc:72
+msgid "Experimental horizontal deblocking filter 1"
+msgstr "Experimentellt filter för horisontal kantighetsutjämning 1"
+
+#: src/lib/filter.cc:73
+msgid "Experimental vertical deblocking filter 1"
+msgstr "Experimentellt filter för vertikal kantighetsutjämning 1"
+
+#: src/lib/filter.cc:79
+msgid "FFMPEG deinterlacer"
+msgstr "FFMPEG avflätare"
+
+#: src/lib/filter.cc:80
+msgid "FIR low-pass deinterlacer"
+msgstr "FIR lågpass-avflätare"
+
+#: src/lib/scp_dcp_job.cc:138
+msgid "Failed to authenticate with server (%1)"
+msgstr "Misslyckades att autentisera med server (%1)"
+
+#: src/lib/scaler.cc:70
+msgid "Fast Bilinear"
+msgstr "Snabb bilinjär"
+
+#: src/lib/dcp_content_type.cc:44
+msgid "Feature"
+msgstr "Långfilm"
+
+#: src/lib/format.cc:111
+msgid "Flat"
+msgstr "Flat"
+
+#: src/lib/format.cc:123
+msgid "Flat without stretch"
+msgstr "Flat utan utsträckning"
+
+#: src/lib/filter.cc:85
+msgid "Force quantizer"
+msgstr "Tvinga kvantiserare"
+
+#: src/lib/scaler.cc:65
+msgid "Gaussian"
+msgstr "Gaussisk"
+
+#: src/lib/filter.cc:86
+msgid "Gradient debander"
+msgstr "Gradientutjämnare"
+
+#: src/lib/filter.cc:89
+msgid "High quality 3D denoiser"
+msgstr "Högkvalitets 3D-brusreducering"
+
+#: src/lib/filter.cc:68
+msgid "Horizontal deblocking filter"
+msgstr "Filter för horisontal kantighetsutjämning"
+
+#: src/lib/filter.cc:70
+msgid "Horizontal deblocking filter A"
+msgstr "Filter för horisontal kantighetsutjämning A"
+
+#: src/lib/job.cc:92 src/lib/job.cc:101
+msgid ""
+"It is not known what caused this error. The best idea is to report the "
+"problem to the DVD-o-matic mailing list (dvdomatic@carlh.net)"
+msgstr ""
+"Det är inte känt vad som orsakade detta fel. Bästa sättet att rapportera "
+"problemet är till DVD-o-matics mejl-lista (dvdomatic@carlh.net)"
+
+#: src/lib/filter.cc:82
+msgid "Kernel deinterlacer"
+msgstr "Kernel-avflätare"
+
+#: src/lib/scaler.cc:66
+msgid "Lanczos"
+msgstr "Lanczos"
+
+#: src/lib/util.cc:930
+msgid "Left"
+msgstr "Vänster"
+
+#: src/lib/util.cc:934
+msgid "Left surround"
+msgstr "Vänster surround"
+
+#: src/lib/util.cc:933
+msgid "Lfe (sub)"
+msgstr "Lfe (sub)"
+
+#: src/lib/filter.cc:75
+msgid "Linear blend deinterlacer"
+msgstr "Linjär blandningsavflätare"
+
+#: src/lib/filter.cc:76
+msgid "Linear interpolating deinterlacer"
+msgstr "Linjär interpolationsavflätare"
+
+#: src/lib/filter.cc:78
+msgid "Median deinterlacer"
+msgstr "Median-avflätare"
+
+#: src/lib/filter.cc:74 src/lib/filter.cc:85 src/lib/filter.cc:86
+#: src/lib/filter.cc:87 src/lib/filter.cc:90
+msgid "Misc"
+msgstr "Diverse"
+
+#: src/lib/filter.cc:81
+msgid "Motion compensating deinterlacer"
+msgstr "Rörelsekompenserande avflätare"
+
+#: src/lib/filter.cc:84 src/lib/filter.cc:88 src/lib/filter.cc:89
+#: src/lib/filter.cc:91
+msgid "Noise reduction"
+msgstr "Brusreducering"
+
+#: src/lib/job.cc:298
+msgid "OK (ran for %1)"
+msgstr "OK (kördes %1)"
+
+#: src/lib/filter.cc:91
+msgid "Overcomplete wavelet denoiser"
+msgstr "Överkomplett wavelet-brusreducering"
+
+#: src/lib/dcp_content_type.cc:51
+msgid "Policy"
+msgstr "Policy"
+
+#: src/lib/dcp_content_type.cc:52
+msgid "Public Service Announcement"
+msgstr "Offentligt Servicemeddelande"
+
+#: src/lib/dcp_content_type.cc:49
+msgid "Rating"
+msgstr "Klassificeringsklipp"
+
+#: src/lib/util.cc:500
+msgid "Rec 709"
+msgstr "Rec 709"
+
+#: src/lib/util.cc:931
+msgid "Right"
+msgstr "Höger"
+
+#: src/lib/util.cc:935
+msgid "Right surround"
+msgstr "Höger surround"
+
+#: src/lib/scp_dcp_job.cc:133
+msgid "SSH error (%1)"
+msgstr "SSH fel (%1)"
+
+#: src/lib/format.cc:119
+msgid "Scope"
+msgstr "Scope"
+
+#: src/lib/format.cc:127
+msgid "Scope without stretch"
+msgstr "Scope utan utsträckning"
+
+#: src/lib/dcp_content_type.cc:45
+msgid "Short"
+msgstr "Kortfilm"
+
+#: src/lib/scaler.cc:67
+msgid "Sinc"
+msgstr "Sinc"
+
+#: src/lib/scaler.cc:68
+msgid "Spline"
+msgstr "Spline"
+
+#: src/lib/dcp_content_type.cc:50
+msgid "Teaser"
+msgstr "Teaser"
+
+#: src/lib/filter.cc:90
+msgid "Telecine filter"
+msgstr "Telecine-filter"
+
+#: src/lib/filter.cc:84
+msgid "Temporal noise reducer"
+msgstr "Temporal brusreducering"
+
+#: src/lib/dcp_content_type.cc:47
+msgid "Test"
+msgstr "Test"
+
+#: src/lib/job.cc:77
+msgid ""
+"The drive that the film is stored on is low in disc space. Free some more "
+"space and try again."
+msgstr ""
+"Enheten som filmen lagras på har för lite ledigt utrymme. Frigör utrymme och "
+"försök igen."
+
+#: src/lib/dcp_content_type.cc:46
+msgid "Trailer"
+msgstr "Trailer"
+
+#: src/lib/transcode_job.cc:54
+msgid "Transcode %1"
+msgstr "Konvertera %1"
+
+#: src/lib/dcp_content_type.cc:48
+msgid "Transitional"
+msgstr "Övergångsklipp"
+
+#: src/lib/job.cc:100
+msgid "Unknown error"
+msgstr "Okänt fel"
+
+# Svengelska
+#: src/lib/ffmpeg_decoder.cc:396
+#, fuzzy
+msgid "Unrecognised audio sample format (%1)"
+msgstr "Okänt audio-sampelformat (%1)"
+
+#: src/lib/filter.cc:87
+msgid "Unsharp mask and Gaussian blur"
+msgstr "Oskärpemask och Gaussisk suddighet"
+
+#: src/lib/filter.cc:69
+msgid "Vertical deblocking filter"
+msgstr "Filter för vertikal kantighetsutjämning"
+
+#: src/lib/filter.cc:71
+msgid "Vertical deblocking filter A"
+msgstr "Filter för vertikal kantighetsutjämning A"
+
+#: src/lib/scp_dcp_job.cc:101
+msgid "Waiting"
+msgstr "Väntar"
+
+#: src/lib/scaler.cc:63
+msgid "X"
+msgstr "X"
+
+# Filtret heter så, ska ej översättas
+#: src/lib/filter.cc:83
+msgid "Yet Another Deinterlacing Filter"
+msgstr "Yet Another Deinterlacing Filter"
+
+#: src/lib/film.cc:263
+msgid "cannot contain slashes"
+msgstr "får inte innehålla snedstreck"
+
+# Svengelska
+#: src/lib/util.cc:541
+#, fuzzy
+msgid "connect timed out"
+msgstr "uppkopplingen tajmade ur"
+
+#: src/lib/scp_dcp_job.cc:119
+msgid "connecting"
+msgstr "kopplar upp"
+
+#: src/lib/film.cc:300
+msgid "content"
+msgstr "innehåll"
+
+#: src/lib/film.cc:304
+msgid "content type"
+msgstr "innehållstyp"
+
+#: src/lib/scp_dcp_job.cc:168
+msgid "copying %1"
+msgstr "kopierar %1"
+
+#: src/lib/exceptions.cc:36
+msgid "could not create file %1"
+msgstr "kunde inte skapa fil %1"
+
+#: src/lib/ffmpeg_decoder.cc:191
+msgid "could not find audio decoder"
+msgstr "kunde inte hitta audio-avkodare"
+
+#: src/lib/ffmpeg_decoder.cc:118
+msgid "could not find stream information"
+msgstr "kunde inte hitta information om strömmen"
+
+#: src/lib/ffmpeg_decoder.cc:210
+msgid "could not find subtitle decoder"
+msgstr "kunde inte hitta undertext-avkodare"
+
+#: src/lib/ffmpeg_decoder.cc:169
+msgid "could not find video decoder"
+msgstr "kunde inte hitta video-avkodare"
+
+#: src/lib/sndfile_decoder.cc:72
+msgid "could not open external audio file for reading"
+msgstr "kunde inte öppna extern audio-fil för läsning"
+
+#: src/lib/exceptions.cc:29
+msgid "could not open file %1"
+msgstr "kunde inte öppna fil %1"
+
+#: src/lib/dcp_video_frame.cc:388
+msgid "could not open file for reading"
+msgstr "kunde inte öppna fil för läsning"
+
+#: src/lib/exceptions.cc:44
+msgid "could not read from file %1 (%2)"
+msgstr "kunde inte läsa från fil %1 (%2)"
+
+#: src/lib/encoder.cc:137 src/lib/encoder.cc:314
+msgid "could not run sample-rate converter"
+msgstr "kunde inte köra sampelhastighetskonverteraren"
+
+#: src/lib/scp_dcp_job.cc:86
+msgid "could not start SCP session (%1)"
+msgstr "kunde inte starta SCP-session (%1)"
+
+#: src/lib/scp_dcp_job.cc:52
+msgid "could not start SSH session"
+msgstr "kunde inte starta SSH-session"
+
+#: src/lib/exceptions.cc:50
+msgid "could not write to file %1 (%2)"
+msgstr "kunde inte skriva till fil %1 (%2)"
+
+#: src/lib/sndfile_decoder.cc:94
+msgid "external audio files have differing lengths"
+msgstr "externa audio-filer har olika längder"
+
+#: src/lib/sndfile_decoder.cc:76
+msgid "external audio files must be mono"
+msgstr "externa audio-filer måste vara mono"
+
+#: src/lib/film.cc:296
+msgid "format"
+msgstr "format"
+
+#: src/lib/transcode_job.cc:100
+msgid "frames per second"
+msgstr "bilder per sekund"
+
+#: src/lib/util.cc:115
+msgid "hour"
+msgstr "timme"
+
+#: src/lib/util.cc:112 src/lib/util.cc:117
+msgid "hours"
+msgstr "timmar"
+
+#: src/lib/util.cc:122
+msgid "minute"
+msgstr "minut"
+
+#: src/lib/util.cc:124
+msgid "minutes"
+msgstr "minuter"
+
+#: src/lib/util.cc:684
+msgid "missing key %1 in key-value set"
+msgstr "saknad nyckel %1 i nyckel-värde grupp"
+
+#: src/lib/exceptions.cc:54
+msgid "missing required setting %1"
+msgstr "saknad nödvändig inställning %1"
+
+#: src/lib/subtitle.cc:52
+msgid "multi-part subtitles not yet supported"
+msgstr "undertexter i flera delar stöds inte ännu"
+
+#: src/lib/film.cc:263 src/lib/film.cc:308
+msgid "name"
+msgstr "namn"
+
+#: src/lib/imagemagick_decoder.cc:60
+msgid "no still image files found"
+msgstr "inga stillbildsfiler hittade"
+
+#: src/lib/subtitle.cc:58
+msgid "non-bitmap subtitles not yet supported"
+msgstr "icke-rastergrafiska undertexter stöds inte ännu"
+
+#. / TRANSLATORS: remaining here follows an amount of time that is remaining
+#. / on an operation.
+#: src/lib/job.cc:295
+msgid "remaining"
+msgstr "återstående tid"
+
+#: src/lib/util.cc:498
+msgid "sRGB"
+msgstr "sRGB"
+
+#: src/lib/util.cc:127
+msgid "seconds"
+msgstr "sekunder"
+
+#: src/lib/film.cc:274
+msgid "still"
+msgstr "stillbild"
+
+#: src/lib/film.cc:274
+msgid "video"
+msgstr "video"
+
+#~ msgid "Source scaled to 1.19:1"
+#~ msgstr "Källan skalad till 1,19:1"
+
+#~ msgid "Source scaled to 1.33:1"
+#~ msgstr "Källan skalad till 1,33:1"
+
+#~ msgid "Source scaled to 1.33:1 then pillarboxed to Flat"
+#~ msgstr "Källan skalad till 1,33:1, med sorgkanter innanför Flat"
+
+#~ msgid "Source scaled to 1.375:1"
+#~ msgstr "Källan skalad till 1,375:1"
+
+#~ msgid "Source scaled to 1.37:1 (Academy ratio)"
+#~ msgstr "Källan skalad till 1,37:1 (Academy-förhållande)"
+
+#~ msgid "Source scaled to 1.66:1"
+#~ msgstr "Källan skalad till 1,66:1"
+
+#~ msgid "Source scaled to 1.66:1 then pillarboxed to Flat"
+#~ msgstr "Källan skalad till 1,66:1, med sorgkanter innanför Flat"
+
+#~ msgid "Source scaled to 1.78:1"
+#~ msgstr "Källan skalad till 1,78:1"
+
+#~ msgid "Source scaled to 1.78:1 then pillarboxed to Flat"
+#~ msgstr "Källan skalad till 1,78:1, med sorgkanter innanför Flat"
+
+#~ msgid "Source scaled to Flat (1.85:1)"
+#~ msgstr "Källan skalad till Flat (1,85:1)"
+
+#~ msgid "Source scaled to Scope (2.39:1)"
+#~ msgstr "Källan skalad till Scope (2,39:1)"
+
+#~ msgid "Source scaled to fit Flat preserving its aspect ratio"
+#~ msgstr ""
+#~ "Källan skalad för att rymmas inom Flat utan att ändra bildförhållandet"
+
+#~ msgid "Source scaled to fit Scope preserving its aspect ratio"
+#~ msgstr ""
+#~ "Källan skalad för att rymmas inom Scope utan att ändra bildförhållandet"
diff --git a/src/lib/processor.h b/src/lib/processor.h
index 863bfdbb5..1ba396f2f 100644
--- a/src/lib/processor.h
+++ b/src/lib/processor.h
@@ -40,7 +40,7 @@ public:
/** Construct a Processor.
* @param log Log to use.
*/
- Processor (Log* log)
+ Processor (boost::shared_ptr<Log> log)
: _log (log)
{}
@@ -50,7 +50,49 @@ public:
virtual void process_end () {}
protected:
- Log* _log; ///< log to write to
+ boost::shared_ptr<Log> _log; ///< log to write to
+};
+
+/** @class AudioVideoProcessor
+ * @brief A processor which handles both video and audio data.
+ */
+class AudioVideoProcessor : public Processor, public VideoSource, public VideoSink, public AudioSource, public AudioSink
+{
+public:
+ /** Construct an AudioVideoProcessor.
+ * @param log Log to write to.
+ */
+ AudioVideoProcessor (boost::shared_ptr<Log> log)
+ : Processor (log)
+ {}
+};
+
+/** @class AudioProcessor
+ * @brief A processor which handles just audio data.
+ */
+class AudioProcessor : public Processor, public AudioSource, public AudioSink
+{
+public:
+ /** Construct an AudioProcessor.
+ * @param log Log to write to.
+ */
+ AudioProcessor (boost::shared_ptr<Log> log)
+ : Processor (log)
+ {}
+};
+
+/** @class VideoProcessor
+ * @brief A processor which handles just video data.
+ */
+class VideoProcessor : public Processor, public VideoSource, public VideoSink
+{
+public:
+ /** Construct an VideoProcessor.
+ * @param log Log to write to.
+ */
+ VideoProcessor (boost::shared_ptr<Log> log)
+ : Processor (log)
+ {}
};
#endif
diff --git a/src/lib/server.cc b/src/lib/server.cc
index 76a25bfbb..9c5a77f68 100644
--- a/src/lib/server.cc
+++ b/src/lib/server.cc
@@ -77,7 +77,7 @@ ServerDescription::as_metadata () const
return s.str ();
}
-Server::Server (Log* log)
+Server::Server (shared_ptr<Log> log)
: _log (log)
{
diff --git a/src/lib/server.h b/src/lib/server.h
index 32ba8dc4b..89aeca626 100644
--- a/src/lib/server.h
+++ b/src/lib/server.h
@@ -76,7 +76,7 @@ private:
class Server
{
public:
- Server (Log* log);
+ Server (boost::shared_ptr<Log> log);
void run (int num_threads);
@@ -88,5 +88,5 @@ private:
std::list<boost::shared_ptr<Socket> > _queue;
boost::mutex _worker_mutex;
boost::condition _worker_condition;
- Log* _log;
+ boost::shared_ptr<Log> _log;
};
diff --git a/src/lib/external_audio_decoder.cc b/src/lib/sndfile_decoder.cc
index 50e5852c5..0e3e5e234 100644
--- a/src/lib/external_audio_decoder.cc
+++ b/src/lib/sndfile_decoder.cc
@@ -19,7 +19,7 @@
#include <iostream>
#include <sndfile.h>
-#include "external_audio_decoder.h"
+#include "sndfile_decoder.h"
#include "film.h"
#include "exceptions.h"
@@ -33,7 +33,7 @@ using std::cout;
using boost::shared_ptr;
using boost::optional;
-ExternalAudioDecoder::ExternalAudioDecoder (shared_ptr<Film> f, DecodeOptions o)
+SndfileDecoder::SndfileDecoder (shared_ptr<Film> f, DecodeOptions o)
: Decoder (f, o)
, AudioDecoder (f, o)
{
@@ -43,7 +43,7 @@ ExternalAudioDecoder::ExternalAudioDecoder (shared_ptr<Film> f, DecodeOptions o)
}
vector<SNDFILE*>
-ExternalAudioDecoder::open_files (sf_count_t & frames)
+SndfileDecoder::open_files (sf_count_t & frames)
{
vector<string> const files = _film->external_audio ();
@@ -79,8 +79,8 @@ ExternalAudioDecoder::open_files (sf_count_t & frames)
sndfiles.push_back (s);
if (first) {
- shared_ptr<ExternalAudioStream> st (
- new ExternalAudioStream (
+ shared_ptr<SndfileStream> st (
+ new SndfileStream (
info.samplerate, av_get_default_channel_layout (N)
)
);
@@ -101,7 +101,7 @@ ExternalAudioDecoder::open_files (sf_count_t & frames)
}
bool
-ExternalAudioDecoder::pass ()
+SndfileDecoder::pass ()
{
sf_count_t frames;
vector<SNDFILE*> sndfiles = open_files (frames);
@@ -115,7 +115,6 @@ ExternalAudioDecoder::pass ()
sf_count_t const block = _audio_stream->sample_rate() / 2;
shared_ptr<AudioBuffers> audio (new AudioBuffers (_audio_stream->channels(), block));
- sf_count_t done = 0;
while (frames > 0) {
sf_count_t const this_time = min (block, frames);
for (size_t i = 0; i < sndfiles.size(); ++i) {
@@ -127,8 +126,7 @@ ExternalAudioDecoder::pass ()
}
audio->set_frames (this_time);
- Audio (audio, double(done) / _audio_stream->sample_rate());
- done += this_time;
+ Audio (audio);
frames -= this_time;
}
@@ -138,38 +136,38 @@ ExternalAudioDecoder::pass ()
}
void
-ExternalAudioDecoder::close_files (vector<SNDFILE*> const & sndfiles)
+SndfileDecoder::close_files (vector<SNDFILE*> const & sndfiles)
{
for (size_t i = 0; i < sndfiles.size(); ++i) {
sf_close (sndfiles[i]);
}
}
-shared_ptr<ExternalAudioStream>
-ExternalAudioStream::create ()
+shared_ptr<SndfileStream>
+SndfileStream::create ()
{
- return shared_ptr<ExternalAudioStream> (new ExternalAudioStream);
+ return shared_ptr<SndfileStream> (new SndfileStream);
}
-shared_ptr<ExternalAudioStream>
-ExternalAudioStream::create (string t, optional<int> v)
+shared_ptr<SndfileStream>
+SndfileStream::create (string t, optional<int> v)
{
if (!v) {
/* version < 1; no type in the string, and there's only FFmpeg streams anyway */
- return shared_ptr<ExternalAudioStream> ();
+ return shared_ptr<SndfileStream> ();
}
stringstream s (t);
string type;
s >> type;
if (type != N_("external")) {
- return shared_ptr<ExternalAudioStream> ();
+ return shared_ptr<SndfileStream> ();
}
- return shared_ptr<ExternalAudioStream> (new ExternalAudioStream (t, v));
+ return shared_ptr<SndfileStream> (new SndfileStream (t, v));
}
-ExternalAudioStream::ExternalAudioStream (string t, optional<int> v)
+SndfileStream::SndfileStream (string t, optional<int> v)
{
assert (v);
@@ -178,13 +176,13 @@ ExternalAudioStream::ExternalAudioStream (string t, optional<int> v)
s >> type >> _sample_rate >> _channel_layout;
}
-ExternalAudioStream::ExternalAudioStream ()
+SndfileStream::SndfileStream ()
{
}
string
-ExternalAudioStream::to_string () const
+SndfileStream::to_string () const
{
return String::compose (N_("external %1 %2"), _sample_rate, _channel_layout);
}
diff --git a/src/lib/external_audio_decoder.h b/src/lib/sndfile_decoder.h
index 6f010abb1..e16eab673 100644
--- a/src/lib/external_audio_decoder.h
+++ b/src/lib/sndfile_decoder.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2013 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
@@ -22,29 +22,29 @@
#include "audio_decoder.h"
#include "stream.h"
-class ExternalAudioStream : public AudioStream
+class SndfileStream : public AudioStream
{
public:
- ExternalAudioStream (int sample_rate, int64_t layout)
+ SndfileStream (int sample_rate, int64_t layout)
: AudioStream (sample_rate, layout)
{}
std::string to_string () const;
- static boost::shared_ptr<ExternalAudioStream> create ();
- static boost::shared_ptr<ExternalAudioStream> create (std::string t, boost::optional<int> v);
+ static boost::shared_ptr<SndfileStream> create ();
+ static boost::shared_ptr<SndfileStream> create (std::string t, boost::optional<int> v);
private:
friend class stream_test;
- ExternalAudioStream ();
- ExternalAudioStream (std::string t, boost::optional<int> v);
+ SndfileStream ();
+ SndfileStream (std::string t, boost::optional<int> v);
};
-class ExternalAudioDecoder : public AudioDecoder
+class SndfileDecoder : public AudioDecoder
{
public:
- ExternalAudioDecoder (boost::shared_ptr<Film>, DecodeOptions);
+ SndfileDecoder (boost::shared_ptr<Film>, DecodeOptions);
bool pass ();
diff --git a/src/lib/stream.cc b/src/lib/stream.cc
index e5a2bbc2b..bfe7b5eb4 100644
--- a/src/lib/stream.cc
+++ b/src/lib/stream.cc
@@ -21,7 +21,7 @@
#include "compose.hpp"
#include "stream.h"
#include "ffmpeg_decoder.h"
-#include "external_audio_decoder.h"
+#include "sndfile_decoder.h"
#include "i18n.h"
@@ -74,7 +74,7 @@ audio_stream_factory (string t, optional<int> v)
s = FFmpegAudioStream::create (t, v);
if (!s) {
- s = ExternalAudioStream::create (t, v);
+ s = SndfileStream::create (t, v);
}
return s;
diff --git a/src/lib/transcode_job.cc b/src/lib/transcode_job.cc
index f7cc500fe..234ebe051 100644
--- a/src/lib/transcode_job.cc
+++ b/src/lib/transcode_job.cc
@@ -68,10 +68,7 @@ TranscodeJob::run ()
set_progress (1);
set_state (FINISHED_OK);
- _film->set_dcp_intrinsic_duration (_encoder->video_frames_out ());
-
_film->log()->log (N_("Transcode job completed successfully"));
- _film->log()->log (String::compose (N_("DCP intrinsic duration is %1"), _encoder->video_frames_out()));
} catch (std::exception& e) {
diff --git a/src/lib/transcoder.cc b/src/lib/transcoder.cc
index 8e5e15e7f..8046080de 100644
--- a/src/lib/transcoder.cc
+++ b/src/lib/transcoder.cc
@@ -38,7 +38,6 @@
#include "audio_decoder.h"
using std::string;
-using std::cout;
using boost::shared_ptr;
using boost::dynamic_pointer_cast;
@@ -64,9 +63,18 @@ Transcoder::Transcoder (shared_ptr<Film> f, DecodeOptions o, Job* j, shared_ptr<
_decoders.video->set_subtitle_stream (f->subtitle_stream ());
_decoders.audio->set_audio_stream (f->audio_stream ());
+<<<<<<< HEAD
_decoders.video->connect_video (_delay_line);
_delay_line->connect_video (_matcher);
_matcher->connect_video (_encoder);
+=======
+ if (_matcher) {
+ _decoders.video->connect_video (_matcher);
+ _matcher->connect_video (_encoder);
+ } else {
+ _decoders.video->connect_video (_encoder);
+ }
+>>>>>>> master
_decoders.audio->connect_audio (_delay_line);
_delay_line->connect_audio (_matcher);
diff --git a/src/lib/util.cc b/src/lib/util.cc
index 53bdb4c79..557e9a34b 100644
--- a/src/lib/util.cc
+++ b/src/lib/util.cc
@@ -235,9 +235,6 @@ seconds (struct timeval t)
void
dvdomatic_setup ()
{
- bindtextdomain ("libdvdomatic", LOCALE_PREFIX);
- setlocale (LC_ALL, "");
-
avfilter_register_all ();
Format::setup_formats ();
@@ -249,6 +246,51 @@ dvdomatic_setup ()
ui_thread = this_thread::get_id ();
}
+#ifdef DVDOMATIC_WINDOWS
+boost::filesystem::path
+mo_path ()
+{
+ wchar_t buffer[512];
+ GetModuleFileName (0, buffer, 512 * sizeof(wchar_t));
+ boost::filesystem::path p (buffer);
+ p = p.parent_path ();
+ p = p.parent_path ();
+ p /= "locale";
+ return p;
+}
+#endif
+
+void
+dvdomatic_setup_i18n (string lang)
+{
+#ifdef DVDOMATIC_POSIX
+ lang += ".UTF8";
+#endif
+
+ if (!lang.empty ()) {
+ /* Override our environment language; this is essential on
+ Windows.
+ */
+ 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);
+ }
+
+ setlocale (LC_ALL, "");
+ textdomain ("libdvdomatic");
+
+#ifdef DVDOMATIC_WINDOWS
+ bindtextdomain ("libdvdomatic", mo_path().string().c_str());
+ bind_textdomain_codeset ("libdvdomatic", "UTF8");
+#endif
+
+#ifdef DVDOMATIC_POSIX
+ bindtextdomain ("libdvdomatic", POSIX_LOCALE_PREFIX);
+#endif
+}
+
/** @param start Start position for the crop within the image.
* @param size Size of the cropped area.
* @return FFmpeg crop filter string.
@@ -885,12 +927,12 @@ audio_channel_name (int c)
enhancement channel (sub-woofer)./
*/
string const channels[] = {
- "Left",
- "Right",
- "Centre",
- "Lfe (sub)",
- "Left surround",
- "Right surround",
+ _("Left"),
+ _("Right"),
+ _("Centre"),
+ _("Lfe (sub)"),
+ _("Left surround"),
+ _("Right surround"),
};
return channels[c];
@@ -972,7 +1014,7 @@ FrameRateConversion::FrameRateConversion (float source, int dcp)
if (change_speed) {
float const pc = dcp * 100 / (source * factor());
- description += String::compose (_("DCP will run at %1%% of the source speed."), pc);
+ description += String::compose (_("DCP will run at %1%% of the source speed.\n"), pc);
}
}
}
diff --git a/src/lib/util.h b/src/lib/util.h
index ec67469c1..3d251cf06 100644
--- a/src/lib/util.h
+++ b/src/lib/util.h
@@ -30,6 +30,7 @@
#include <boost/shared_ptr.hpp>
#include <boost/asio.hpp>
#include <boost/optional.hpp>
+#include <boost/filesystem.hpp>
#include <libdcp/util.h>
extern "C" {
#include <libavcodec/avcodec.h>
@@ -54,11 +55,15 @@ extern void stacktrace (std::ostream &, int);
extern std::string dependency_version_summary ();
extern double seconds (struct timeval);
extern void dvdomatic_setup ();
+extern void dvdomatic_setup_i18n (std::string);
extern std::vector<std::string> split_at_spaces_considering_quotes (std::string);
extern std::string md5_digest (std::string);
extern std::string md5_digest (void const *, int);
extern void ensure_ui_thread ();
extern std::string audio_channel_name (int);
+#ifdef DVDOMATIC_WINDOWS
+extern boost::filesystem::path mo_path ();
+#endif
typedef int SourceFrame;
diff --git a/src/lib/video_decoder.h b/src/lib/video_decoder.h
index 6e4fd48c0..f8612dff2 100644
--- a/src/lib/video_decoder.h
+++ b/src/lib/video_decoder.h
@@ -24,7 +24,7 @@
#include "stream.h"
#include "decoder.h"
-class VideoDecoder : public TimedVideoSource, public virtual Decoder
+class VideoDecoder : public VideoSource, public virtual Decoder
{
public:
VideoDecoder (boost::shared_ptr<Film>, DecodeOptions);
diff --git a/src/lib/video_sink.h b/src/lib/video_sink.h
index 32c7f3b38..7c128cf73 100644
--- a/src/lib/video_sink.h
+++ b/src/lib/video_sink.h
@@ -37,16 +37,4 @@ public:
virtual void process_video (boost::shared_ptr<Image> i, bool same, boost::shared_ptr<Subtitle> s) = 0;
};
-class TimedVideoSink
-{
-public:
- /** Call with a frame of video.
- * @param i Video frame image.
- * @param same true if i is the same as last time we were called.
- * @param s A subtitle that should be on this frame, or 0.
- * @param t Source timestamp.
- */
- virtual void process_video (boost::shared_ptr<Image> i, bool same, boost::shared_ptr<Subtitle> s, double t) = 0;
-};
-
#endif
diff --git a/src/lib/video_source.cc b/src/lib/video_source.cc
index af6f941fd..56742e2b4 100644
--- a/src/lib/video_source.cc
+++ b/src/lib/video_source.cc
@@ -28,9 +28,3 @@ VideoSource::connect_video (shared_ptr<VideoSink> s)
{
Video.connect (bind (&VideoSink::process_video, s, _1, _2, _3));
}
-
-void
-TimedVideoSource::connect_video (shared_ptr<TimedVideoSink> s)
-{
- Video.connect (bind (&TimedVideoSink::process_video, s, _1, _2, _3, _4));
-}
diff --git a/src/lib/video_source.h b/src/lib/video_source.h
index 705b0023a..893629160 100644
--- a/src/lib/video_source.h
+++ b/src/lib/video_source.h
@@ -29,12 +29,11 @@
#include "util.h"
class VideoSink;
-class TimedVideoSink;
class Subtitle;
class Image;
-/** @class VideoSource
- * @param A class that emits video data without timestamps.
+/** @class VideoSink
+ * @param A class that emits video data.
*/
class VideoSource
{
@@ -50,22 +49,4 @@ public:
void connect_video (boost::shared_ptr<VideoSink>);
};
-/** @class TimedVideoSource
- * @param A class that emits video data with timestamps.
- */
-class TimedVideoSource
-{
-public:
-
- /** Emitted when a video frame is ready.
- * First parameter is the video image.
- * Second parameter is true if the image is the same as the last one that was emitted.
- * Third parameter is either 0 or a subtitle that should be on this frame.
- * Fourth parameter is the source timestamp of this frame.
- */
- boost::signals2::signal<void (boost::shared_ptr<Image>, bool, boost::shared_ptr<Subtitle>, double)> Video;
-
- void connect_video (boost::shared_ptr<TimedVideoSink>);
-};
-
#endif
diff --git a/src/lib/writer.cc b/src/lib/writer.cc
index 5a2f7c9a9..c6ce4711d 100644
--- a/src/lib/writer.cc
+++ b/src/lib/writer.cc
@@ -65,8 +65,8 @@ Writer::Writer (shared_ptr<Film> f)
_picture_asset.reset (
new libdcp::MonoPictureAsset (
- _film->video_mxf_dir (),
- _film->video_mxf_filename (),
+ _film->internal_video_mxf_dir (),
+ _film->internal_video_mxf_filename (),
_film->dcp_frame_rate (),
_film->format()->dcp_size ()
)
@@ -80,7 +80,7 @@ Writer::Writer (shared_ptr<Film> f)
_sound_asset.reset (
new libdcp::SoundAsset (
_film->dir (_film->dcp_name()),
- N_("audio.mxf"),
+ _film->dcp_audio_mxf_filename (),
_film->dcp_frame_rate (),
m.dcp_channels (),
dcp_audio_sample_rate (_film->audio_stream()->sample_rate())
@@ -261,27 +261,31 @@ Writer::finish ()
int const frames = _last_written_frame + 1;
int const duration = frames - _film->trim_start() - _film->trim_end();
- _film->set_dcp_intrinsic_duration (frames);
-
_picture_asset->set_entry_point (_film->trim_start ());
_picture_asset->set_duration (duration);
/* Hard-link the video MXF into the DCP */
boost::filesystem::path from;
- from /= _film->video_mxf_dir();
- from /= _film->video_mxf_filename();
+ from /= _film->internal_video_mxf_dir();
+ from /= _film->internal_video_mxf_filename();
boost::filesystem::path to;
to /= _film->dir (_film->dcp_name());
- to /= N_("video.mxf");
-
- boost::filesystem::create_hard_link (from, to);
+ to /= _film->dcp_video_mxf_filename ();
+
+ boost::system::error_code ec;
+ boost::filesystem::create_hard_link (from, to, ec);
+ if (ec) {
+ /* hard link failed; copy instead */
+ boost::filesystem::copy_file (from, to);
+ _film->log()->log ("Hard-link failed; fell back to copying");
+ }
/* And update the asset */
_picture_asset->set_directory (_film->dir (_film->dcp_name ()));
- _picture_asset->set_file_name (N_("video.mxf"));
+ _picture_asset->set_file_name (_film->dcp_video_mxf_filename ());
if (_sound_asset) {
_sound_asset->set_entry_point (_film->trim_start ());
@@ -335,8 +339,8 @@ Writer::check_existing_picture_mxf ()
{
/* Try to open the existing MXF */
boost::filesystem::path p;
- p /= _film->video_mxf_dir ();
- p /= _film->video_mxf_filename ();
+ p /= _film->internal_video_mxf_dir ();
+ p /= _film->internal_video_mxf_filename ();
FILE* mxf = fopen (p.string().c_str(), N_("rb"));
if (!mxf) {
return;
diff --git a/src/lib/wscript b/src/lib/wscript
index d36a24e7a..8e9d34706 100644
--- a/src/lib/wscript
+++ b/src/lib/wscript
@@ -20,7 +20,7 @@ sources = """
dolby_cp750.cc
encoder.cc
examine_content_job.cc
- external_audio_decoder.cc
+ exceptions.cc
filter_graph.cc
ffmpeg_compatibility.cc
ffmpeg_decoder.cc
@@ -38,6 +38,7 @@ sources = """
scp_dcp_job.cc
scaler.cc
server.cc
+ sndfile_decoder.cc
sound_processor.cc
stream.cc
subtitle.cc
@@ -46,7 +47,6 @@ sources = """
transcoder.cc
ui_signaller.cc
util.cc
- version.cc
video_decoder.cc
video_source.cc
writer.cc
@@ -67,10 +67,13 @@ def build(bld):
"""
if bld.env.TARGET_WINDOWS:
obj.uselib += ' WINSOCK2'
- obj.source = sources
+ obj.source = sources + " version.cc"
obj.target = 'dvdomatic'
i18n.po_to_mo(os.path.join('src', 'lib'), 'libdvdomatic', bld)
def pot(bld):
i18n.pot(os.path.join('src', 'lib'), sources, 'libdvdomatic')
+
+def pot_merge(bld):
+ i18n.pot_merge(os.path.join('src', 'lib'), 'libdvdomatic')
diff --git a/src/tools/dvdomatic.cc b/src/tools/dvdomatic.cc
index f5d9bdf18..212d4848e 100644
--- a/src/tools/dvdomatic.cc
+++ b/src/tools/dvdomatic.cc
@@ -71,7 +71,7 @@ public:
{
_dialog = new wxMessageDialog (
0,
- std_to_wx (String::compose ("Save changes to film \"%1\" before closing?", film->name())),
+ wxString::Format (_("Save changes to film \"%s\" before closing?"), std_to_wx (film->name ()).data()),
_("Film changed"),
wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION
);
@@ -284,7 +284,7 @@ private:
void file_changed (string f)
{
stringstream s;
- s << _("DVD-o-matic");
+ s << wx_to_std (_("DVD-o-matic"));
if (!f.empty ()) {
s << " - " << f;
}
@@ -300,7 +300,7 @@ private:
if (r == wxID_OK) {
if (boost::filesystem::exists (d->get_path())) {
- error_dialog (this, wxString::Format (_("The directory %s already exists."), d->get_path().c_str()));
+ error_dialog (this, std_to_wx (String::compose (wx_to_std (_("The directory %1 already exists.")), d->get_path().c_str())));
return;
}
@@ -317,8 +317,16 @@ private:
void file_open (wxCommandEvent &)
{
wxDirDialog* c = new wxDirDialog (this, _("Select film to open"), wxStandardPaths::Get().GetDocumentsDir(), wxDEFAULT_DIALOG_STYLE | wxDD_DIR_MUST_EXIST);
- int const r = c->ShowModal ();
-
+ int r;
+ while (1) {
+ r = c->ShowModal ();
+ if (r == wxID_OK && c->GetPath() == wxStandardPaths::Get().GetDocumentsDir()) {
+ error_dialog (this, _("You did not select a folder. Make sure that you select a folder before clicking Open."));
+ } else {
+ break;
+ }
+ }
+
if (r == wxID_OK) {
maybe_save_then_delete_film ();
try {
@@ -328,7 +336,7 @@ private:
} catch (std::exception& e) {
wxString p = c->GetPath ();
wxCharBuffer b = p.ToUTF8 ();
- error_dialog (this, wxString::Format (_("Could not open film at %s (%s)"), p.data(), e.what()));
+ error_dialog (this, wxString::Format (_("Could not open film at %s (%s)"), p.data(), std_to_wx (e.what()).data()));
}
}
@@ -407,12 +415,23 @@ private:
}
info.SetDescription (_("Free, open-source DCP generation from almost anything."));
info.SetCopyright (_("(C) 2012-2013 Carl Hetherington, Terrence Meiczinger, Paul Davis, Ole Laursen"));
+
wxArrayString authors;
authors.Add (wxT ("Carl Hetherington"));
authors.Add (wxT ("Terrence Meiczinger"));
authors.Add (wxT ("Paul Davis"));
authors.Add (wxT ("Ole Laursen"));
info.SetDevelopers (authors);
+
+ wxArrayString translators;
+ translators.Add (wxT ("Olivier Perriere"));
+ translators.Add (wxT ("Lilian Lefranc"));
+ translators.Add (wxT ("Thierry Journet"));
+ translators.Add (wxT ("Massimiliano Broggi"));
+ translators.Add (wxT ("Manuel AC"));
+ translators.Add (wxT ("Adam Klotblixt"));
+ info.SetTranslators (translators);
+
info.SetWebSite (wxT ("http://carlh.net/software/dvdomatic"));
wxAboutBox (info);
}
@@ -438,13 +457,20 @@ void
setup_i18n ()
{
int language = wxLANGUAGE_DEFAULT;
+
+ if (Config::instance()->language()) {
+ wxLanguageInfo const * li = wxLocale::FindLanguageInfo (std_to_wx (Config::instance()->language().get()));
+ if (li) {
+ language = li->Language;
+ }
+ }
if (wxLocale::IsAvailable (language)) {
locale = new wxLocale (language, wxLOCALE_LOAD_DEFAULT);
-#ifdef __WXGTK__
- locale->AddCatalogLookupPathPrefix (wxT (LOCALE_PREFIX "/locale"));
-#endif
+#ifdef DVDOMATIC_WINDOWS
+ locale->AddCatalogLookupPathPrefix (std_to_wx (mo_path().string()));
+#endif
locale->AddCatalog (wxT ("libdvdomatic-wx"));
locale->AddCatalog (wxT ("dvdomatic"));
@@ -455,6 +481,10 @@ setup_i18n ()
language = wxLANGUAGE_ENGLISH;
}
}
+
+ if (locale) {
+ dvdomatic_setup_i18n (wx_to_std (locale->GetCanonicalName ()));
+ }
}
class App : public wxApp
@@ -468,12 +498,27 @@ class App : public wxApp
#ifdef DVDOMATIC_POSIX
unsetenv ("UBUNTU_MENUPROXY");
#endif
-
+
wxInitAllImageHandlers ();
+
+ /* Enable i18n; this will create a Config object
+ to look for a force-configured language. This Config
+ object will be wrong, however, because dvdomatic_setup
+ hasn't yet been called and there aren't any scalers, filters etc.
+ set up yet.
+ */
setup_i18n ();
-
+
+ /* Set things up, including scalers / filters etc.
+ which will now be internationalised correctly.
+ */
dvdomatic_setup ();
+ /* Force the configuration to be re-loaded correctly next
+ time it is needed.
+ */
+ Config::drop ();
+
if (!film_to_load.empty() && boost::filesystem::is_directory (film_to_load)) {
try {
film.reset (new Film (film_to_load));
diff --git a/src/tools/po/es_ES.po b/src/tools/po/es_ES.po
new file mode 100644
index 000000000..abfbfef6d
--- /dev/null
+++ b/src/tools/po/es_ES.po
@@ -0,0 +1,128 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: DVDOMATIC\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-04-09 11:14+0100\n"
+"PO-Revision-Date: 2013-03-23 21:08-0500\n"
+"Last-Translator: Manuel AC <manuel.acevedo@civantos.>\n"
+"Language-Team: Manuel AC <manuel.acevedo@civantos.com>\n"
+"Language: es-ES\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.5\n"
+
+#: src/tools/dvdomatic.cc:177
+msgid "&Analyse audio"
+msgstr "&Analizar audio"
+
+#: src/tools/dvdomatic.cc:183
+msgid "&Edit"
+msgstr "&Editar"
+
+#: src/tools/dvdomatic.cc:182
+msgid "&File"
+msgstr "&Archivo"
+
+#: src/tools/dvdomatic.cc:185
+msgid "&Help"
+msgstr "&Ayuda"
+
+#: src/tools/dvdomatic.cc:184
+msgid "&Jobs"
+msgstr "&Tareas"
+
+#: src/tools/dvdomatic.cc:173
+msgid "&Make DCP"
+msgstr "&Crear DCP"
+
+#: src/tools/dvdomatic.cc:161
+msgid "&Open..."
+msgstr "&Abrir..."
+
+#: src/tools/dvdomatic.cc:170
+msgid "&Preferences..."
+msgstr "&Preferencias..."
+
+#: src/tools/dvdomatic.cc:165
+msgid "&Properties..."
+msgstr "&Propiedades..."
+
+#: src/tools/dvdomatic.cc:167
+msgid "&Quit"
+msgstr "&Salir"
+
+#: src/tools/dvdomatic.cc:163
+msgid "&Save"
+msgstr "&Guardar"
+
+#: src/tools/dvdomatic.cc:174
+msgid "&Send DCP to TMS"
+msgstr "&Enviar DCP al TMS"
+
+#: src/tools/dvdomatic.cc:417
+msgid ""
+"(C) 2012-2013 Carl Hetherington, Terrence Meiczinger, Paul Davis, Ole Laursen"
+msgstr ""
+"(C) 2012-2013 Carl Hetherington, Terrence Meiczinger, Paul Davis, Ole Laursen"
+
+#: src/tools/dvdomatic.cc:180
+msgid "About"
+msgstr "Acerca de"
+
+#: src/tools/dvdomatic.cc:527
+#, fuzzy
+msgid "Could not load film %1 (%2)"
+msgstr "No se pudo cargar la película %s (%s)"
+
+#: src/tools/dvdomatic.cc:339
+#, c-format
+msgid "Could not open film at %s (%s)"
+msgstr "No se pudo cargar la película en %s (%s)"
+
+#: src/tools/dvdomatic.cc:287 src/tools/dvdomatic.cc:410
+#: src/tools/dvdomatic.cc:531
+msgid "DVD-o-matic"
+msgstr "DVD-o-matic"
+
+#: src/tools/dvdomatic.cc:75
+msgid "Film changed"
+msgstr "Película cambiada"
+
+#: src/tools/dvdomatic.cc:416
+msgid "Free, open-source DCP generation from almost anything."
+msgstr ""
+"Generación de DCP a partir de casi cualquier fuente, libre y de código "
+"abierto."
+
+#: src/tools/dvdomatic.cc:160
+msgid "New..."
+msgstr "Nuevo..."
+
+#: src/tools/dvdomatic.cc:175
+msgid "S&how DCP"
+msgstr "&Mostrar DCP"
+
+#: src/tools/dvdomatic.cc:74
+msgid "Save changes to film \"%s\" before closing?"
+msgstr ""
+
+#: src/tools/dvdomatic.cc:319
+msgid "Select film to open"
+msgstr "Selecciona la película a abrir"
+
+#: src/tools/dvdomatic.cc:303
+#, fuzzy
+msgid "The directory %1 already exists."
+msgstr "La carpeta %s ya existe."
+
+#: src/tools/dvdomatic.cc:324
+msgid ""
+"You did not select a folder. Make sure that you select a folder before "
+"clicking Open."
+msgstr ""
diff --git a/src/tools/po/fr_FR.po b/src/tools/po/fr_FR.po
new file mode 100644
index 000000000..b40c86877
--- /dev/null
+++ b/src/tools/po/fr_FR.po
@@ -0,0 +1,125 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: DVD-o-matic FRENCH\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-04-09 11:14+0100\n"
+"PO-Revision-Date: 2013-03-13 22:33+0100\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/tools/dvdomatic.cc:177
+msgid "&Analyse audio"
+msgstr "&Analyser le son"
+
+#: src/tools/dvdomatic.cc:183
+msgid "&Edit"
+msgstr "&Edition"
+
+#: src/tools/dvdomatic.cc:182
+msgid "&File"
+msgstr "&Fichier"
+
+#: src/tools/dvdomatic.cc:185
+msgid "&Help"
+msgstr "&Aide"
+
+#: src/tools/dvdomatic.cc:184
+msgid "&Jobs"
+msgstr "&Travaux"
+
+#: src/tools/dvdomatic.cc:173
+msgid "&Make DCP"
+msgstr "&Créer le DCP"
+
+#: src/tools/dvdomatic.cc:161
+msgid "&Open..."
+msgstr "&Ouvrir..."
+
+#: src/tools/dvdomatic.cc:170
+msgid "&Preferences..."
+msgstr "&Préférences..."
+
+#: src/tools/dvdomatic.cc:165
+msgid "&Properties..."
+msgstr "&Propriétés..."
+
+#: src/tools/dvdomatic.cc:167
+msgid "&Quit"
+msgstr "&Quitter"
+
+#: src/tools/dvdomatic.cc:163
+msgid "&Save"
+msgstr "&Enregistrer"
+
+#: src/tools/dvdomatic.cc:174
+msgid "&Send DCP to TMS"
+msgstr "&Envoyer le DCP dans le TMS"
+
+#: src/tools/dvdomatic.cc:417
+msgid ""
+"(C) 2012-2013 Carl Hetherington, Terrence Meiczinger, Paul Davis, Ole Laursen"
+msgstr ""
+"(C) 2012-2013 Carl Hetherington, Terrence Meiczinger, Paul Davis, Ole Laursen"
+
+#: src/tools/dvdomatic.cc:180
+msgid "About"
+msgstr "A Propos"
+
+#: src/tools/dvdomatic.cc:527
+#, fuzzy
+msgid "Could not load film %1 (%2)"
+msgstr "Impossible de charger le film %s (%s)"
+
+#: src/tools/dvdomatic.cc:339
+#, c-format
+msgid "Could not open film at %s (%s)"
+msgstr "Impossible d'ouvrir le film à %s (%s)"
+
+#: src/tools/dvdomatic.cc:287 src/tools/dvdomatic.cc:410
+#: src/tools/dvdomatic.cc:531
+msgid "DVD-o-matic"
+msgstr "DVD-o-matic"
+
+#: src/tools/dvdomatic.cc:75
+msgid "Film changed"
+msgstr "Film changé"
+
+#: src/tools/dvdomatic.cc:416
+msgid "Free, open-source DCP generation from almost anything."
+msgstr "Création de DCP libre et open-source à partir de presque tout."
+
+#: src/tools/dvdomatic.cc:160
+msgid "New..."
+msgstr "Nouveau..."
+
+#: src/tools/dvdomatic.cc:175
+msgid "S&how DCP"
+msgstr "Voir le DCP"
+
+#: src/tools/dvdomatic.cc:74
+msgid "Save changes to film \"%s\" before closing?"
+msgstr ""
+
+#: src/tools/dvdomatic.cc:319
+msgid "Select film to open"
+msgstr "Sélectionner le film à ouvrir"
+
+#: src/tools/dvdomatic.cc:303
+#, fuzzy
+msgid "The directory %1 already exists."
+msgstr "Le dossier %s existe déjà."
+
+#: src/tools/dvdomatic.cc:324
+msgid ""
+"You did not select a folder. Make sure that you select a folder before "
+"clicking Open."
+msgstr ""
diff --git a/src/tools/po/it_IT.po b/src/tools/po/it_IT.po
new file mode 100644
index 000000000..38cbec157
--- /dev/null
+++ b/src/tools/po/it_IT.po
@@ -0,0 +1,124 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: IT VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-04-09 11:14+0100\n"
+"PO-Revision-Date: 2013-04-03 13:00+0100\n"
+"Last-Translator: Maci <macibro@gmail.com>\n"
+"Language-Team: \n"
+"Language: Italiano\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.5\n"
+
+#: src/tools/dvdomatic.cc:177
+msgid "&Analyse audio"
+msgstr "&Analizza audio"
+
+#: src/tools/dvdomatic.cc:183
+msgid "&Edit"
+msgstr "&Modifica"
+
+#: src/tools/dvdomatic.cc:182
+msgid "&File"
+msgstr "&File"
+
+#: src/tools/dvdomatic.cc:185
+msgid "&Help"
+msgstr "&Aiuto"
+
+#: src/tools/dvdomatic.cc:184
+msgid "&Jobs"
+msgstr "&Lavori"
+
+#: src/tools/dvdomatic.cc:173
+msgid "&Make DCP"
+msgstr "&Crea DCP"
+
+#: src/tools/dvdomatic.cc:161
+msgid "&Open..."
+msgstr "&Apri..."
+
+#: src/tools/dvdomatic.cc:170
+msgid "&Preferences..."
+msgstr "&Preferenze..."
+
+#: src/tools/dvdomatic.cc:165
+msgid "&Properties..."
+msgstr "&Proprieta'..."
+
+#: src/tools/dvdomatic.cc:167
+msgid "&Quit"
+msgstr "&Esci"
+
+#: src/tools/dvdomatic.cc:163
+msgid "&Save"
+msgstr "&Salva"
+
+#: src/tools/dvdomatic.cc:174
+msgid "&Send DCP to TMS"
+msgstr "&Invia DCP a TMS"
+
+#: src/tools/dvdomatic.cc:417
+msgid ""
+"(C) 2012-2013 Carl Hetherington, Terrence Meiczinger, Paul Davis, Ole Laursen"
+msgstr ""
+"(C) 2012-2013 Carl Hetherington, Terrence Meiczinger, Paul Davis, Ole Laursen"
+
+#: src/tools/dvdomatic.cc:180
+msgid "About"
+msgstr "Informazioni"
+
+#: src/tools/dvdomatic.cc:527
+msgid "Could not load film %1 (%2)"
+msgstr "Non posso caricare il film %s (%s)"
+
+#: src/tools/dvdomatic.cc:339
+#, c-format
+msgid "Could not open film at %s (%s)"
+msgstr "Non posso aprire il film in %s (%s)"
+
+#: src/tools/dvdomatic.cc:287 src/tools/dvdomatic.cc:410
+#: src/tools/dvdomatic.cc:531
+msgid "DVD-o-matic"
+msgstr "DVD-o-matic"
+
+#: src/tools/dvdomatic.cc:75
+msgid "Film changed"
+msgstr "Film modificato"
+
+#: src/tools/dvdomatic.cc:416
+msgid "Free, open-source DCP generation from almost anything."
+msgstr "Genera DCP da quasi tutto, free e open-source."
+
+#: src/tools/dvdomatic.cc:160
+msgid "New..."
+msgstr "Nuovo"
+
+#: src/tools/dvdomatic.cc:175
+msgid "S&how DCP"
+msgstr "&Mostra DCP"
+
+#: src/tools/dvdomatic.cc:74
+msgid "Save changes to film \"%s\" before closing?"
+msgstr "Salvare i cambiamenti del film \"%s\" prima di chiudere?"
+
+#: src/tools/dvdomatic.cc:319
+msgid "Select film to open"
+msgstr "Seleziona il film da aprire"
+
+#: src/tools/dvdomatic.cc:303
+msgid "The directory %1 already exists."
+msgstr "La directory %s esiste gia'."
+
+#: src/tools/dvdomatic.cc:324
+msgid ""
+"You did not select a folder. Make sure that you select a folder before "
+"clicking Open."
+msgstr ""
diff --git a/src/tools/po/sv_SE.po b/src/tools/po/sv_SE.po
new file mode 100644
index 000000000..28566d876
--- /dev/null
+++ b/src/tools/po/sv_SE.po
@@ -0,0 +1,127 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: DVD-o-matic\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-04-09 11:14+0100\n"
+"PO-Revision-Date: 2013-04-09 10:12+0100\n"
+"Last-Translator: Adam Klotblixt <adam.klotblixt@gmail.com>\n"
+"Language-Team: \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.5\n"
+
+#: src/tools/dvdomatic.cc:177
+msgid "&Analyse audio"
+msgstr "&Analysera audio"
+
+#: src/tools/dvdomatic.cc:183
+msgid "&Edit"
+msgstr "&Redigera"
+
+#: src/tools/dvdomatic.cc:182
+msgid "&File"
+msgstr "&Fil"
+
+#: src/tools/dvdomatic.cc:185
+msgid "&Help"
+msgstr "&Hjälp"
+
+#: src/tools/dvdomatic.cc:184
+msgid "&Jobs"
+msgstr "&Jobb"
+
+#: src/tools/dvdomatic.cc:173
+msgid "&Make DCP"
+msgstr "&Skapa DCP"
+
+#: src/tools/dvdomatic.cc:161
+msgid "&Open..."
+msgstr "&Öppna"
+
+#: src/tools/dvdomatic.cc:170
+msgid "&Preferences..."
+msgstr "&Inställningar"
+
+#: src/tools/dvdomatic.cc:165
+msgid "&Properties..."
+msgstr "&Egenskaper"
+
+#: src/tools/dvdomatic.cc:167
+msgid "&Quit"
+msgstr "&Avsluta"
+
+#: src/tools/dvdomatic.cc:163
+msgid "&Save"
+msgstr "&Spara"
+
+#: src/tools/dvdomatic.cc:174
+msgid "&Send DCP to TMS"
+msgstr "&Skicka DCP till TMS"
+
+#: src/tools/dvdomatic.cc:417
+msgid ""
+"(C) 2012-2013 Carl Hetherington, Terrence Meiczinger, Paul Davis, Ole Laursen"
+msgstr ""
+"(C) 2012-2013 Carl Hetherington, Terrence Meiczinger, Paul Davis, Ole Laursen"
+
+#: src/tools/dvdomatic.cc:180
+msgid "About"
+msgstr "Om"
+
+#: src/tools/dvdomatic.cc:527
+msgid "Could not load film %1 (%2)"
+msgstr "Kunde inte öppna filmen %1 (%2)"
+
+#: src/tools/dvdomatic.cc:339
+#, c-format
+msgid "Could not open film at %s (%s)"
+msgstr "Kunde inte öppna filmen vid %s (%s)"
+
+#: src/tools/dvdomatic.cc:287 src/tools/dvdomatic.cc:410
+#: src/tools/dvdomatic.cc:531
+msgid "DVD-o-matic"
+msgstr "DVD-o-matic"
+
+#: src/tools/dvdomatic.cc:75
+msgid "Film changed"
+msgstr "Film ändrad"
+
+#: src/tools/dvdomatic.cc:416
+msgid "Free, open-source DCP generation from almost anything."
+msgstr ""
+"Fri, öppen-källkodsprogramvara för DCP-generering från nästan vad som helst."
+
+#: src/tools/dvdomatic.cc:160
+msgid "New..."
+msgstr "Ny..."
+
+#: src/tools/dvdomatic.cc:175
+msgid "S&how DCP"
+msgstr "&Visa DCP"
+
+#: src/tools/dvdomatic.cc:74
+msgid "Save changes to film \"%1\" before closing?"
+msgstr "Spara ändringarna till filmen \"%1\" före avslut?"
+
+#: src/tools/dvdomatic.cc:319
+msgid "Select film to open"
+msgstr "Välj film att öppna"
+
+#: src/tools/dvdomatic.cc:303
+msgid "The directory %1 already exists."
+msgstr "Katalogen %1 finns redan."
+
+#: src/tools/dvdomatic.cc:324
+msgid ""
+"You did not select a folder. Make sure that you select a folder before "
+"clicking Open."
+msgstr ""
+"Du har inte valt en folder. Se till att välja en folder innan du klickar på "
+"Öppna."
diff --git a/src/tools/servomatic_cli.cc b/src/tools/servomatic_cli.cc
index f8e713193..6626d45b9 100644
--- a/src/tools/servomatic_cli.cc
+++ b/src/tools/servomatic_cli.cc
@@ -42,7 +42,10 @@
#include "log.h"
#include "version.h"
-using namespace std;
+using std::cerr;
+using std::string;
+using std::cout;
+using boost::shared_ptr;
static void
help (string n)
@@ -87,8 +90,8 @@ main (int argc, char* argv[])
}
Scaler::setup_scalers ();
- FileLog log ("servomatic.log");
- Server server (&log);
+ shared_ptr<FileLog> log (new FileLog ("servomatic.log"));
+ Server server (log);
server.run (num_threads);
return 0;
}
diff --git a/src/tools/servomatic_gui.cc b/src/tools/servomatic_gui.cc
index 610ba8005..5e36660eb 100644
--- a/src/tools/servomatic_gui.cc
+++ b/src/tools/servomatic_gui.cc
@@ -25,8 +25,11 @@
#include "lib/server.h"
#include "lib/config.h"
-using namespace std;
-using namespace boost;
+using std::cout;
+using std::string;
+using boost::shared_ptr;
+using boost::thread;
+using boost::bind;
enum {
ID_status = 1,
@@ -52,7 +55,7 @@ private:
string _log;
};
-static MemoryLog memory_log;
+static shared_ptr<MemoryLog> memory_log (new MemoryLog);
class StatusDialog : public wxDialog
{
@@ -77,7 +80,7 @@ public:
private:
void update (wxTimerEvent &)
{
- _text->ChangeValue (std_to_wx (memory_log.get ()));
+ _text->ChangeValue (std_to_wx (memory_log->get ()));
_sizer->Layout ();
}
@@ -91,7 +94,15 @@ class TaskBarIcon : public wxTaskBarIcon
public:
TaskBarIcon ()
{
+#ifdef __WXMSW__
wxIcon icon (std_to_wx ("taskbar_icon"));
+#endif
+#ifdef __WXGTK__
+ wxInitAllImageHandlers();
+ wxBitmap bitmap (wxString::Format (wxT ("%s/taskbar_icon.png"), POSIX_ICON_PREFIX), wxBITMAP_TYPE_PNG);
+ wxIcon icon;
+ icon.CopyFromBitmap (bitmap);
+#endif
SetIcon (icon, std_to_wx ("DVD-o-matic encode server"));
Connect (ID_status, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (TaskBarIcon::status));
@@ -125,27 +136,39 @@ public:
App ()
: wxApp ()
, _thread (0)
+ , _icon (0)
{}
private:
bool OnInit ()
{
+ if (!wxApp::OnInit ()) {
+ return false;
+ }
+
dvdomatic_setup ();
- new TaskBarIcon;
-
+ _icon = new TaskBarIcon;
_thread = new thread (bind (&App::main_thread, this));
+
return true;
}
+ int OnExit ()
+ {
+ delete _icon;
+ return wxApp::OnExit ();
+ }
+
void main_thread ()
{
- Server server (&memory_log);
+ Server server (memory_log);
server.run (Config::instance()->num_local_encoding_threads ());
}
boost::thread* _thread;
+ TaskBarIcon* _icon;
};
IMPLEMENT_APP (App)
diff --git a/src/tools/servomatictest.cc b/src/tools/servomatictest.cc
index 91ad02120..f5756c693 100644
--- a/src/tools/servomatictest.cc
+++ b/src/tools/servomatictest.cc
@@ -43,7 +43,7 @@ using std::pair;
using boost::shared_ptr;
static ServerDescription* server;
-static FileLog log_ ("servomatictest.log");
+static shared_ptr<FileLog> log_ (new FileLog ("servomatictest.log"));
static int frame = 0;
void
@@ -53,14 +53,14 @@ process_video (shared_ptr<Image> image, bool, shared_ptr<Subtitle> sub)
new DCPVideoFrame (
image, sub,
libdcp::Size (1024, 1024), 0, 0, 0,
- Scaler::from_id ("bicubic"), frame, 24, "", 0, 250000000, &log_)
+ Scaler::from_id ("bicubic"), frame, 24, "", 0, 250000000, log_)
);
shared_ptr<DCPVideoFrame> remote (
new DCPVideoFrame (
image, sub,
libdcp::Size (1024, 1024), 0, 0, 0,
- Scaler::from_id ("bicubic"), frame, 24, "", 0, 250000000, &log_)
+ Scaler::from_id ("bicubic"), frame, 24, "", 0, 250000000, log_)
);
cout << "Frame " << frame << ": ";
diff --git a/src/tools/wscript b/src/tools/wscript
index 64d5efe56..9f0f52152 100644
--- a/src/tools/wscript
+++ b/src/tools/wscript
@@ -27,3 +27,6 @@ def build(bld):
def pot(bld):
i18n.pot(os.path.join('src', 'tools'), 'dvdomatic.cc', 'dvdomatic')
+
+def pot_merge(bld):
+ i18n.pot_merge(os.path.join('src', 'tools'), 'dvdomatic')
diff --git a/src/wscript b/src/wscript
index f7f888acd..a4cf349f9 100644
--- a/src/wscript
+++ b/src/wscript
@@ -12,3 +12,8 @@ def pot(bld):
bld.recurse('lib')
bld.recurse('wx')
bld.recurse('tools')
+
+def pot_merge(bld):
+ bld.recurse('lib')
+ bld.recurse('wx')
+ bld.recurse('tools')
diff --git a/src/wx/audio_dialog.cc b/src/wx/audio_dialog.cc
index 5bac8eabe..39650d157 100644
--- a/src/wx/audio_dialog.cc
+++ b/src/wx/audio_dialog.cc
@@ -35,7 +35,7 @@ AudioDialog::AudioDialog (wxWindow* parent)
wxBoxSizer* sizer = new wxBoxSizer (wxHORIZONTAL);
_plot = new AudioPlot (this);
- sizer->Add (_plot, 1, wxALL, 12);
+ sizer->Add (_plot, 1, wxALL | wxEXPAND, 12);
wxBoxSizer* side = new wxBoxSizer (wxVERTICAL);
@@ -87,7 +87,7 @@ void
AudioDialog::set_film (boost::shared_ptr<Film> f)
{
_film_changed_connection.disconnect ();
- _film_audio_analysis_finished_connection.disconnect ();
+ _film_audio_analysis_succeeded_connection.disconnect ();
_film = f;
@@ -96,9 +96,9 @@ AudioDialog::set_film (boost::shared_ptr<Film> f)
_plot->set_gain (_film->audio_gain ());
_film_changed_connection = _film->Changed.connect (bind (&AudioDialog::film_changed, this, _1));
- _film_audio_analysis_finished_connection = _film->AudioAnalysisFinished.connect (bind (&AudioDialog::try_to_load_analysis, this));
+ _film_audio_analysis_succeeded_connection = _film->AudioAnalysisSucceeded.connect (bind (&AudioDialog::try_to_load_analysis, this));
- SetTitle (std_to_wx (String::compose (wx_to_std (_("DVD-o-matic audio - %1")), _film->name())));
+ SetTitle (wxString::Format (_("DVD-o-matic audio - %s"), std_to_wx(_film->name()).data()));
}
void
diff --git a/src/wx/audio_dialog.h b/src/wx/audio_dialog.h
index 16cb356fe..514faeea0 100644
--- a/src/wx/audio_dialog.h
+++ b/src/wx/audio_dialog.h
@@ -47,5 +47,5 @@ private:
wxCheckBox* _type_checkbox[AudioPoint::COUNT];
wxSlider* _smoothing;
boost::signals2::scoped_connection _film_changed_connection;
- boost::signals2::scoped_connection _film_audio_analysis_finished_connection;
+ boost::signals2::scoped_connection _film_audio_analysis_succeeded_connection;
};
diff --git a/src/wx/config_dialog.cc b/src/wx/config_dialog.cc
index b28c350ea..1d025f3fa 100644
--- a/src/wx/config_dialog.cc
+++ b/src/wx/config_dialog.cc
@@ -46,6 +46,25 @@ ConfigDialog::ConfigDialog (wxWindow* parent)
wxFlexGridSizer* table = new wxFlexGridSizer (3, 6, 6);
table->AddGrowableCol (1, 1);
+ _set_language = new wxCheckBox (this, wxID_ANY, _("Set language"));
+ table->Add (_set_language, 1, wxEXPAND);
+ _language = new wxChoice (this, wxID_ANY);
+ _language->Append (wxT ("English"));
+ _language->Append (wxT ("Français"));
+ _language->Append (wxT ("Italiano"));
+ _language->Append (wxT ("Español"));
+ _language->Append (wxT ("Svenska"));
+ table->Add (_language, 1, wxEXPAND);
+ table->AddSpacer (0);
+
+ table->AddSpacer (0);
+ wxStaticText* restart = add_label_to_sizer (table, this, _("(restart DVD-o-matic to see language changes)"));
+ wxFont font = restart->GetFont();
+ font.SetStyle (wxFONTSTYLE_ITALIC);
+ font.SetPointSize (font.GetPointSize() - 1);
+ restart->SetFont (font);
+ table->AddSpacer (0);
+
add_label_to_sizer (table, this, _("TMS IP address"));
_tms_ip = new wxTextCtrl (this, wxID_ANY);
table->Add (_tms_ip, 1, wxEXPAND);
@@ -132,6 +151,24 @@ ConfigDialog::ConfigDialog (wxWindow* parent)
Config* config = Config::instance ();
+ _set_language->SetValue (config->language ());
+
+ if (config->language().get_value_or ("") == "fr") {
+ _language->SetSelection (1);
+ } else if (config->language().get_value_or ("") == "it") {
+ _language->SetSelection (2);
+ } else if (config->language().get_value_or ("") == "es") {
+ _language->SetSelection (3);
+ } else if (config->language().get_value_or ("") == "sv") {
+ _language->SetSelection (4);
+ } else {
+ _language->SetSelection (0);
+ }
+
+ setup_language_sensitivity ();
+
+ _set_language->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (ConfigDialog::set_language_changed), 0, this);
+ _language->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (ConfigDialog::language_changed), 0, this);
_tms_ip->SetValue (std_to_wx (config->tms_ip ()));
_tms_ip->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (ConfigDialog::tms_ip_changed), 0, this);
_tms_path->SetValue (std_to_wx (config->tms_path ()));
@@ -185,6 +222,28 @@ ConfigDialog::ConfigDialog (wxWindow* parent)
}
void
+ConfigDialog::language_changed (wxCommandEvent &)
+{
+ switch (_language->GetSelection ()) {
+ case 0:
+ Config::instance()->set_language ("");
+ break;
+ case 1:
+ Config::instance()->set_language ("fr");
+ break;
+ case 2:
+ Config::instance()->set_language ("it");
+ break;
+ case 3:
+ Config::instance()->set_language ("es");
+ break;
+ case 4:
+ Config::instance()->set_language ("sv");
+ break;
+ }
+}
+
+void
ConfigDialog::tms_ip_changed (wxCommandEvent &)
{
Config::instance()->set_tms_ip (wx_to_std (_tms_ip->GetValue ()));
@@ -324,3 +383,20 @@ ConfigDialog::edit_default_dci_metadata_clicked (wxCommandEvent &)
Config::instance()->set_default_dci_metadata (d->dci_metadata ());
d->Destroy ();
}
+
+void
+ConfigDialog::set_language_changed (wxCommandEvent& ev)
+{
+ setup_language_sensitivity ();
+ if (_set_language->GetValue ()) {
+ language_changed (ev);
+ } else {
+ Config::instance()->unset_language ();
+ }
+}
+
+void
+ConfigDialog::setup_language_sensitivity ()
+{
+ _language->Enable (_set_language->GetValue ());
+}
diff --git a/src/wx/config_dialog.h b/src/wx/config_dialog.h
index 948bf0571..f6f3b3707 100644
--- a/src/wx/config_dialog.h
+++ b/src/wx/config_dialog.h
@@ -39,6 +39,8 @@ public:
ConfigDialog (wxWindow *);
private:
+ void set_language_changed (wxCommandEvent &);
+ void language_changed (wxCommandEvent &);
void tms_ip_changed (wxCommandEvent &);
void tms_path_changed (wxCommandEvent &);
void tms_user_changed (wxCommandEvent &);
@@ -55,7 +57,10 @@ private:
void server_selection_changed (wxListEvent &);
void add_server_to_control (ServerDescription *);
-
+ void setup_language_sensitivity ();
+
+ wxCheckBox* _set_language;
+ wxChoice* _language;
wxTextCtrl* _tms_ip;
wxTextCtrl* _tms_path;
wxTextCtrl* _tms_user;
diff --git a/src/wx/film_editor.cc b/src/wx/film_editor.cc
index b9a4012e3..a21782a6f 100644
--- a/src/wx/film_editor.cc
+++ b/src/wx/film_editor.cc
@@ -37,7 +37,6 @@
#include "lib/filter.h"
#include "lib/config.h"
#include "lib/ffmpeg_decoder.h"
-#include "lib/external_audio_decoder.h"
#include "filter_dialog.h"
#include "wx_util.h"
#include "film_editor.h"
@@ -149,7 +148,7 @@ FilmEditor::make_film_panel ()
}
++r;
- _frame_rate_description = new wxStaticText (_film_panel, wxID_ANY, wxT (" \n "), wxDefaultPosition, wxDefaultSize);
+ _frame_rate_description = new wxStaticText (_film_panel, wxID_ANY, wxT ("\n \n "), wxDefaultPosition, wxDefaultSize);
grid->Add (video_control (_frame_rate_description), wxGBPosition (r, 0), wxGBSpan (1, 2), wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 6);
wxFont font = _frame_rate_description->GetFont();
font.SetStyle(wxFONTSTYLE_ITALIC);
@@ -157,11 +156,6 @@ FilmEditor::make_film_panel ()
_frame_rate_description->SetFont(font);
++r;
- video_control (add_label_to_grid_bag_sizer (grid, _film_panel, _("Original Size"), wxGBPosition (r, 0)));
- _original_size = new wxStaticText (_film_panel, wxID_ANY, wxT (""));
- grid->Add (video_control (_original_size), wxGBPosition (r, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL);
- ++r;
-
video_control (add_label_to_grid_bag_sizer (grid, _film_panel, _("Length"), wxGBPosition (r, 0)));
_length = new wxStaticText (_film_panel, wxID_ANY, wxT (""));
grid->Add (video_control (_length), wxGBPosition (r, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL);
@@ -182,6 +176,11 @@ FilmEditor::make_film_panel ()
}
++r;
+ video_control (add_label_to_grid_bag_sizer (grid, _film_panel, _("Trim method"), wxGBPosition (r, 0)));
+ _trim_type = new wxChoice (_film_panel, wxID_ANY);
+ grid->Add (video_control (_trim_type), wxGBPosition (r, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL);
+ ++r;
+
_dcp_ab = new wxCheckBox (_film_panel, wxID_ANY, _("A/B"));
video_control (_dcp_ab);
grid->Add (_dcp_ab, wxGBPosition (r, 0));
@@ -209,45 +208,49 @@ FilmEditor::make_film_panel ()
for (list<int>::const_iterator i = dfr.begin(); i != dfr.end(); ++i) {
_dcp_frame_rate->Append (std_to_wx (boost::lexical_cast<string> (*i)));
}
+
+ _trim_type->Append (_("encode all frames and play the subset"));
+ _trim_type->Append (_("encode only the subset"));
}
void
FilmEditor::connect_to_widgets ()
{
- _name->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (FilmEditor::name_changed), 0, this);
- _use_dci_name->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::use_dci_name_toggled), 0, this);
- _edit_dci_button->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::edit_dci_button_clicked), 0, this);
- _format->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::format_changed), 0, this);
- _content->Connect (wxID_ANY, wxEVT_COMMAND_FILEPICKER_CHANGED, wxCommandEventHandler (FilmEditor::content_changed), 0, this);
- _trust_content_header->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::trust_content_header_changed), 0, this);
- _left_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::left_crop_changed), 0, this);
- _right_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::right_crop_changed), 0, this);
- _top_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::top_crop_changed), 0, this);
- _bottom_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::bottom_crop_changed), 0, this);
- _filters_button->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::edit_filters_clicked), 0, this);
- _scaler->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::scaler_changed), 0, this);
- _dcp_content_type->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::dcp_content_type_changed), 0, this);
- _dcp_frame_rate->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::dcp_frame_rate_changed), 0, this);
- _best_dcp_frame_rate->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::best_dcp_frame_rate_clicked), 0, this);
- _dcp_ab->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::dcp_ab_toggled), 0, this);
- _still_duration->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::still_duration_changed), 0, this);
- _trim_start->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::trim_start_changed), 0, this);
- _trim_end->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::trim_end_changed), 0, this);
- _with_subtitles->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::with_subtitles_toggled), 0, this);
- _subtitle_offset->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::subtitle_offset_changed), 0, this);
- _subtitle_scale->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::subtitle_scale_changed), 0, this);
- _colour_lut->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::colour_lut_changed), 0, this);
- _j2k_bandwidth->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::j2k_bandwidth_changed), 0, this);
- _subtitle_stream->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::subtitle_stream_changed), 0, this);
- _audio_stream->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::audio_stream_changed), 0, this);
- _audio_gain->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::audio_gain_changed), 0, this);
+ _name->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (FilmEditor::name_changed), 0, this);
+ _use_dci_name->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::use_dci_name_toggled), 0, this);
+ _edit_dci_button->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::edit_dci_button_clicked), 0, this);
+ _format->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::format_changed), 0, this);
+ _content->Connect (wxID_ANY, wxEVT_COMMAND_FILEPICKER_CHANGED, wxCommandEventHandler (FilmEditor::content_changed), 0, this);
+ _trust_content_header->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::trust_content_header_changed), 0, this);
+ _left_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::left_crop_changed), 0, this);
+ _right_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::right_crop_changed), 0, this);
+ _top_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::top_crop_changed), 0, this);
+ _bottom_crop->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::bottom_crop_changed), 0, this);
+ _filters_button->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::edit_filters_clicked), 0, this);
+ _scaler->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::scaler_changed), 0, this);
+ _dcp_content_type->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::dcp_content_type_changed), 0, this);
+ _dcp_frame_rate->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::dcp_frame_rate_changed), 0, this);
+ _best_dcp_frame_rate->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::best_dcp_frame_rate_clicked), 0, this);
+ _dcp_ab->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::dcp_ab_toggled), 0, this);
+ _still_duration->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::still_duration_changed), 0, this);
+ _trim_start->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::trim_start_changed), 0, this);
+ _trim_end->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::trim_end_changed), 0, this);
+ _trim_type->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::trim_type_changed), 0, this);
+ _with_subtitles->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::with_subtitles_toggled), 0, this);
+ _subtitle_offset->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::subtitle_offset_changed), 0, this);
+ _subtitle_scale->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::subtitle_scale_changed), 0, this);
+ _colour_lut->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::colour_lut_changed), 0, this);
+ _j2k_bandwidth->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::j2k_bandwidth_changed), 0, this);
+ _subtitle_stream->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::subtitle_stream_changed), 0, this);
+ _audio_stream->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::audio_stream_changed), 0, this);
+ _audio_gain->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::audio_gain_changed), 0, this);
_audio_gain_calculate_button->Connect (
wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::audio_gain_calculate_button_clicked), 0, this
);
- _show_audio->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::show_audio_clicked), 0, this);
- _audio_delay->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::audio_delay_changed), 0, this);
- _use_content_audio->Connect (wxID_ANY, wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler (FilmEditor::use_audio_changed), 0, this);
- _use_external_audio->Connect (wxID_ANY, wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler (FilmEditor::use_audio_changed), 0, this);
+ _show_audio->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::show_audio_clicked), 0, this);
+ _audio_delay->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::audio_delay_changed), 0, this);
+ _use_content_audio->Connect (wxID_ANY, wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler (FilmEditor::use_audio_changed), 0, this);
+ _use_external_audio->Connect (wxID_ANY, wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler (FilmEditor::use_audio_changed), 0, this);
for (int i = 0; i < MAX_AUDIO_CHANNELS; ++i) {
_external_audio[i]->Connect (
wxID_ANY, wxEVT_COMMAND_FILEPICKER_CHANGED, wxCommandEventHandler (FilmEditor::external_audio_changed), 0, this
@@ -271,14 +274,6 @@ FilmEditor::make_video_panel ()
grid->Add (_format, wxGBPosition (r, 1));
++r;
- _format_description = new wxStaticText (_video_panel, wxID_ANY, wxT (""), wxDefaultPosition, wxDefaultSize);
- grid->Add (_format_description, wxGBPosition (r, 0), wxGBSpan (1, 2), wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 6);
- wxFont font = _format_description->GetFont();
- font.SetStyle(wxFONTSTYLE_ITALIC);
- font.SetPointSize(font.GetPointSize() - 1);
- _format_description->SetFont(font);
- ++r;
-
add_label_to_grid_bag_sizer (grid, _video_panel, _("Left crop"), wxGBPosition (r, 0));
_left_crop = new wxSpinCtrl (_video_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize (64, -1));
grid->Add (_left_crop, wxGBPosition (r, 1));
@@ -299,6 +294,14 @@ FilmEditor::make_video_panel ()
grid->Add (_bottom_crop, wxGBPosition (r, 1));
++r;
+ _scaling_description = new wxStaticText (_video_panel, wxID_ANY, wxT ("\n \n \n \n"), wxDefaultPosition, wxDefaultSize);
+ grid->Add (_scaling_description, wxGBPosition (r, 0), wxGBSpan (1, 2), wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 6);
+ wxFont font = _scaling_description->GetFont();
+ font.SetStyle(wxFONTSTYLE_ITALIC);
+ font.SetPointSize(font.GetPointSize() - 1);
+ _scaling_description->SetFont(font);
+ ++r;
+
/* VIDEO-only stuff */
{
video_control (add_label_to_grid_bag_sizer (grid, _video_panel, _("Filters"), wxGBPosition (r, 0)));
@@ -429,9 +432,14 @@ FilmEditor::make_subtitle_panel ()
_subtitle_stream = new wxChoice (_subtitle_panel, wxID_ANY);
grid->Add (video_control (_subtitle_stream));
- video_control (add_label_to_sizer (grid, _subtitle_panel, _("Subtitle Offset")));
- _subtitle_offset = new wxSpinCtrl (_subtitle_panel);
- grid->Add (video_control (_subtitle_offset), 1);
+ {
+ video_control (add_label_to_sizer (grid, _subtitle_panel, _("Subtitle Offset")));
+ wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
+ _subtitle_offset = new wxSpinCtrl (_subtitle_panel);
+ s->Add (_subtitle_offset);
+ video_control (add_label_to_sizer (s, _subtitle_panel, _("pixels")));
+ grid->Add (s);
+ }
{
video_control (add_label_to_sizer (grid, _subtitle_panel, _("Subtitle Scale")));
@@ -502,7 +510,7 @@ FilmEditor::content_changed (wxCommandEvent &)
_film->set_content (wx_to_std (_content->GetPath ()));
} catch (std::exception& e) {
_content->SetPath (std_to_wx (_film->directory ()));
- error_dialog (this, wxString::Format (_("Could not set content: %s"), e.what ()));
+ error_dialog (this, wxString::Format (_("Could not set content: %s"), std_to_wx (e.what()).data()));
}
}
@@ -617,6 +625,8 @@ FilmEditor::film_changed (Film::Property p)
setup_formats ();
setup_subtitle_control_sensitivity ();
setup_streams ();
+ setup_show_audio_sensitivity ();
+ setup_frame_rate_description ();
break;
case Film::TRUST_CONTENT_HEADER:
checked_set (_trust_content_header, _film->trust_content_header ());
@@ -627,6 +637,8 @@ FilmEditor::film_changed (Film::Property p)
break;
case Film::CONTENT_AUDIO_STREAMS:
setup_streams ();
+ setup_show_audio_sensitivity ();
+ setup_frame_rate_description ();
break;
case Film::FORMAT:
{
@@ -642,12 +654,7 @@ FilmEditor::film_changed (Film::Property p)
checked_set (_format, n);
}
setup_dcp_name ();
-
- if (_film->format ()) {
- _format_description->SetLabel (std_to_wx (_film->format()->description ()));
- } else {
- _format_description->SetLabel (wxT (""));
- }
+ setup_scaling_description ();
break;
}
case Film::CROP:
@@ -655,6 +662,7 @@ FilmEditor::film_changed (Film::Property p)
checked_set (_right_crop, _film->crop().right);
checked_set (_top_crop, _film->crop().top);
checked_set (_bottom_crop, _film->crop().bottom);
+ setup_scaling_description ();
break;
case Film::FILTERS:
{
@@ -675,20 +683,18 @@ FilmEditor::film_changed (Film::Property p)
case Film::SOURCE_FRAME_RATE:
s << fixed << setprecision(2) << _film->source_frame_rate();
_source_frame_rate->SetLabel (std_to_wx (s.str ()));
+ setup_frame_rate_description ();
break;
case Film::SIZE:
- if (_film->size().width == 0 && _film->size().height == 0) {
- _original_size->SetLabel (wxT (""));
- } else {
- s << _film->size().width << " x " << _film->size().height;
- _original_size->SetLabel (std_to_wx (s.str ()));
- }
+ setup_scaling_description ();
break;
case Film::LENGTH:
if (_film->source_frame_rate() > 0 && _film->length()) {
- s << _film->length().get() << " " << _("frames") << "; " << seconds_to_hms (_film->length().get() / _film->source_frame_rate());
+ s << _film->length().get() << " "
+ << wx_to_std (_("frames")) << "; " << seconds_to_hms (_film->length().get() / _film->source_frame_rate());
} else if (_film->length()) {
- s << _film->length().get() << " " << _("frames");
+ s << _film->length().get() << " "
+ << wx_to_std (_("frames"));
}
_length->SetLabel (std_to_wx (s.str ()));
if (_film->length()) {
@@ -696,8 +702,6 @@ FilmEditor::film_changed (Film::Property p)
_trim_end->SetRange (0, _film->length().get());
}
break;
- case Film::DCP_INTRINSIC_DURATION:
- break;
case Film::DCP_CONTENT_TYPE:
checked_set (_dcp_content_type, DCPContentType::as_index (_film->dcp_content_type ()));
setup_dcp_name ();
@@ -714,6 +718,9 @@ FilmEditor::film_changed (Film::Property p)
case Film::TRIM_END:
checked_set (_trim_end, _film->trim_end());
break;
+ case Film::TRIM_TYPE:
+ checked_set (_trim_type, _film->trim_type() == Film::CPL ? 0 : 1);
+ break;
case Film::AUDIO_GAIN:
checked_set (_audio_gain, _film->audio_gain ());
break;
@@ -754,6 +761,8 @@ FilmEditor::film_changed (Film::Property p)
setup_dcp_name ();
setup_audio_details ();
setup_audio_control_sensitivity ();
+ setup_show_audio_sensitivity ();
+ setup_frame_rate_description ();
break;
case Film::USE_CONTENT_AUDIO:
checked_set (_use_content_audio, _film->use_content_audio());
@@ -761,6 +770,8 @@ FilmEditor::film_changed (Film::Property p)
setup_dcp_name ();
setup_audio_details ();
setup_audio_control_sensitivity ();
+ setup_show_audio_sensitivity ();
+ setup_frame_rate_description ();
break;
case Film::SUBTITLE_STREAM:
if (_film->subtitle_stream()) {
@@ -774,6 +785,8 @@ FilmEditor::film_changed (Film::Property p)
checked_set (_external_audio[i], a[i]);
}
setup_audio_details ();
+ setup_show_audio_sensitivity ();
+ setup_frame_rate_description ();
break;
}
case Film::DCP_FRAME_RATE:
@@ -787,13 +800,41 @@ FilmEditor::film_changed (Film::Property p)
}
if (_film->source_frame_rate()) {
- _frame_rate_description->SetLabel (std_to_wx (FrameRateConversion (_film->source_frame_rate(), _film->dcp_frame_rate()).description));
_best_dcp_frame_rate->Enable (best_dcp_frame_rate (_film->source_frame_rate ()) != _film->dcp_frame_rate ());
} else {
- _frame_rate_description->SetLabel (wxT (""));
_best_dcp_frame_rate->Disable ();
}
+
+ setup_frame_rate_description ();
+ }
+}
+
+void
+FilmEditor::setup_frame_rate_description ()
+{
+ wxString d;
+ int lines = 0;
+
+ if (_film->source_frame_rate()) {
+ d << std_to_wx (FrameRateConversion (_film->source_frame_rate(), _film->dcp_frame_rate()).description);
+ ++lines;
+#ifdef HAVE_SWRESAMPLE
+ if (_film->audio_stream() && _film->audio_stream()->sample_rate() != _film->target_audio_sample_rate ()) {
+ d << wxString::Format (
+ _("Audio will be resampled from %dHz to %dHz\n"),
+ _film->audio_stream()->sample_rate(),
+ _film->target_audio_sample_rate()
+ );
+ ++lines;
+ }
+#endif
}
+
+ for (int i = lines; i < 2; ++i) {
+ d << wxT ("\n ");
+ }
+
+ _frame_rate_description->SetLabel (d);
}
/** Called when the format widget has been changed */
@@ -840,7 +881,7 @@ FilmEditor::set_film (shared_ptr<Film> f)
if (_film) {
FileChanged (_film->directory ());
} else {
- FileChanged (wx_to_std (N_("")));
+ FileChanged ("");
}
if (_audio_dialog) {
@@ -858,6 +899,7 @@ FilmEditor::set_film (shared_ptr<Film> f)
film_changed (Film::SCALER);
film_changed (Film::TRIM_START);
film_changed (Film::TRIM_END);
+ film_changed (Film::TRIM_TYPE);
film_changed (Film::DCP_AB);
film_changed (Film::CONTENT_AUDIO_STREAM);
film_changed (Film::EXTERNAL_AUDIO);
@@ -904,6 +946,7 @@ FilmEditor::set_things_sensitive (bool s)
_dcp_frame_rate->Enable (s);
_trim_start->Enable (s);
_trim_end->Enable (s);
+ _trim_type->Enable (s);
_dcp_ab->Enable (s);
_colour_lut->Enable (s);
_j2k_bandwidth->Enable (s);
@@ -915,6 +958,7 @@ FilmEditor::set_things_sensitive (bool s)
setup_subtitle_control_sensitivity ();
setup_audio_control_sensitivity ();
+ setup_show_audio_sensitivity ();
}
/** Called when the `Edit filters' button has been clicked */
@@ -992,6 +1036,12 @@ FilmEditor::setup_visibility ()
(*i)->Show (c == STILL);
}
+ setup_notebook_size ();
+}
+
+void
+FilmEditor::setup_notebook_size ()
+{
_notebook->InvalidateBestSize ();
_film_sizer->Layout ();
@@ -1123,7 +1173,7 @@ FilmEditor::setup_subtitle_control_sensitivity ()
void
FilmEditor::setup_audio_control_sensitivity ()
{
- _use_content_audio->Enable (_generally_sensitive);
+ _use_content_audio->Enable (_generally_sensitive && _film && !_film->content_audio_streams().empty());
_use_external_audio->Enable (_generally_sensitive);
bool const source = _generally_sensitive && _use_content_audio->GetValue();
@@ -1218,18 +1268,20 @@ FilmEditor::subtitle_stream_changed (wxCommandEvent &)
void
FilmEditor::setup_audio_details ()
{
- if (!_film->audio_stream()) {
+ if (!_film->content_audio_stream()) {
_audio->SetLabel (wxT (""));
} else {
- stringstream s;
+ wxString s;
if (_film->audio_stream()->channels() == 1) {
s << _("1 channel");
} else {
- s << _film->audio_stream()->channels () << " " << _("channels");
+ s << _film->audio_stream()->channels () << wxT (" ") << _("channels");
}
- s << ", " << _film->audio_stream()->sample_rate() << _("Hz");
- _audio->SetLabel (std_to_wx (s.str ()));
+ s << wxT (", ") << _film->audio_stream()->sample_rate() << _("Hz");
+ _audio->SetLabel (s);
}
+
+ setup_notebook_size ();
}
void
@@ -1289,3 +1341,71 @@ FilmEditor::best_dcp_frame_rate_clicked (wxCommandEvent &)
_film->set_dcp_frame_rate (best_dcp_frame_rate (_film->source_frame_rate ()));
}
+
+void
+FilmEditor::setup_show_audio_sensitivity ()
+{
+ _show_audio->Enable (_film && _film->has_audio ());
+}
+
+void
+FilmEditor::setup_scaling_description ()
+{
+ wxString d;
+
+ int lines = 0;
+
+ if (_film->size().width && _film->size().height) {
+ d << wxString::Format (
+ _("Original video is %dx%d (%.2f:1)\n"),
+ _film->size().width, _film->size().height,
+ float (_film->size().width) / _film->size().height
+ );
+ ++lines;
+ }
+
+ Crop const crop = _film->crop ();
+ if (crop.left || crop.right || crop.top || crop.bottom) {
+ libdcp::Size const cropped = _film->cropped_size (_film->size ());
+ d << wxString::Format (
+ _("Cropped to %dx%d (%.2f:1)\n"),
+ cropped.width, cropped.height,
+ float (cropped.width) / cropped.height
+ );
+ ++lines;
+ }
+
+ Format const * format = _film->format ();
+ if (format) {
+ int const padding = format->dcp_padding (_film);
+ libdcp::Size scaled = format->dcp_size ();
+ scaled.width -= padding * 2;
+ d << wxString::Format (
+ _("Scaled to %dx%d (%.2f:1)\n"),
+ scaled.width, scaled.height,
+ float (scaled.width) / scaled.height
+ );
+ ++lines;
+
+ if (padding) {
+ d << wxString::Format (
+ _("Padded with black to %dx%d (%.2f:1)\n"),
+ format->dcp_size().width, format->dcp_size().height,
+ float (format->dcp_size().width) / format->dcp_size().height
+ );
+ ++lines;
+ }
+ }
+
+ for (int i = lines; i < 4; ++i) {
+ d << wxT ("\n ");
+ }
+
+ _scaling_description->SetLabel (d);
+}
+
+void
+FilmEditor::trim_type_changed (wxCommandEvent &)
+{
+ _film->set_trim_type (_trim_type->GetSelection () == 0 ? Film::CPL : Film::ENCODE);
+}
diff --git a/src/wx/film_editor.h b/src/wx/film_editor.h
index 29b453b8b..e2a4d5836 100644
--- a/src/wx/film_editor.h
+++ b/src/wx/film_editor.h
@@ -65,6 +65,7 @@ private:
void format_changed (wxCommandEvent &);
void trim_start_changed (wxCommandEvent &);
void trim_end_changed (wxCommandEvent &);
+ void trim_type_changed (wxCommandEvent &);
void dcp_content_type_changed (wxCommandEvent &);
void dcp_ab_toggled (wxCommandEvent &);
void scaler_changed (wxCommandEvent &);
@@ -98,6 +99,10 @@ private:
void setup_streams ();
void setup_audio_details ();
void setup_dcp_name ();
+ void setup_show_audio_sensitivity ();
+ void setup_scaling_description ();
+ void setup_notebook_size ();
+ void setup_frame_rate_description ();
wxControl* video_control (wxControl *);
wxControl* still_control (wxControl *);
@@ -123,7 +128,7 @@ private:
wxButton* _edit_dci_button;
/** The Film's format */
wxChoice* _format;
- wxStaticText* _format_description;
+ wxStaticText* _scaling_description;
/** The Film's content file */
wxFilePickerCtrl* _content;
wxCheckBox* _trust_content_header;
@@ -165,8 +170,6 @@ private:
wxChoice* _dcp_frame_rate;
wxButton* _best_dcp_frame_rate;
wxStaticText* _frame_rate_description;
- /** The Film's original size */
- wxStaticText* _original_size;
/** The Film's length */
wxStaticText* _length;
/** The Film's audio details */
@@ -176,6 +179,7 @@ private:
wxSpinCtrl* _trim_start;
wxSpinCtrl* _trim_end;
+ wxChoice* _trim_type;
/** Selector to generate an A/B comparison DCP */
wxCheckBox* _dcp_ab;
diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc
index a40a3c78d..dbbff3713 100644
--- a/src/wx/film_viewer.cc
+++ b/src/wx/film_viewer.cc
@@ -54,7 +54,6 @@ FilmViewer::FilmViewer (shared_ptr<Film> f, wxWindow* p)
, _play_button (new wxToggleButton (this, wxID_ANY, _("Play")))
, _display_frame_x (0)
, _got_frame (false)
- , _clear_required (false)
{
_panel->SetDoubleBuffered (true);
#if wxMAJOR_VERSION == 2 && wxMINOR_VERSION >= 9
@@ -105,7 +104,7 @@ FilmViewer::film_changed (Film::Property p)
try {
_decoders = decoder_factory (_film, o);
} catch (StringError& e) {
- error_dialog (this, wxString::Format (_("Could not open content file (%s)"), e.what()));
+ error_dialog (this, wxString::Format (_("Could not open content file (%s)"), std_to_wx(e.what()).data()));
return;
}
@@ -149,6 +148,11 @@ FilmViewer::set_film (shared_ptr<Film> f)
_film = f;
+ _raw_frame.reset ();
+ _display_frame.reset ();
+ _panel->Refresh ();
+ _panel->Update ();
+
if (!_film) {
return;
}
@@ -201,11 +205,6 @@ FilmViewer::paint_panel (wxPaintEvent &)
{
wxPaintDC dc (_panel);
- if (_clear_required) {
- dc.Clear ();
- _clear_required = false;
- }
-
if (!_display_frame || !_film || !_out_size.width || !_out_size.height) {
dc.Clear ();
return;
@@ -227,6 +226,22 @@ FilmViewer::paint_panel (wxPaintEvent &)
wxBitmap sub_bitmap (sub);
dc.DrawBitmap (sub_bitmap, _display_sub_position.x, _display_sub_position.y);
}
+
+ if (_out_size.width < _panel_size.width) {
+ wxPen p (GetBackgroundColour ());
+ wxBrush b (GetBackgroundColour ());
+ dc.SetPen (p);
+ dc.SetBrush (b);
+ dc.DrawRectangle (_out_size.width, 0, _panel_size.width - _out_size.width, _panel_size.height);
+ }
+
+ if (_out_size.height < _panel_size.height) {
+ wxPen p (GetBackgroundColour ());
+ wxBrush b (GetBackgroundColour ());
+ dc.SetPen (p);
+ dc.SetBrush (b);
+ dc.DrawRectangle (0, _out_size.height, _panel_size.width, _panel_size.height - _out_size.height);
+ }
}
@@ -275,11 +290,6 @@ FilmViewer::raw_to_display ()
return;
}
- libdcp::Size old_size;
- if (_display_frame) {
- old_size = _display_frame->size();
- }
-
boost::shared_ptr<Image> input = _raw_frame;
pair<string, string> const s = Filter::ffmpeg_strings (_film->filters());
@@ -290,10 +300,6 @@ FilmViewer::raw_to_display ()
/* Get a compacted image as we have to feed it to wxWidgets */
_display_frame = input->scale_and_convert_to_rgb (_film_size, 0, _film->scaler(), false);
- if (old_size != _display_frame->size()) {
- _clear_required = true;
- }
-
if (_raw_sub) {
/* Our output is already cropped by the decoder, so we need to account for that
@@ -411,7 +417,7 @@ FilmViewer::get_frame ()
} catch (DecodeError& e) {
_play_button->SetValue (false);
check_play_state ();
- error_dialog (this, wxString::Format (_("Could not decode video for view (%s)"), e.what()));
+ error_dialog (this, wxString::Format (_("Could not decode video for view (%s)"), std_to_wx(e.what()).data()));
}
}
diff --git a/src/wx/film_viewer.h b/src/wx/film_viewer.h
index 456301eb4..784434f6b 100644
--- a/src/wx/film_viewer.h
+++ b/src/wx/film_viewer.h
@@ -69,6 +69,9 @@ private:
boost::shared_ptr<Image> _raw_frame;
boost::shared_ptr<Subtitle> _raw_sub;
boost::shared_ptr<Image> _display_frame;
+ /* The x offset at which we display the actual film content; this corresponds
+ to the film's padding converted to our coordinates.
+ */
int _display_frame_x;
boost::shared_ptr<RGBPlusAlphaImage> _display_sub;
Position _display_sub_position;
@@ -80,6 +83,4 @@ private:
libdcp::Size _film_size;
/** Size of the panel that we have available */
libdcp::Size _panel_size;
-
- bool _clear_required;
};
diff --git a/src/wx/gain_calculator_dialog.cc b/src/wx/gain_calculator_dialog.cc
index 7f4b774c0..22e6b447a 100644
--- a/src/wx/gain_calculator_dialog.cc
+++ b/src/wx/gain_calculator_dialog.cc
@@ -24,7 +24,7 @@
using namespace boost;
GainCalculatorDialog::GainCalculatorDialog (wxWindow* parent)
- : wxDialog (parent, wxID_ANY, wxString (_("Gain Calculator")))
+ : wxDialog (parent, wxID_ANY, _("Gain Calculator"))
{
wxFlexGridSizer* table = new wxFlexGridSizer (2, 6, 6);
table->AddGrowableCol (1, 1);
diff --git a/src/wx/job_manager_view.cc b/src/wx/job_manager_view.cc
index 7361f29a8..f7d2315cc 100644
--- a/src/wx/job_manager_view.cc
+++ b/src/wx/job_manager_view.cc
@@ -42,7 +42,7 @@ JobManagerView::JobManagerView (wxWindow* parent)
sizer->Add (_panel, 1, wxEXPAND);
SetSizer (sizer);
- _table = new wxFlexGridSizer (4, 6, 6);
+ _table = new wxFlexGridSizer (5, 6, 6);
_table->AddGrowableCol (1, 1);
_panel->SetSizer (_table);
@@ -85,10 +85,14 @@ JobManagerView::update ()
r.message = new wxStaticText (_panel, wxID_ANY, std_to_wx (""));
_table->Insert (index + 2, r.message, 1, wxALIGN_CENTER_VERTICAL | wxALL, 6);
+ r.cancel = new wxButton (_panel, wxID_ANY, _("Cancel"));
+ r.cancel->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (JobManagerView::cancel_clicked), 0, this);
+ _table->Insert (index + 3, r.cancel, 1, wxALIGN_CENTER_VERTICAL | wxALL, 6);
+
r.details = new wxButton (_panel, wxID_ANY, _("Details..."));
r.details->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (JobManagerView::details_clicked), 0, this);
r.details->Enable (false);
- _table->Insert (index + 3, r.details, 1, wxALIGN_CENTER_VERTICAL | wxALL, 6);
+ _table->Insert (index + 4, r.details, 1, wxALIGN_CENTER_VERTICAL | wxALL, 6);
_job_records[*i] = r;
}
@@ -105,18 +109,21 @@ JobManagerView::update ()
_job_records[*i].gauge->Pulse ();
}
}
-
+
if ((*i)->finished() && !_job_records[*i].finalised) {
- _job_records[*i].gauge->SetValue (100);
checked_set (_job_records[*i].message, st);
+ if (!(*i)->finished_cancelled()) {
+ _job_records[*i].gauge->SetValue (100);
+ }
(*i)->Finished ();
_job_records[*i].finalised = true;
+ _job_records[*i].cancel->Enable (false);
if (!(*i)->error_details().empty ()) {
_job_records[*i].details->Enable (true);
}
}
- index += 4;
+ index += 5;
}
_table->Layout ();
@@ -136,3 +143,15 @@ JobManagerView::details_clicked (wxCommandEvent& ev)
}
}
}
+
+void
+JobManagerView::cancel_clicked (wxCommandEvent& ev)
+{
+ wxObject* o = ev.GetEventObject ();
+
+ for (map<boost::shared_ptr<Job>, JobRecord>::iterator i = _job_records.begin(); i != _job_records.end(); ++i) {
+ if (i->second.cancel == o) {
+ i->first->cancel ();
+ }
+ }
+}
diff --git a/src/wx/job_manager_view.h b/src/wx/job_manager_view.h
index d43e795ea..72ac85c02 100644
--- a/src/wx/job_manager_view.h
+++ b/src/wx/job_manager_view.h
@@ -39,6 +39,7 @@ public:
private:
void periodic (wxTimerEvent &);
+ void cancel_clicked (wxCommandEvent &);
void details_clicked (wxCommandEvent &);
boost::shared_ptr<wxTimer> _timer;
@@ -47,6 +48,7 @@ private:
struct JobRecord {
wxGauge* gauge;
wxStaticText* message;
+ wxButton* cancel;
wxButton* details;
bool finalised;
};
diff --git a/src/wx/job_wrapper.cc b/src/wx/job_wrapper.cc
index 8ddd3a348..df4aa7d2e 100644
--- a/src/wx/job_wrapper.cc
+++ b/src/wx/job_wrapper.cc
@@ -35,8 +35,8 @@ JobWrapper::make_dcp (wxWindow* parent, shared_ptr<Film> film)
try {
film->make_dcp ();
} catch (BadSettingError& e) {
- error_dialog (parent, wxString::Format (_("Bad setting for %s (%s)"), e.setting().c_str(), e.what()));
+ error_dialog (parent, wxString::Format (_("Bad setting for %s (%s)"), std_to_wx(e.setting()).data(), std_to_wx(e.what()).data()));
} catch (std::exception& e) {
- error_dialog (parent, wxString::Format (_("Could not make DCP: %s"), e.what ()));
+ error_dialog (parent, wxString::Format (_("Could not make DCP: %s"), std_to_wx(e.what()).data()));
}
}
diff --git a/src/wx/po/es_ES.po b/src/wx/po/es_ES.po
new file mode 100644
index 000000000..207708589
--- /dev/null
+++ b/src/wx/po/es_ES.po
@@ -0,0 +1,508 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libdvdomatic-wx\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-04-09 11:14+0100\n"
+"PO-Revision-Date: 2013-04-02 19:08-0500\n"
+"Last-Translator: Manuel AC <manuel.acevedo@civantos.>\n"
+"Language-Team: Manuel AC <manuel.acevedo@civantos.com>\n"
+"Language: es-ES\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.5\n"
+
+#: src/wx/film_editor.cc:445
+msgid "%"
+msgstr "%"
+
+#: src/wx/config_dialog.cc:61
+msgid "(restart DVD-o-matic to see language changes)"
+msgstr ""
+
+#: src/wx/film_editor.cc:1269
+msgid "1 channel"
+msgstr "1 canal"
+
+#: src/wx/film_editor.cc:184
+msgid "A/B"
+msgstr "A/B"
+
+#: src/wx/config_dialog.cc:143
+msgid "Add"
+msgstr "Añadir"
+
+#: src/wx/audio_dialog.cc:32 src/wx/film_editor.cc:77
+msgid "Audio"
+msgstr "Audio"
+
+#: src/wx/film_editor.cc:381
+msgid "Audio Delay"
+msgstr "Retardo del audio"
+
+#: src/wx/film_editor.cc:369
+msgid "Audio Gain"
+msgstr "Ganancia del audio"
+
+#: src/wx/dci_metadata_dialog.cc:33
+msgid "Audio Language (e.g. EN)"
+msgstr "Idioma del audio (ej. ES)"
+
+#: src/wx/film_editor.cc:820
+#, c-format
+msgid "Audio will be resampled from %dHz to %dHz\n"
+msgstr ""
+
+#: src/wx/job_wrapper.cc:38
+#, c-format
+msgid "Bad setting for %s (%s)"
+msgstr "Configuración erronea para %s (%s)"
+
+#: src/wx/film_editor.cc:288
+msgid "Bottom crop"
+msgstr "Recortar abajo"
+
+#: src/wx/dir_picker_ctrl.cc:38
+msgid "Browse..."
+msgstr "Explorar..."
+
+#: src/wx/gain_calculator_dialog.cc:36
+msgid "But I have to use fader"
+msgstr "pero tengo que usar el fader a"
+
+#: src/wx/film_editor.cc:374
+msgid "Calculate..."
+msgstr "Calcular..."
+
+#: src/wx/job_manager_view.cc:88
+msgid "Cancel"
+msgstr ""
+
+#: src/wx/audio_dialog.cc:43
+msgid "Channels"
+msgstr "Canales"
+
+#: src/wx/film_editor.cc:325
+msgid "Colour look-up table"
+msgstr "Tabla de referencia de colores"
+
+#: src/wx/film_editor.cc:120
+msgid "Content"
+msgstr "Contenido"
+
+#: src/wx/film_editor.cc:130
+msgid "Content Type"
+msgstr "Tipo de contenido"
+
+#: src/wx/film_viewer.cc:415
+#, c-format
+msgid "Could not decode video for view (%s)"
+msgstr "No se pudo decodificar el vídeo para mostrarlo (%s)"
+
+#: src/wx/job_wrapper.cc:40
+#, c-format
+msgid "Could not make DCP: %s"
+msgstr "No se pudo crear el DCP: %s"
+
+#: src/wx/film_viewer.cc:107
+#, c-format
+msgid "Could not open content file (%s)"
+msgstr "No se pudo abrir el fichero (%s)"
+
+#: src/wx/film_editor.cc:509
+#, c-format
+msgid "Could not set content: %s"
+msgstr "No se pudo establecer el contenido: %s"
+
+#: src/wx/new_film_dialog.cc:46
+msgid "Create in folder"
+msgstr "Crear en carpeta"
+
+#: src/wx/film_editor.cc:1363
+#, c-format
+msgid "Cropped to %dx%d (%.2f:1)\n"
+msgstr ""
+
+#: src/wx/dci_metadata_dialog.cc:28
+msgid "DCI name"
+msgstr "Nombre DCI"
+
+#: src/wx/film_editor.cc:141
+msgid "DCP Frame Rate"
+msgstr "Velocidad DCP"
+
+#: src/wx/film_editor.cc:109
+msgid "DCP Name"
+msgstr "Nombre DCP"
+
+#: src/wx/wx_util.cc:61
+msgid "DVD-o-matic"
+msgstr "DVD-o-matic"
+
+#: src/wx/config_dialog.cc:44
+msgid "DVD-o-matic Preferences"
+msgstr "Preferencias DVD-o-matic"
+
+#: src/wx/audio_dialog.cc:101
+#, fuzzy, c-format
+msgid "DVD-o-matic audio - %s"
+msgstr "Audio DVD-o-matic - %1"
+
+#: src/wx/config_dialog.cc:102
+msgid "Default DCI name details"
+msgstr "Detalles por defecto del nombre DCI"
+
+#: src/wx/config_dialog.cc:93
+msgid "Default directory for new films"
+msgstr "Carpeta por defecto para nuevas películas"
+
+#: src/wx/film_editor.cc:116 src/wx/job_manager_view.cc:92
+msgid "Details..."
+msgstr "Detalles..."
+
+#: src/wx/properties_dialog.cc:45
+msgid "Disk space required"
+msgstr "Espacio requerido en disco"
+
+#: src/wx/film_editor.cc:191
+msgid "Duration"
+msgstr "Duración"
+
+#: src/wx/config_dialog.cc:145
+msgid "Edit"
+msgstr "Editar"
+
+#: src/wx/config_dialog.cc:103 src/wx/config_dialog.cc:122
+#: src/wx/film_editor.cc:308
+msgid "Edit..."
+msgstr "Editar..."
+
+#: src/wx/config_dialog.cc:128
+msgid "Encoding Servers"
+msgstr "Servidores de codificación"
+
+#: src/wx/film_editor.cc:176
+msgid "End"
+msgstr "Fin"
+
+#: src/wx/dci_metadata_dialog.cc:53
+msgid "Facility (e.g. DLA)"
+msgstr "Compañía (ej. DLA)"
+
+#: src/wx/film_editor.cc:73
+msgid "Film"
+msgstr "Película"
+
+#: src/wx/properties_dialog.cc:36
+msgid "Film Properties"
+msgstr "Propiedades de la película"
+
+#: src/wx/new_film_dialog.cc:42
+msgid "Film name"
+msgstr "Nombre de la película"
+
+#: src/wx/film_editor.cc:303 src/wx/filter_dialog.cc:32
+msgid "Filters"
+msgstr "Filtros"
+
+#: src/wx/film_editor.cc:268
+msgid "Format"
+msgstr "Formato"
+
+#: src/wx/properties_dialog.cc:41
+msgid "Frames"
+msgstr "Fotogramas"
+
+#: src/wx/properties_dialog.cc:49
+msgid "Frames already encoded"
+msgstr "Fotogramas ya codificados"
+
+#: src/wx/gain_calculator_dialog.cc:27
+msgid "Gain Calculator"
+msgstr "Calculadora de ganancia"
+
+#: src/wx/properties_dialog.cc:59
+msgid "Gb"
+msgstr "Gb"
+
+#: src/wx/server_dialog.cc:36
+msgid "Host name or IP address"
+msgstr "Nombre o dirección IP"
+
+#: src/wx/film_editor.cc:1273
+msgid "Hz"
+msgstr "Hz"
+
+#: src/wx/gain_calculator_dialog.cc:32
+msgid "I want to play this back at fader"
+msgstr "Quiero reproducir con el fader a"
+
+#: src/wx/config_dialog.cc:132
+msgid "IP address"
+msgstr "Dirección IP"
+
+#: src/wx/film_editor.cc:335
+msgid "JPEG2000 bandwidth"
+msgstr "Ancho de banda JPEG2000"
+
+#: src/wx/film_editor.cc:273
+msgid "Left crop"
+msgstr "Recorte izquierda"
+
+#: src/wx/film_editor.cc:164
+msgid "Length"
+msgstr "Longitud"
+
+#: src/wx/film_editor.cc:339
+msgid "MBps"
+msgstr "MBps"
+
+#: src/wx/dir_picker_ctrl.cc:52
+msgid "My Documents"
+msgstr "Mis documentos"
+
+#: src/wx/film_editor.cc:104
+msgid "Name"
+msgstr "Nombre"
+
+#: src/wx/new_film_dialog.cc:33
+msgid "New Film"
+msgstr "Nueva película"
+
+#: src/wx/film_editor.cc:305 src/wx/film_editor.cc:667
+msgid "None"
+msgstr "Ninguno"
+
+#: src/wx/film_editor.cc:135
+msgid "Original Frame Rate"
+msgstr "Velocidad original"
+
+#: src/wx/film_editor.cc:159
+msgid "Original Size"
+msgstr "Tamaño original"
+
+#: src/wx/film_editor.cc:1352
+#, c-format
+msgid "Original video is %dx%d (%.2f:1)\n"
+msgstr ""
+
+#: src/wx/dci_metadata_dialog.cc:57
+msgid "Package Type (e.g. OV)"
+msgstr "Tipo de paquete (ej. OV)"
+
+#: src/wx/film_editor.cc:1384
+#, c-format
+msgid "Padded with black to %dx%d (%.2f:1)\n"
+msgstr ""
+
+#: src/wx/audio_dialog.cc:60
+msgid "Peak"
+msgstr "Pico"
+
+#: src/wx/film_viewer.cc:54
+msgid "Play"
+msgstr "Reproducir"
+
+#: src/wx/audio_plot.cc:109
+msgid "Please wait; audio is being analysed..."
+msgstr "Por favor espere, el audio está siendo analizado..."
+
+#: src/wx/audio_dialog.cc:61
+msgid "RMS"
+msgstr "RMS"
+
+#: src/wx/dci_metadata_dialog.cc:45
+msgid "Rating (e.g. 15)"
+msgstr "Clasificación (ej. 16)"
+
+#: src/wx/config_dialog.cc:118
+msgid "Reference filters for A/B"
+msgstr "Filtros de referencia para A/B"
+
+#: src/wx/config_dialog.cc:107
+msgid "Reference scaler for A/B"
+msgstr "Escalador de referencia para A/B"
+
+#: src/wx/config_dialog.cc:147
+msgid "Remove"
+msgstr "Quitar"
+
+#: src/wx/film_editor.cc:278
+msgid "Right crop"
+msgstr "Recorte derecha"
+
+#: src/wx/job_manager_view.cc:108
+msgid "Running"
+msgstr "Ejecutando"
+
+#: src/wx/film_editor.cc:1376
+#, c-format
+msgid "Scaled to %dx%d (%.2f:1)\n"
+msgstr ""
+
+#: src/wx/film_editor.cc:315
+msgid "Scaler"
+msgstr "Escalador"
+
+#: src/wx/film_editor.cc:407
+msgid "Select Audio File"
+msgstr "Seleccionar fichero de audio"
+
+#: src/wx/film_editor.cc:121
+msgid "Select Content File"
+msgstr "Seleccionar fichero de contenido"
+
+#: src/wx/server_dialog.cc:25
+msgid "Server"
+msgstr "Servidor"
+
+#: src/wx/config_dialog.cc:49
+msgid "Set language"
+msgstr ""
+
+#: src/wx/film_editor.cc:364
+msgid "Show Audio..."
+msgstr "Mostrar audio..."
+
+#: src/wx/audio_dialog.cc:71
+msgid "Smoothing"
+msgstr "Suavizado"
+
+#: src/wx/film_editor.cc:173
+msgid "Start"
+msgstr "Inicio"
+
+#: src/wx/dci_metadata_dialog.cc:49
+msgid "Studio (e.g. TCF)"
+msgstr "Estudio (ej. TCF)"
+
+#: src/wx/dci_metadata_dialog.cc:37
+msgid "Subtitle Language (e.g. FR)"
+msgstr "Idioma del subtítulo (ej. EN)"
+
+#: src/wx/film_editor.cc:432
+msgid "Subtitle Offset"
+msgstr "Desplazamiento del subtítulo"
+
+#: src/wx/film_editor.cc:441
+msgid "Subtitle Scale"
+msgstr "Escala del subtítulo"
+
+#: src/wx/film_editor.cc:79
+msgid "Subtitles"
+msgstr "Subtítulos"
+
+#: src/wx/config_dialog.cc:68
+msgid "TMS IP address"
+msgstr "Dirección IP del TMS"
+
+#: src/wx/config_dialog.cc:83
+msgid "TMS password"
+msgstr "Clave del TMS"
+
+#: src/wx/config_dialog.cc:73
+msgid "TMS target path"
+msgstr "Ruta en el TMS"
+
+#: src/wx/config_dialog.cc:78
+msgid "TMS user name"
+msgstr "Usuario del TMS"
+
+#: src/wx/dci_metadata_dialog.cc:41
+msgid "Territory (e.g. UK)"
+msgstr "Territorio (ej. ES)"
+
+#: src/wx/config_dialog.cc:136
+msgid "Threads"
+msgstr "Hilos"
+
+#: src/wx/server_dialog.cc:40
+msgid "Threads to use"
+msgstr "Hilos a utilizar"
+
+#: src/wx/config_dialog.cc:88
+msgid "Threads to use for encoding on this host"
+msgstr "Hilos a utilizar para la codificación en esta máquina"
+
+#: src/wx/audio_plot.cc:139
+msgid "Time"
+msgstr "Tiempo"
+
+#: src/wx/film_editor.cc:283
+msgid "Top crop"
+msgstr "Recortar arriba"
+
+#: src/wx/film_editor.cc:171
+msgid "Trim frames"
+msgstr "Recortar fotogramas"
+
+#: src/wx/film_editor.cc:125
+msgid "Trust content's header"
+msgstr "Confiar en la cabecera del contenido"
+
+#: src/wx/audio_dialog.cc:55
+msgid "Type"
+msgstr "Tipo"
+
+#: src/wx/film_editor.cc:114
+msgid "Use DCI name"
+msgstr "Usar el nombre DCI"
+
+#: src/wx/film_editor.cc:145
+msgid "Use best"
+msgstr "Usar la mejor"
+
+#: src/wx/film_editor.cc:391
+msgid "Use content's audio"
+msgstr "Usar el audio del contenido"
+
+#: src/wx/film_editor.cc:401
+msgid "Use external audio"
+msgstr "Usar audio externo"
+
+#: src/wx/film_editor.cc:75
+msgid "Video"
+msgstr "Vídeo"
+
+#: src/wx/film_editor.cc:424
+msgid "With Subtitles"
+msgstr "Con subtítulos"
+
+#: src/wx/film_editor.cc:1271
+msgid "channels"
+msgstr "canales"
+
+#: src/wx/properties_dialog.cc:50
+msgid "counting..."
+msgstr "contando..."
+
+#: src/wx/film_editor.cc:373
+msgid "dB"
+msgstr "dB"
+
+#: src/wx/film_editor.cc:696 src/wx/film_editor.cc:699
+msgid "frames"
+msgstr "fotogramas"
+
+#. / TRANSLATORS: this is an abbreviation for milliseconds, the unit of time
+#: src/wx/film_editor.cc:386
+msgid "ms"
+msgstr "ms"
+
+#: src/wx/film_editor.cc:436
+msgid "pixels"
+msgstr ""
+
+#. / TRANSLATORS: `s' here is an abbreviation for seconds, the unit of time
+#: src/wx/film_editor.cc:197
+msgid "s"
+msgstr "s"
+
+#: src/wx/properties_dialog.cc:62 src/wx/properties_dialog.cc:63
+msgid "unknown"
+msgstr "desconocido"
diff --git a/src/wx/po/fr_FR.po b/src/wx/po/fr_FR.po
new file mode 100644
index 000000000..80ee5dbfd
--- /dev/null
+++ b/src/wx/po/fr_FR.po
@@ -0,0 +1,507 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: DVD-o-matic FRENCH\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-04-09 11:14+0100\n"
+"PO-Revision-Date: 2013-03-20 00:34+0100\n"
+"Last-Translator: FreeDCP.net <freedcp.net@gmail.com>\n"
+"Language-Team: \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/wx/film_editor.cc:445
+msgid "%"
+msgstr "%"
+
+#: src/wx/config_dialog.cc:61
+msgid "(restart DVD-o-matic to see language changes)"
+msgstr ""
+
+#: src/wx/film_editor.cc:1269
+msgid "1 channel"
+msgstr "1 canal"
+
+#: src/wx/film_editor.cc:184
+msgid "A/B"
+msgstr "A/B"
+
+#: src/wx/config_dialog.cc:143
+msgid "Add"
+msgstr "Ajouter"
+
+#: src/wx/audio_dialog.cc:32 src/wx/film_editor.cc:77
+msgid "Audio"
+msgstr "Audio"
+
+#: src/wx/film_editor.cc:381
+msgid "Audio Delay"
+msgstr "Délai audio"
+
+#: src/wx/film_editor.cc:369
+msgid "Audio Gain"
+msgstr "Gain audio"
+
+#: src/wx/dci_metadata_dialog.cc:33
+msgid "Audio Language (e.g. EN)"
+msgstr "Langue audio (ex. FR)"
+
+#: src/wx/film_editor.cc:820
+#, c-format
+msgid "Audio will be resampled from %dHz to %dHz\n"
+msgstr ""
+
+#: src/wx/job_wrapper.cc:38
+#, c-format
+msgid "Bad setting for %s (%s)"
+msgstr "Mauvais paramètre pour %s (%s)"
+
+#: src/wx/film_editor.cc:288
+msgid "Bottom crop"
+msgstr "Découpe bas"
+
+#: src/wx/dir_picker_ctrl.cc:38
+msgid "Browse..."
+msgstr "Parcourir..."
+
+#: src/wx/gain_calculator_dialog.cc:36
+msgid "But I have to use fader"
+msgstr "Je souhaite utiliser ce volume"
+
+#: src/wx/film_editor.cc:374
+msgid "Calculate..."
+msgstr "Calcul..."
+
+#: src/wx/job_manager_view.cc:88
+msgid "Cancel"
+msgstr "Annuler"
+
+#: src/wx/audio_dialog.cc:43
+msgid "Channels"
+msgstr "Canaux"
+
+#: src/wx/film_editor.cc:325
+msgid "Colour look-up table"
+msgstr "Espace colorimétrique"
+
+#: src/wx/film_editor.cc:120
+msgid "Content"
+msgstr "Contenu"
+
+#: src/wx/film_editor.cc:130
+msgid "Content Type"
+msgstr "Type de Contenu"
+
+#: src/wx/film_viewer.cc:415
+#, c-format
+msgid "Could not decode video for view (%s)"
+msgstr "Décodage de la vidéo pour visualisation impossible (%s)"
+
+#: src/wx/job_wrapper.cc:40
+#, c-format
+msgid "Could not make DCP: %s"
+msgstr "Impossible de créer le DCP : %s"
+
+#: src/wx/film_viewer.cc:107
+#, c-format
+msgid "Could not open content file (%s)"
+msgstr "Ouverture du contenu impossible (%s)"
+
+#: src/wx/film_editor.cc:509
+#, c-format
+msgid "Could not set content: %s"
+msgstr "Sélectionner du contenu impossible : %s"
+
+#: src/wx/new_film_dialog.cc:46
+msgid "Create in folder"
+msgstr "Créer dans le dossier"
+
+#: src/wx/film_editor.cc:1363
+#, c-format
+msgid "Cropped to %dx%d (%.2f:1)\n"
+msgstr ""
+
+#: src/wx/dci_metadata_dialog.cc:28
+msgid "DCI name"
+msgstr "Nom DCI"
+
+#: src/wx/film_editor.cc:141
+msgid "DCP Frame Rate"
+msgstr "Cadence image du DCP"
+
+#: src/wx/film_editor.cc:109
+msgid "DCP Name"
+msgstr "Nom du DCP"
+
+#: src/wx/wx_util.cc:61
+msgid "DVD-o-matic"
+msgstr "DVD-o-matic"
+
+#: src/wx/config_dialog.cc:44
+msgid "DVD-o-matic Preferences"
+msgstr "Préférences DVD-o-matic"
+
+#: src/wx/audio_dialog.cc:101
+#, c-format
+msgid "DVD-o-matic audio - %s"
+msgstr "Son DVD-o-matic - %s"
+
+#: src/wx/config_dialog.cc:102
+msgid "Default DCI name details"
+msgstr "Détails du nom DCI par défaut"
+
+#: src/wx/config_dialog.cc:93
+msgid "Default directory for new films"
+msgstr "Dossier par défaut des nouveaux films"
+
+#: src/wx/film_editor.cc:116 src/wx/job_manager_view.cc:92
+msgid "Details..."
+msgstr "Détails..."
+
+#: src/wx/properties_dialog.cc:45
+msgid "Disk space required"
+msgstr "Espace disque requis"
+
+#: src/wx/film_editor.cc:191
+msgid "Duration"
+msgstr "Durée"
+
+#: src/wx/config_dialog.cc:145
+msgid "Edit"
+msgstr "Édition"
+
+#: src/wx/config_dialog.cc:103 src/wx/config_dialog.cc:122
+#: src/wx/film_editor.cc:308
+msgid "Edit..."
+msgstr "Éditer..."
+
+#: src/wx/config_dialog.cc:128
+msgid "Encoding Servers"
+msgstr "Serveurs d'encodage"
+
+#: src/wx/film_editor.cc:176
+msgid "End"
+msgstr "Fin"
+
+#: src/wx/dci_metadata_dialog.cc:53
+msgid "Facility (e.g. DLA)"
+msgstr "Laboratoire (ex. DLA)"
+
+#: src/wx/film_editor.cc:73
+msgid "Film"
+msgstr "Film"
+
+#: src/wx/properties_dialog.cc:36
+msgid "Film Properties"
+msgstr "Propriétés du film"
+
+#: src/wx/new_film_dialog.cc:42
+msgid "Film name"
+msgstr "Nom du Film"
+
+#: src/wx/film_editor.cc:303 src/wx/filter_dialog.cc:32
+msgid "Filters"
+msgstr "Filtres"
+
+#: src/wx/film_editor.cc:268
+msgid "Format"
+msgstr "Format"
+
+#: src/wx/properties_dialog.cc:41
+msgid "Frames"
+msgstr "Images"
+
+#: src/wx/properties_dialog.cc:49
+msgid "Frames already encoded"
+msgstr "Images déjà encodées"
+
+#: src/wx/gain_calculator_dialog.cc:27
+msgid "Gain Calculator"
+msgstr "Calculateur de gain"
+
+#: src/wx/properties_dialog.cc:59
+msgid "Gb"
+msgstr "Gb"
+
+#: src/wx/server_dialog.cc:36
+msgid "Host name or IP address"
+msgstr "Nom de l'hôte ou adresse IP"
+
+#: src/wx/film_editor.cc:1273
+msgid "Hz"
+msgstr "Hz"
+
+#: src/wx/gain_calculator_dialog.cc:32
+msgid "I want to play this back at fader"
+msgstr "Je veux le jouer à ce volume"
+
+#: src/wx/config_dialog.cc:132
+msgid "IP address"
+msgstr "Adresse IP"
+
+#: src/wx/film_editor.cc:335
+msgid "JPEG2000 bandwidth"
+msgstr "Qualité JPEG2000"
+
+#: src/wx/film_editor.cc:273
+msgid "Left crop"
+msgstr "Découpe gauche"
+
+#: src/wx/film_editor.cc:164
+msgid "Length"
+msgstr "Longueur / durée"
+
+#: src/wx/film_editor.cc:339
+msgid "MBps"
+msgstr "MBps"
+
+#: src/wx/dir_picker_ctrl.cc:52
+msgid "My Documents"
+msgstr "Mes Documents"
+
+#: src/wx/film_editor.cc:104
+msgid "Name"
+msgstr "Nom"
+
+#: src/wx/new_film_dialog.cc:33
+msgid "New Film"
+msgstr "Nouveau Film"
+
+#: src/wx/film_editor.cc:305 src/wx/film_editor.cc:667
+msgid "None"
+msgstr "Aucun"
+
+#: src/wx/film_editor.cc:135
+msgid "Original Frame Rate"
+msgstr "Cadence d'images originale"
+
+#: src/wx/film_editor.cc:159
+msgid "Original Size"
+msgstr "Taille Originale"
+
+#: src/wx/film_editor.cc:1352
+#, c-format
+msgid "Original video is %dx%d (%.2f:1)\n"
+msgstr ""
+
+#: src/wx/dci_metadata_dialog.cc:57
+msgid "Package Type (e.g. OV)"
+msgstr "Type de paquet (ex. OV)"
+
+#: src/wx/film_editor.cc:1384
+#, c-format
+msgid "Padded with black to %dx%d (%.2f:1)\n"
+msgstr ""
+
+#: src/wx/audio_dialog.cc:60
+msgid "Peak"
+msgstr "Crête"
+
+#: src/wx/film_viewer.cc:54
+msgid "Play"
+msgstr "Lecture"
+
+#: src/wx/audio_plot.cc:109
+msgid "Please wait; audio is being analysed..."
+msgstr "Merci de patienter ; analyse de la piste son..."
+
+#: src/wx/audio_dialog.cc:61
+msgid "RMS"
+msgstr "RMS"
+
+#: src/wx/dci_metadata_dialog.cc:45
+msgid "Rating (e.g. 15)"
+msgstr "Rating (ex. 15)"
+
+#: src/wx/config_dialog.cc:118
+msgid "Reference filters for A/B"
+msgstr "Filtres de référence pour A/B"
+
+#: src/wx/config_dialog.cc:107
+msgid "Reference scaler for A/B"
+msgstr "Échelle de référence pour A/B"
+
+#: src/wx/config_dialog.cc:147
+msgid "Remove"
+msgstr "Supprimer"
+
+#: src/wx/film_editor.cc:278
+msgid "Right crop"
+msgstr "Découpe droite"
+
+#: src/wx/job_manager_view.cc:108
+msgid "Running"
+msgstr "Progression"
+
+#: src/wx/film_editor.cc:1376
+#, c-format
+msgid "Scaled to %dx%d (%.2f:1)\n"
+msgstr ""
+
+#: src/wx/film_editor.cc:315
+msgid "Scaler"
+msgstr "Mise à l'échelle"
+
+#: src/wx/film_editor.cc:407
+msgid "Select Audio File"
+msgstr "Sélectionner le fichier son"
+
+#: src/wx/film_editor.cc:121
+msgid "Select Content File"
+msgstr "Sélectionner le fichier vidéo"
+
+#: src/wx/server_dialog.cc:25
+msgid "Server"
+msgstr "Serveur"
+
+#: src/wx/config_dialog.cc:49
+msgid "Set language"
+msgstr ""
+
+#: src/wx/film_editor.cc:364
+msgid "Show Audio..."
+msgstr "Analyser le son..."
+
+#: src/wx/audio_dialog.cc:71
+msgid "Smoothing"
+msgstr "Lissage"
+
+#: src/wx/film_editor.cc:173
+msgid "Start"
+msgstr "Début"
+
+#: src/wx/dci_metadata_dialog.cc:49
+msgid "Studio (e.g. TCF)"
+msgstr "Studio (ex. TCF)"
+
+#: src/wx/dci_metadata_dialog.cc:37
+msgid "Subtitle Language (e.g. FR)"
+msgstr "Langue de sous-titres (ex. FR)"
+
+#: src/wx/film_editor.cc:432
+msgid "Subtitle Offset"
+msgstr "Décalage du sous-titre"
+
+#: src/wx/film_editor.cc:441
+msgid "Subtitle Scale"
+msgstr "Taille du sous-titre"
+
+#: src/wx/film_editor.cc:79
+msgid "Subtitles"
+msgstr "Sous-titres"
+
+#: src/wx/config_dialog.cc:68
+msgid "TMS IP address"
+msgstr "Adresse IP du TMS"
+
+#: src/wx/config_dialog.cc:83
+msgid "TMS password"
+msgstr "Mot de passe du TMS"
+
+#: src/wx/config_dialog.cc:73
+msgid "TMS target path"
+msgstr "Chemin d'accès du TMS"
+
+#: src/wx/config_dialog.cc:78
+msgid "TMS user name"
+msgstr "Nom d'utilisateur du TMS"
+
+#: src/wx/dci_metadata_dialog.cc:41
+msgid "Territory (e.g. UK)"
+msgstr "Territoire (ex. FR)"
+
+#: src/wx/config_dialog.cc:136
+msgid "Threads"
+msgstr "Processus"
+
+#: src/wx/server_dialog.cc:40
+msgid "Threads to use"
+msgstr "Nombre de processus à utiliser"
+
+#: src/wx/config_dialog.cc:88
+msgid "Threads to use for encoding on this host"
+msgstr "Nombre de processus à utiliser sur cet hôte"
+
+#: src/wx/audio_plot.cc:139
+msgid "Time"
+msgstr "Durée"
+
+#: src/wx/film_editor.cc:283
+msgid "Top crop"
+msgstr "Découpe haut"
+
+#: src/wx/film_editor.cc:171
+msgid "Trim frames"
+msgstr "Images coupées"
+
+#: src/wx/film_editor.cc:125
+msgid "Trust content's header"
+msgstr "Faire confiance à l'en-tête"
+
+#: src/wx/audio_dialog.cc:55
+msgid "Type"
+msgstr "Type"
+
+#: src/wx/film_editor.cc:114
+msgid "Use DCI name"
+msgstr "Utiliser le nom DCI"
+
+#: src/wx/film_editor.cc:145
+msgid "Use best"
+msgstr "Automatique"
+
+#: src/wx/film_editor.cc:391
+msgid "Use content's audio"
+msgstr "Utiliser le son intégré"
+
+#: src/wx/film_editor.cc:401
+msgid "Use external audio"
+msgstr "Utiliser une source audio externe"
+
+#: src/wx/film_editor.cc:75
+msgid "Video"
+msgstr "Vidéo"
+
+#: src/wx/film_editor.cc:424
+msgid "With Subtitles"
+msgstr "Avec sous-titres"
+
+#: src/wx/film_editor.cc:1271
+msgid "channels"
+msgstr "canaux"
+
+#: src/wx/properties_dialog.cc:50
+msgid "counting..."
+msgstr "calcul..."
+
+#: src/wx/film_editor.cc:373
+msgid "dB"
+msgstr "dB"
+
+#: src/wx/film_editor.cc:696 src/wx/film_editor.cc:699
+msgid "frames"
+msgstr "images"
+
+#. / TRANSLATORS: this is an abbreviation for milliseconds, the unit of time
+#: src/wx/film_editor.cc:386
+msgid "ms"
+msgstr "ms"
+
+#: src/wx/film_editor.cc:436
+msgid "pixels"
+msgstr ""
+
+#. / TRANSLATORS: `s' here is an abbreviation for seconds, the unit of time
+#: src/wx/film_editor.cc:197
+msgid "s"
+msgstr "s"
+
+#: src/wx/properties_dialog.cc:62 src/wx/properties_dialog.cc:63
+msgid "unknown"
+msgstr "inconnu"
diff --git a/src/wx/po/it_IT.po b/src/wx/po/it_IT.po
new file mode 100644
index 000000000..78fd0dee9
--- /dev/null
+++ b/src/wx/po/it_IT.po
@@ -0,0 +1,508 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: IT VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-04-09 11:14+0100\n"
+"PO-Revision-Date: 2013-04-03 12:37+0100\n"
+"Last-Translator: Maci <macibro@gmail.com>\n"
+"Language-Team: \n"
+"Language: Italiano\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.5\n"
+
+#: src/wx/film_editor.cc:445
+msgid "%"
+msgstr "%"
+
+#: src/wx/config_dialog.cc:61
+msgid "(restart DVD-o-matic to see language changes)"
+msgstr "(riavviare DVD-o-matic per vedere i cambiamenti di lingua)"
+
+#: src/wx/film_editor.cc:1269
+msgid "1 channel"
+msgstr "Canale 1"
+
+#: src/wx/film_editor.cc:184
+msgid "A/B"
+msgstr "A/B"
+
+#: src/wx/config_dialog.cc:143
+msgid "Add"
+msgstr "Aggiungi"
+
+#: src/wx/audio_dialog.cc:32 src/wx/film_editor.cc:77
+msgid "Audio"
+msgstr "Audio"
+
+#: src/wx/film_editor.cc:381
+msgid "Audio Delay"
+msgstr "Ritardo dell'audio"
+
+#: src/wx/film_editor.cc:369
+msgid "Audio Gain"
+msgstr "Guadagno dell'audio"
+
+#: src/wx/dci_metadata_dialog.cc:33
+msgid "Audio Language (e.g. EN)"
+msgstr "Lingua dell'audio (es. EN)"
+
+#: src/wx/film_editor.cc:820
+#, c-format
+msgid "Audio will be resampled from %dHz to %dHz\n"
+msgstr ""
+
+#: src/wx/job_wrapper.cc:38
+#, c-format
+msgid "Bad setting for %s (%s)"
+msgstr "Valore sbagliato per %s (%s)"
+
+#: src/wx/film_editor.cc:288
+msgid "Bottom crop"
+msgstr "Taglio in basso"
+
+#: src/wx/dir_picker_ctrl.cc:38
+msgid "Browse..."
+msgstr "Sfoglia..."
+
+#: src/wx/gain_calculator_dialog.cc:36
+msgid "But I have to use fader"
+msgstr "Ma dovrò riprodurre con il fader a"
+
+#: src/wx/film_editor.cc:374
+msgid "Calculate..."
+msgstr "Calcola..."
+
+#: src/wx/job_manager_view.cc:88
+msgid "Cancel"
+msgstr "Annulla"
+
+#: src/wx/audio_dialog.cc:43
+msgid "Channels"
+msgstr "Canali"
+
+#: src/wx/film_editor.cc:325
+msgid "Colour look-up table"
+msgstr "Tabella per ricerca del colore"
+
+#: src/wx/film_editor.cc:120
+msgid "Content"
+msgstr "Contenuto"
+
+#: src/wx/film_editor.cc:130
+msgid "Content Type"
+msgstr "Tipo di contenuto"
+
+#: src/wx/film_viewer.cc:415
+#, c-format
+msgid "Could not decode video for view (%s)"
+msgstr "Non posso decodificare il video per guardarlo (%s)"
+
+#: src/wx/job_wrapper.cc:40
+#, c-format
+msgid "Could not make DCP: %s"
+msgstr "Non posso creare il DCP: %s"
+
+#: src/wx/film_viewer.cc:107
+#, c-format
+msgid "Could not open content file (%s)"
+msgstr "Non posso aprire il file del contenuto (%s)"
+
+#: src/wx/film_editor.cc:509
+#, c-format
+msgid "Could not set content: %s"
+msgstr "Non posso regolare il contenuto: %s"
+
+#: src/wx/new_film_dialog.cc:46
+msgid "Create in folder"
+msgstr "Crea nella cartella"
+
+#: src/wx/film_editor.cc:1363
+#, c-format
+msgid "Cropped to %dx%d (%.2f:1)\n"
+msgstr ""
+
+#: src/wx/dci_metadata_dialog.cc:28
+msgid "DCI name"
+msgstr "Nome del DCP"
+
+#: src/wx/film_editor.cc:141
+msgid "DCP Frame Rate"
+msgstr "Frequenza fotogrammi del DCP"
+
+#: src/wx/film_editor.cc:109
+msgid "DCP Name"
+msgstr "Nome del DCP"
+
+#: src/wx/wx_util.cc:61
+msgid "DVD-o-matic"
+msgstr "DVD-o-matic"
+
+#: src/wx/config_dialog.cc:44
+msgid "DVD-o-matic Preferences"
+msgstr "Preferenze DVD-o-matic"
+
+#: src/wx/audio_dialog.cc:101
+#, c-format
+msgid "DVD-o-matic audio - %s"
+msgstr "Audio DVD-o-matic - %s"
+
+#: src/wx/config_dialog.cc:102
+msgid "Default DCI name details"
+msgstr "Dettagli del nome di default DCI"
+
+#: src/wx/config_dialog.cc:93
+msgid "Default directory for new films"
+msgstr "Directory di default per i nuovi films"
+
+#: src/wx/film_editor.cc:116 src/wx/job_manager_view.cc:92
+msgid "Details..."
+msgstr "Dettagli"
+
+#: src/wx/properties_dialog.cc:45
+msgid "Disk space required"
+msgstr "Spazio su disco rischiesto"
+
+#: src/wx/film_editor.cc:191
+msgid "Duration"
+msgstr "Durata"
+
+#: src/wx/config_dialog.cc:145
+msgid "Edit"
+msgstr "Modifica"
+
+#: src/wx/config_dialog.cc:103 src/wx/config_dialog.cc:122
+#: src/wx/film_editor.cc:308
+msgid "Edit..."
+msgstr "Modifica..."
+
+#: src/wx/config_dialog.cc:128
+msgid "Encoding Servers"
+msgstr "Servers di codifica"
+
+#: src/wx/film_editor.cc:176
+msgid "End"
+msgstr "Fine"
+
+#: src/wx/dci_metadata_dialog.cc:53
+msgid "Facility (e.g. DLA)"
+msgstr "Facility (es. DLA)"
+
+#: src/wx/film_editor.cc:73
+msgid "Film"
+msgstr "Film"
+
+#: src/wx/properties_dialog.cc:36
+msgid "Film Properties"
+msgstr "Proprietà del film"
+
+#: src/wx/new_film_dialog.cc:42
+msgid "Film name"
+msgstr "Nome del film"
+
+#: src/wx/film_editor.cc:303 src/wx/filter_dialog.cc:32
+msgid "Filters"
+msgstr "Filtri"
+
+#: src/wx/film_editor.cc:268
+msgid "Format"
+msgstr "Formato"
+
+#: src/wx/properties_dialog.cc:41
+msgid "Frames"
+msgstr "Fotogrammi"
+
+#: src/wx/properties_dialog.cc:49
+msgid "Frames already encoded"
+msgstr "Fotogrammi già codificati"
+
+#: src/wx/gain_calculator_dialog.cc:27
+msgid "Gain Calculator"
+msgstr "Calcola il guadagno audio"
+
+#: src/wx/properties_dialog.cc:59
+msgid "Gb"
+msgstr "Gb"
+
+#: src/wx/server_dialog.cc:36
+msgid "Host name or IP address"
+msgstr "Nome dell'Host o indirizzo IP"
+
+#: src/wx/film_editor.cc:1273
+msgid "Hz"
+msgstr "Hz"
+
+#: src/wx/gain_calculator_dialog.cc:32
+msgid "I want to play this back at fader"
+msgstr "Sto usando il fader a"
+
+#: src/wx/config_dialog.cc:132
+msgid "IP address"
+msgstr "Indirizzo IP"
+
+#: src/wx/film_editor.cc:335
+msgid "JPEG2000 bandwidth"
+msgstr "Banda passante JPEG2000"
+
+#: src/wx/film_editor.cc:273
+msgid "Left crop"
+msgstr "Taglio a sinistra"
+
+#: src/wx/film_editor.cc:164
+msgid "Length"
+msgstr "Lunghezza"
+
+#: src/wx/film_editor.cc:339
+msgid "MBps"
+msgstr "MBps"
+
+#: src/wx/dir_picker_ctrl.cc:52
+msgid "My Documents"
+msgstr "Documenti"
+
+#: src/wx/film_editor.cc:104
+msgid "Name"
+msgstr "Nome"
+
+#: src/wx/new_film_dialog.cc:33
+msgid "New Film"
+msgstr "Nuovo Film"
+
+#: src/wx/film_editor.cc:305 src/wx/film_editor.cc:667
+msgid "None"
+msgstr "Nessuno"
+
+#: src/wx/film_editor.cc:135
+msgid "Original Frame Rate"
+msgstr "Frequenza fotogrammi originale"
+
+#: src/wx/film_editor.cc:159
+msgid "Original Size"
+msgstr "Dimensione Originale"
+
+#: src/wx/film_editor.cc:1352
+#, c-format
+msgid "Original video is %dx%d (%.2f:1)\n"
+msgstr ""
+
+#: src/wx/dci_metadata_dialog.cc:57
+msgid "Package Type (e.g. OV)"
+msgstr "Tipo di Package (es. OV)"
+
+#: src/wx/film_editor.cc:1384
+#, c-format
+msgid "Padded with black to %dx%d (%.2f:1)\n"
+msgstr ""
+
+#: src/wx/audio_dialog.cc:60
+msgid "Peak"
+msgstr "Picco"
+
+#: src/wx/film_viewer.cc:54
+msgid "Play"
+msgstr "Riproduci"
+
+#: src/wx/audio_plot.cc:109
+msgid "Please wait; audio is being analysed..."
+msgstr "Attendere prego; sto analizzando l'audio..."
+
+#: src/wx/audio_dialog.cc:61
+msgid "RMS"
+msgstr "RMS"
+
+#: src/wx/dci_metadata_dialog.cc:45
+msgid "Rating (e.g. 15)"
+msgstr "Classificazione (es. 15)"
+
+#: src/wx/config_dialog.cc:118
+msgid "Reference filters for A/B"
+msgstr "Filtri di riferimento A/B"
+
+#: src/wx/config_dialog.cc:107
+msgid "Reference scaler for A/B"
+msgstr "Scalatura di riferimento A/B"
+
+#: src/wx/config_dialog.cc:147
+msgid "Remove"
+msgstr "Rimuovi"
+
+#: src/wx/film_editor.cc:278
+msgid "Right crop"
+msgstr "Taglio a destra"
+
+#: src/wx/job_manager_view.cc:108
+msgid "Running"
+msgstr "In corso"
+
+#: src/wx/film_editor.cc:1376
+#, c-format
+msgid "Scaled to %dx%d (%.2f:1)\n"
+msgstr ""
+
+#: src/wx/film_editor.cc:315
+msgid "Scaler"
+msgstr "Scaler"
+
+#: src/wx/film_editor.cc:407
+msgid "Select Audio File"
+msgstr "Seleziona file audio"
+
+#: src/wx/film_editor.cc:121
+msgid "Select Content File"
+msgstr "Seleziona il file con il contenuto"
+
+#: src/wx/server_dialog.cc:25
+msgid "Server"
+msgstr "Server"
+
+#: src/wx/config_dialog.cc:49
+msgid "Set language"
+msgstr "Seleziona la lingua"
+
+#: src/wx/film_editor.cc:364
+msgid "Show Audio..."
+msgstr "Mostra Audio..."
+
+#: src/wx/audio_dialog.cc:71
+msgid "Smoothing"
+msgstr "Levigatura"
+
+#: src/wx/film_editor.cc:173
+msgid "Start"
+msgstr "Inizio"
+
+#: src/wx/dci_metadata_dialog.cc:49
+msgid "Studio (e.g. TCF)"
+msgstr "Studio (es. TCF)"
+
+#: src/wx/dci_metadata_dialog.cc:37
+msgid "Subtitle Language (e.g. FR)"
+msgstr "Lingua dei Sottotitoli (es. FR)"
+
+#: src/wx/film_editor.cc:432
+msgid "Subtitle Offset"
+msgstr "Sfalsamento dei Sottotitoli"
+
+#: src/wx/film_editor.cc:441
+msgid "Subtitle Scale"
+msgstr "Scala dei Sottotitoli"
+
+#: src/wx/film_editor.cc:79
+msgid "Subtitles"
+msgstr "Sottotitoli"
+
+#: src/wx/config_dialog.cc:68
+msgid "TMS IP address"
+msgstr "Indirizzo IP del TMS"
+
+#: src/wx/config_dialog.cc:83
+msgid "TMS password"
+msgstr "Password del TMS"
+
+#: src/wx/config_dialog.cc:73
+msgid "TMS target path"
+msgstr "Percorso di destinazione del TMS"
+
+#: src/wx/config_dialog.cc:78
+msgid "TMS user name"
+msgstr "Nome utente del TMS"
+
+#: src/wx/dci_metadata_dialog.cc:41
+msgid "Territory (e.g. UK)"
+msgstr "Nazione (es. UK)"
+
+#: src/wx/config_dialog.cc:136
+msgid "Threads"
+msgstr "Threads"
+
+#: src/wx/server_dialog.cc:40
+msgid "Threads to use"
+msgstr "Threads da usare"
+
+#: src/wx/config_dialog.cc:88
+msgid "Threads to use for encoding on this host"
+msgstr "Threads da usare per codificare su questo host"
+
+#: src/wx/audio_plot.cc:139
+msgid "Time"
+msgstr "Tempo"
+
+#: src/wx/film_editor.cc:283
+msgid "Top crop"
+msgstr "Taglio in alto"
+
+#: src/wx/film_editor.cc:171
+msgid "Trim frames"
+msgstr "Taglia fotogrammi"
+
+#: src/wx/film_editor.cc:125
+msgid "Trust content's header"
+msgstr "Conferma l'intestazione del contenuto"
+
+#: src/wx/audio_dialog.cc:55
+msgid "Type"
+msgstr "Tipo"
+
+#: src/wx/film_editor.cc:114
+msgid "Use DCI name"
+msgstr "Usa nome DCI"
+
+#: src/wx/film_editor.cc:145
+msgid "Use best"
+msgstr "Usa la migliore"
+
+#: src/wx/film_editor.cc:391
+msgid "Use content's audio"
+msgstr "Usa l'audio del contenuto"
+
+#: src/wx/film_editor.cc:401
+msgid "Use external audio"
+msgstr "Usa l'audio esterno"
+
+#: src/wx/film_editor.cc:75
+msgid "Video"
+msgstr "Video"
+
+#: src/wx/film_editor.cc:424
+msgid "With Subtitles"
+msgstr "Con Sottotitoli"
+
+#: src/wx/film_editor.cc:1271
+msgid "channels"
+msgstr "canali"
+
+#: src/wx/properties_dialog.cc:50
+msgid "counting..."
+msgstr "conteggio..."
+
+#: src/wx/film_editor.cc:373
+msgid "dB"
+msgstr "dB"
+
+#: src/wx/film_editor.cc:696 src/wx/film_editor.cc:699
+msgid "frames"
+msgstr "fotogrammi"
+
+#. / TRANSLATORS: this is an abbreviation for milliseconds, the unit of time
+#: src/wx/film_editor.cc:386
+msgid "ms"
+msgstr "ms"
+
+#: src/wx/film_editor.cc:436
+msgid "pixels"
+msgstr ""
+
+#. / TRANSLATORS: `s' here is an abbreviation for seconds, the unit of time
+#: src/wx/film_editor.cc:197
+msgid "s"
+msgstr "s"
+
+#: src/wx/properties_dialog.cc:62 src/wx/properties_dialog.cc:63
+msgid "unknown"
+msgstr "sconosciuto"
diff --git a/src/wx/po/sv_SE.po b/src/wx/po/sv_SE.po
new file mode 100644
index 000000000..e52589ff0
--- /dev/null
+++ b/src/wx/po/sv_SE.po
@@ -0,0 +1,508 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: DVD-o-matic\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-04-09 11:14+0100\n"
+"PO-Revision-Date: 2013-04-09 10:13+0100\n"
+"Last-Translator: Adam Klotblixt <adam.klotblixt@gmail.com>\n"
+"Language-Team: \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.5\n"
+
+#: src/wx/film_editor.cc:445
+msgid "%"
+msgstr "%"
+
+#: src/wx/config_dialog.cc:61
+msgid "(restart DVD-o-matic to see language changes)"
+msgstr "(starta om DVD-o-matic för att se språkändringar)"
+
+#: src/wx/film_editor.cc:1269
+msgid "1 channel"
+msgstr "1 kanal"
+
+#: src/wx/film_editor.cc:184
+msgid "A/B"
+msgstr "A/B"
+
+#: src/wx/config_dialog.cc:143
+msgid "Add"
+msgstr "Lägg till"
+
+#: src/wx/audio_dialog.cc:32 src/wx/film_editor.cc:77
+msgid "Audio"
+msgstr "Audio"
+
+#: src/wx/film_editor.cc:381
+msgid "Audio Delay"
+msgstr "Audio Fördröjning"
+
+#: src/wx/film_editor.cc:369
+msgid "Audio Gain"
+msgstr "Audio Förstärkning"
+
+#: src/wx/dci_metadata_dialog.cc:33
+msgid "Audio Language (e.g. EN)"
+msgstr "Audio Språk (ex. SV)"
+
+#: src/wx/film_editor.cc:820
+#, c-format
+msgid "Audio will be resampled from %dHz to %dHz\n"
+msgstr "Audio kommer att samplas om från %dHz till %dHz\n"
+
+#: src/wx/job_wrapper.cc:38
+#, c-format
+msgid "Bad setting for %s (%s)"
+msgstr "Felaktig inställning för %s (%s)"
+
+#: src/wx/film_editor.cc:288
+msgid "Bottom crop"
+msgstr "Nedre beskärning"
+
+#: src/wx/dir_picker_ctrl.cc:38
+msgid "Browse..."
+msgstr "Bläddra..."
+
+#: src/wx/gain_calculator_dialog.cc:36
+msgid "But I have to use fader"
+msgstr "Men jag måste använda mixervolym"
+
+#: src/wx/film_editor.cc:374
+msgid "Calculate..."
+msgstr "Beräkna..."
+
+#: src/wx/job_manager_view.cc:88
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: src/wx/audio_dialog.cc:43
+msgid "Channels"
+msgstr "Kanaler"
+
+#: src/wx/film_editor.cc:325
+msgid "Colour look-up table"
+msgstr "Färguppslagningstabell"
+
+#: src/wx/film_editor.cc:120
+msgid "Content"
+msgstr "Innehåll"
+
+#: src/wx/film_editor.cc:130
+msgid "Content Type"
+msgstr "Innehållstyp"
+
+#: src/wx/film_viewer.cc:415
+#, c-format
+msgid "Could not decode video for view (%s)"
+msgstr "Kunde inte avkoda video för visning (%s)"
+
+#: src/wx/job_wrapper.cc:40
+#, c-format
+msgid "Could not make DCP: %s"
+msgstr "Kunde inte skapa DCP: %s"
+
+#: src/wx/film_viewer.cc:107
+#, c-format
+msgid "Could not open content file (%s)"
+msgstr "Kunde inte öppna innehållsfilen (%s)"
+
+#: src/wx/film_editor.cc:509
+#, c-format
+msgid "Could not set content: %s"
+msgstr "Kunde inte fastställa innehåll: %s"
+
+#: src/wx/new_film_dialog.cc:46
+msgid "Create in folder"
+msgstr "Skapa i katalog"
+
+#: src/wx/film_editor.cc:1363
+#, c-format
+msgid "Cropped to %dx%d (%.2f:1)\n"
+msgstr "Beskuren till %dx%d (%.2f:1)\n"
+
+#: src/wx/dci_metadata_dialog.cc:28
+msgid "DCI name"
+msgstr "DCI namn"
+
+#: src/wx/film_editor.cc:141
+msgid "DCP Frame Rate"
+msgstr "DCP bildhastighet"
+
+#: src/wx/film_editor.cc:109
+msgid "DCP Name"
+msgstr "DCP Namn"
+
+#: src/wx/wx_util.cc:61
+msgid "DVD-o-matic"
+msgstr "DVD-o-matic"
+
+#: src/wx/config_dialog.cc:44
+msgid "DVD-o-matic Preferences"
+msgstr "DVD-o-matic Inställningar"
+
+#: src/wx/audio_dialog.cc:101
+#, c-format
+msgid "DVD-o-matic audio - %s"
+msgstr "DVD-o-matic audio - %s"
+
+#: src/wx/config_dialog.cc:102
+msgid "Default DCI name details"
+msgstr "Detaljer om förvalda DCI-namn"
+
+#: src/wx/config_dialog.cc:93
+msgid "Default directory for new films"
+msgstr "Förvald katalog för nya filmer"
+
+#: src/wx/film_editor.cc:116 src/wx/job_manager_view.cc:92
+msgid "Details..."
+msgstr "Detaljer..."
+
+#: src/wx/properties_dialog.cc:45
+msgid "Disk space required"
+msgstr "Diskutrymme som krävs"
+
+#: src/wx/film_editor.cc:191
+msgid "Duration"
+msgstr "Längd"
+
+#: src/wx/config_dialog.cc:145
+msgid "Edit"
+msgstr "Redigera"
+
+#: src/wx/config_dialog.cc:103 src/wx/config_dialog.cc:122
+#: src/wx/film_editor.cc:308
+msgid "Edit..."
+msgstr "Redigera..."
+
+#: src/wx/config_dialog.cc:128
+msgid "Encoding Servers"
+msgstr "Kodningsservrar"
+
+#: src/wx/film_editor.cc:176
+msgid "End"
+msgstr "Slut"
+
+#: src/wx/dci_metadata_dialog.cc:53
+msgid "Facility (e.g. DLA)"
+msgstr "Företag (ex. DLA)"
+
+#: src/wx/film_editor.cc:73
+msgid "Film"
+msgstr "Film"
+
+#: src/wx/properties_dialog.cc:36
+msgid "Film Properties"
+msgstr "Film Egenskaper"
+
+#: src/wx/new_film_dialog.cc:42
+msgid "Film name"
+msgstr "film namn"
+
+#: src/wx/film_editor.cc:303 src/wx/filter_dialog.cc:32
+msgid "Filters"
+msgstr "Filter"
+
+#: src/wx/film_editor.cc:268
+msgid "Format"
+msgstr "Format"
+
+#: src/wx/properties_dialog.cc:41
+msgid "Frames"
+msgstr "Bildrutor"
+
+#: src/wx/properties_dialog.cc:49
+msgid "Frames already encoded"
+msgstr "Bildrutor redan kodade"
+
+#: src/wx/gain_calculator_dialog.cc:27
+msgid "Gain Calculator"
+msgstr "Volym Kalkylator"
+
+#: src/wx/properties_dialog.cc:59
+msgid "Gb"
+msgstr "Gb"
+
+#: src/wx/server_dialog.cc:36
+msgid "Host name or IP address"
+msgstr "Värd-namn eller IP-adress"
+
+#: src/wx/film_editor.cc:1273
+msgid "Hz"
+msgstr "Hz"
+
+#: src/wx/gain_calculator_dialog.cc:32
+msgid "I want to play this back at fader"
+msgstr "Jag vill spela upp detta med mixervolym"
+
+#: src/wx/config_dialog.cc:132
+msgid "IP address"
+msgstr "IP-adress"
+
+#: src/wx/film_editor.cc:335
+msgid "JPEG2000 bandwidth"
+msgstr "JPEG2000 bandbredd"
+
+#: src/wx/film_editor.cc:273
+msgid "Left crop"
+msgstr "Vänster beskärning"
+
+#: src/wx/film_editor.cc:164
+msgid "Length"
+msgstr "Längd"
+
+#: src/wx/film_editor.cc:339
+msgid "MBps"
+msgstr "MBps"
+
+#: src/wx/dir_picker_ctrl.cc:52
+msgid "My Documents"
+msgstr "Mina Dokument"
+
+#: src/wx/film_editor.cc:104
+msgid "Name"
+msgstr "Namn"
+
+#: src/wx/new_film_dialog.cc:33
+msgid "New Film"
+msgstr "Ny Film"
+
+#: src/wx/film_editor.cc:305 src/wx/film_editor.cc:667
+msgid "None"
+msgstr "Inget"
+
+#: src/wx/film_editor.cc:135
+msgid "Original Frame Rate"
+msgstr "Ursprunglig bildhastighet"
+
+#: src/wx/film_editor.cc:159
+msgid "Original Size"
+msgstr "Ursprunglig Storlek"
+
+#: src/wx/film_editor.cc:1352
+#, c-format
+msgid "Original video is %dx%d (%.2f:1)\n"
+msgstr "Original-videon är %dx%d (%.2f:1)\n"
+
+#: src/wx/dci_metadata_dialog.cc:57
+msgid "Package Type (e.g. OV)"
+msgstr "Förpackningstyp (ex. OV)"
+
+#: src/wx/film_editor.cc:1384
+#, c-format
+msgid "Padded with black to %dx%d (%.2f:1)\n"
+msgstr "Svarta kanter tillagda för %dx%d (%.2f:1)\n"
+
+#: src/wx/audio_dialog.cc:60
+msgid "Peak"
+msgstr "Topp"
+
+#: src/wx/film_viewer.cc:54
+msgid "Play"
+msgstr "Spela"
+
+#: src/wx/audio_plot.cc:109
+msgid "Please wait; audio is being analysed..."
+msgstr "Vänligen vänta; audio analyseras..."
+
+#: src/wx/audio_dialog.cc:61
+msgid "RMS"
+msgstr "RMS"
+
+#: src/wx/dci_metadata_dialog.cc:45
+msgid "Rating (e.g. 15)"
+msgstr "Klassificering (ex. 15)"
+
+#: src/wx/config_dialog.cc:118
+msgid "Reference filters for A/B"
+msgstr "Referensfilter för A/B"
+
+#: src/wx/config_dialog.cc:107
+msgid "Reference scaler for A/B"
+msgstr "Referensomskalare för A/B"
+
+#: src/wx/config_dialog.cc:147
+msgid "Remove"
+msgstr "Ta bort"
+
+#: src/wx/film_editor.cc:278
+msgid "Right crop"
+msgstr "Höger beskärning"
+
+#: src/wx/job_manager_view.cc:108
+msgid "Running"
+msgstr "Körs"
+
+#: src/wx/film_editor.cc:1376
+#, c-format
+msgid "Scaled to %dx%d (%.2f:1)\n"
+msgstr "Skalad till %dx%d (%.2f:1)\n"
+
+#: src/wx/film_editor.cc:315
+msgid "Scaler"
+msgstr "Omskalare"
+
+#: src/wx/film_editor.cc:407
+msgid "Select Audio File"
+msgstr "Välj audiofil"
+
+#: src/wx/film_editor.cc:121
+msgid "Select Content File"
+msgstr "Välj innehållsfil"
+
+#: src/wx/server_dialog.cc:25
+msgid "Server"
+msgstr "Server"
+
+#: src/wx/config_dialog.cc:49
+msgid "Set language"
+msgstr "Välj språk"
+
+#: src/wx/film_editor.cc:364
+msgid "Show Audio..."
+msgstr "Visa Audio..."
+
+#: src/wx/audio_dialog.cc:71
+msgid "Smoothing"
+msgstr "Utjämning"
+
+#: src/wx/film_editor.cc:173
+msgid "Start"
+msgstr "Start"
+
+#: src/wx/dci_metadata_dialog.cc:49
+msgid "Studio (e.g. TCF)"
+msgstr "Studio (ex. TCF)"
+
+#: src/wx/dci_metadata_dialog.cc:37
+msgid "Subtitle Language (e.g. FR)"
+msgstr "Undertextspråk (ex. SV)"
+
+#: src/wx/film_editor.cc:432
+msgid "Subtitle Offset"
+msgstr "Undertext Förskjutning"
+
+#: src/wx/film_editor.cc:441
+msgid "Subtitle Scale"
+msgstr "Undertext Skalning"
+
+#: src/wx/film_editor.cc:79
+msgid "Subtitles"
+msgstr "Undertexter"
+
+#: src/wx/config_dialog.cc:68
+msgid "TMS IP address"
+msgstr "TMS IP-adress"
+
+#: src/wx/config_dialog.cc:83
+msgid "TMS password"
+msgstr "TMS lösenord"
+
+#: src/wx/config_dialog.cc:73
+msgid "TMS target path"
+msgstr "TMS målsökväg"
+
+#: src/wx/config_dialog.cc:78
+msgid "TMS user name"
+msgstr "TMS användarnamn"
+
+#: src/wx/dci_metadata_dialog.cc:41
+msgid "Territory (e.g. UK)"
+msgstr "Område (ex. SV)"
+
+#: src/wx/config_dialog.cc:136
+msgid "Threads"
+msgstr "Trådar"
+
+#: src/wx/server_dialog.cc:40
+msgid "Threads to use"
+msgstr "Antal trådar att använda"
+
+#: src/wx/config_dialog.cc:88
+msgid "Threads to use for encoding on this host"
+msgstr "Antal trådar att använda vid kodning på denna maskin"
+
+#: src/wx/audio_plot.cc:139
+msgid "Time"
+msgstr "Tid"
+
+#: src/wx/film_editor.cc:283
+msgid "Top crop"
+msgstr "Övre beskärning"
+
+#: src/wx/film_editor.cc:171
+msgid "Trim frames"
+msgstr "Skippa bilder"
+
+#: src/wx/film_editor.cc:125
+msgid "Trust content's header"
+msgstr "Lita på källans information"
+
+#: src/wx/audio_dialog.cc:55
+msgid "Type"
+msgstr "Typ"
+
+#: src/wx/film_editor.cc:114
+msgid "Use DCI name"
+msgstr "Använd DCI-namnet"
+
+#: src/wx/film_editor.cc:145
+msgid "Use best"
+msgstr "Använd bästa"
+
+#: src/wx/film_editor.cc:391
+msgid "Use content's audio"
+msgstr "Använd innehållets audio"
+
+#: src/wx/film_editor.cc:401
+msgid "Use external audio"
+msgstr "Använd extern audio"
+
+#: src/wx/film_editor.cc:75
+msgid "Video"
+msgstr "Video"
+
+#: src/wx/film_editor.cc:424
+msgid "With Subtitles"
+msgstr "Med Undertexter"
+
+#: src/wx/film_editor.cc:1271
+msgid "channels"
+msgstr "kanaler"
+
+#: src/wx/properties_dialog.cc:50
+msgid "counting..."
+msgstr "räknar..."
+
+#: src/wx/film_editor.cc:373
+msgid "dB"
+msgstr "dB"
+
+#: src/wx/film_editor.cc:696 src/wx/film_editor.cc:699
+msgid "frames"
+msgstr "bilder"
+
+#. / TRANSLATORS: this is an abbreviation for milliseconds, the unit of time
+#: src/wx/film_editor.cc:386
+msgid "ms"
+msgstr "ms"
+
+#: src/wx/film_editor.cc:436
+msgid "pixels"
+msgstr "pixlar"
+
+#. / TRANSLATORS: `s' here is an abbreviation for seconds, the unit of time
+#: src/wx/film_editor.cc:197
+msgid "s"
+msgstr "s"
+
+#: src/wx/properties_dialog.cc:62 src/wx/properties_dialog.cc:63
+msgid "unknown"
+msgstr "okänt"
diff --git a/src/wx/properties_dialog.cc b/src/wx/properties_dialog.cc
index f4acb6b1a..44a713dc3 100644
--- a/src/wx/properties_dialog.cc
+++ b/src/wx/properties_dialog.cc
@@ -54,9 +54,9 @@ PropertiesDialog::PropertiesDialog (wxWindow* parent, shared_ptr<Film> film)
_frames->SetLabel (std_to_wx (lexical_cast<string> (_film->length().get())));
FrameRateConversion frc (_film->source_frame_rate(), _film->dcp_frame_rate());
int const dcp_length = _film->length().get() * frc.factor();
- double const disk = ((double) _film->j2k_bandwidth() / 8) * dcp_length / (_film->dcp_frame_rate() * 1073741824);
+ double const disk = ((double) _film->j2k_bandwidth() / 8) * dcp_length / (_film->dcp_frame_rate() * 1073741824.0f);
stringstream s;
- s << fixed << setprecision (1) << disk << _("Gb");
+ s << fixed << setprecision (1) << disk << wx_to_std (_("Gb"));
_disk->SetLabel (std_to_wx (s.str ()));
} else {
_frames->SetLabel (_("unknown"));
diff --git a/src/wx/wscript b/src/wx/wscript
index cc303f5e8..42bb8ca88 100644
--- a/src/wx/wscript
+++ b/src/wx/wscript
@@ -44,3 +44,6 @@ def build(bld):
def pot(bld):
i18n.pot(os.path.join('src', 'wx'), sources, 'libdvdomatic-wx')
+
+def pot_merge(bld):
+ i18n.pot_merge(os.path.join('src', 'wx'), 'libdvdomatic-wx')