Merge master.
authorCarl Hetherington <cth@carlh.net>
Tue, 21 May 2013 20:07:35 +0000 (21:07 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 21 May 2013 20:07:35 +0000 (21:07 +0100)
17 files changed:
1  2 
cscript
src/lib/film.cc
src/lib/format.cc
src/lib/po/es_ES.po
src/lib/po/fr_FR.po
src/lib/po/it_IT.po
src/lib/po/sv_SE.po
src/lib/util.cc
src/lib/wscript
src/tools/po/es_ES.po
src/tools/po/fr_FR.po
src/tools/po/sv_SE.po
src/wx/po/es_ES.po
src/wx/po/fr_FR.po
src/wx/po/it_IT.po
src/wx/po/sv_SE.po
wscript

diff --combined cscript
index b54b7da31ff5124bea48a1e832ff95e1689a6a1b,4c54b03774fa8f8a9930aa45bef3269395b887ba..17f267628c3e1550698d6b174400028e77dda8d4
+++ b/cscript
@@@ -7,9 -7,8 +7,9 @@@ def dependencies(target)
          return ()
      else:
          return (('openjpeg-cdist', None),
 +                ('libcxml', None),
                  ('ffmpeg-cdist', '488d5d4496af5e3a3b9d31d6b221e8eeada6b77e'),
 -                ('libdcp', 'v0.49'))
 +                ('libdcp', None))
  
  def build(env, target):
      cmd = './waf configure --prefix=%s' % env.work_dir_cscript()
@@@ -29,7 -28,7 +29,7 @@@ def package(env, target, version)
      if target.platform == 'windows':
          shutil.copyfile('build/windows/installer.%s.nsi' % target.bits, 'build/windows/installer2.%s.nsi' % target.bits)
          env.command('sed -i "s~%%resources%%~%s/windows~g" build/windows/installer2.%s.nsi' % (os.getcwd(), target.bits))
-         env.command('sed -i "s~%%deps%%~%s~g" build/windows/installer2.%s.nsi' % (env.windows_prefix(), target.bits))
+         env.command('sed -i "s~%%deps%%~%s~g" build/windows/installer2.%s.nsi' % (env.windows_prefix, target.bits))
          env.command('sed -i "s~%%binaries%%~%s/build~g" build/windows/installer2.%s.nsi' % (os.getcwd(), target.bits))
          env.command('sed -i "s~%%bits%%~32~g" build/windows/installer2.%s.nsi' % target.bits)
          env.command('makensis build/windows/installer2.%s.nsi' % target.bits)
          shutil.copyfile('builds/control-%s-%d' % (target.version, target.bits), 'debian/control')
          env.command('./waf dist')
          f = open('debian/files', 'w')
 -        print >>f,'dvdomatic_%s-1_%s.deb video extra' % (version, cpu)
 +        print >>f,'dcpomatic_%s-1_%s.deb video extra' % (version, cpu)
          shutil.rmtree('build/deb', ignore_errors=True)
  
          os.makedirs('build/deb')
          os.chdir('build/deb')
 -        shutil.move('../../dvdomatic-%s.tar.bz2' % version, 'dvdomatic_%s.orig.tar.bz2' % version)
 -        env.command('tar xjf dvdomatic_%s.orig.tar.bz2' % version)
 -        os.chdir('dvdomatic-%s' % version)
 +        shutil.move('../../dcpomatic-%s.tar.bz2' % version, 'dcpomatic_%s.orig.tar.bz2' % version)
 +        env.command('tar xjf dcpomatic_%s.orig.tar.bz2' % version)
 +        os.chdir('dcpomatic-%s' % version)
          env.command('dch -b -v %s-1 "New upstream release."' % version)
          env.set('CDIST_LINKFLAGS', env.get('LINKFLAGS'))
          env.set('CDIST_CXXFLAGS', env.get('CXXFLAGS'))
@@@ -65,9 -64,9 +65,9 @@@
  
  def make_pot(env):
      env.command('./waf pot')
 -    return [os.path.abspath('build/src/lib/libdvdomatic.pot'),
 -            os.path.abspath('build/src/wx/libdvdomatic-wx.pot'),
 -          os.path.abspath('build/src/tools/dvdomatic.pot')]
 +    return [os.path.abspath('build/src/lib/libdcpomatic.pot'),
 +            os.path.abspath('build/src/wx/libdcpomatic-wx.pot'),
 +          os.path.abspath('build/src/tools/dcpomatic.pot')]
  
  def make_manual(env):
      os.chdir('doc/manual')
diff --combined src/lib/film.cc
index 37af4cb20c4de0e28e115bf7d05192c93d1938c3,81c7de77f72bb0b3a04f1e7d906011c8777bcca8..487499e32acd8698ed2ca6f6b87ab0e24e7e558c
@@@ -1,5 -1,3 +1,5 @@@
 +/* -*- c-basic-offset: 8; default-tab-width: 8; -*- */
 +
  /*
      Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
  
  #include <boost/algorithm/string.hpp>
  #include <boost/lexical_cast.hpp>
  #include <boost/date_time.hpp>
 +#include <libxml++/libxml++.h>
 +#include <libcxml/cxml.h>
  #include "film.h"
  #include "format.h"
  #include "job.h"
  #include "filter.h"
 -#include "transcoder.h"
  #include "util.h"
  #include "job_manager.h"
  #include "ab_transcode_job.h"
  #include "transcode_job.h"
  #include "scp_dcp_job.h"
  #include "log.h"
 -#include "options.h"
  #include "exceptions.h"
  #include "examine_content_job.h"
  #include "scaler.h"
 -#include "decoder_factory.h"
  #include "config.h"
  #include "version.h"
  #include "ui_signaller.h"
 -#include "video_decoder.h"
 -#include "audio_decoder.h"
 -#include "sndfile_decoder.h"
  #include "analyse_audio_job.h"
 +#include "playlist.h"
 +#include "player.h"
 +#include "ffmpeg_content.h"
 +#include "imagemagick_content.h"
 +#include "sndfile_content.h"
 +#include "dcp_content_type.h"
  
  #include "i18n.h"
  
@@@ -71,8 -67,6 +71,8 @@@ using std::setfill
  using std::min;
  using std::make_pair;
  using std::endl;
 +using std::cout;
 +using std::list;
  using boost::shared_ptr;
  using boost::lexical_cast;
  using boost::to_upper_copy;
@@@ -92,31 -86,30 +92,31 @@@ int const Film::state_version = 4
   */
  
  Film::Film (string d, bool must_exist)
 -      : _use_dci_name (true)
 -      , _trust_content_header (true)
 +      : _playlist (new Playlist)
 +      , _use_dci_name (true)
 +      , _trust_content_headers (true)
        , _dcp_content_type (Config::instance()->default_dcp_content_type ())
        , _format (Config::instance()->default_format ())
        , _scaler (Scaler::from_id ("bicubic"))
        , _trim_start (0)
        , _trim_end (0)
        , _trim_type (CPL)
 -      , _dcp_ab (false)
 -      , _use_content_audio (true)
 +      , _ab (false)
        , _audio_gain (0)
        , _audio_delay (0)
 -      , _still_duration (10)
        , _with_subtitles (false)
        , _subtitle_offset (0)
        , _subtitle_scale (1)
        , _colour_lut (0)
        , _j2k_bandwidth (200000000)
        , _dci_metadata (Config::instance()->default_dci_metadata ())
 -      , _dcp_frame_rate (0)
 -      , _source_frame_rate (0)
 +      , _dcp_video_frame_rate (0)
        , _dirty (false)
  {
        set_dci_date_today ();
 +
 +      _playlist->Changed.connect (bind (&Film::playlist_changed, this));
 +      _playlist->ContentChanged.connect (bind (&Film::playlist_content_changed, this, _1, _2));
        
        /* Make state.directory a complete path without ..s (where possible)
           (Code swiped from Adam Bowen on stackoverflow)
                }
        }
  
 -      _sndfile_stream = SndfileStream::create ();
 -      
        if (must_exist) {
                read_metadata ();
        } else {
@@@ -159,11 -154,11 +159,11 @@@ Film::Film (Film const & o
        : boost::enable_shared_from_this<Film> (o)
        /* note: the copied film shares the original's log */
        , _log               (o._log)
 +      , _playlist          (new Playlist (o._playlist))
        , _directory         (o._directory)
        , _name              (o._name)
        , _use_dci_name      (o._use_dci_name)
 -      , _content           (o._content)
 -      , _trust_content_header (o._trust_content_header)
 +      , _trust_content_headers (o._trust_content_headers)
        , _dcp_content_type  (o._dcp_content_type)
        , _format            (o._format)
        , _crop              (o._crop)
        , _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)
 -      , _use_content_audio (o._use_content_audio)
 +      , _ab                (o._ab)
        , _audio_gain        (o._audio_gain)
        , _audio_delay       (o._audio_delay)
 -      , _still_duration    (o._still_duration)
 -      , _subtitle_stream   (o._subtitle_stream)
        , _with_subtitles    (o._with_subtitles)
        , _subtitle_offset   (o._subtitle_offset)
        , _subtitle_scale    (o._subtitle_scale)
        , _colour_lut        (o._colour_lut)
        , _j2k_bandwidth     (o._j2k_bandwidth)
        , _dci_metadata      (o._dci_metadata)
 +      , _dcp_video_frame_rate (o._dcp_video_frame_rate)
        , _dci_date          (o._dci_date)
 -      , _dcp_frame_rate    (o._dcp_frame_rate)
 -      , _size              (o._size)
 -      , _length            (o._length)
 -      , _content_digest    (o._content_digest)
 -      , _content_audio_streams (o._content_audio_streams)
 -      , _sndfile_stream    (o._sndfile_stream)
 -      , _subtitle_streams  (o._subtitle_streams)
 -      , _source_frame_rate (o._source_frame_rate)
        , _dirty             (o._dirty)
  {
 -      
 -}
 -
 -Film::~Film ()
 -{
 -
 +      _playlist->ContentChanged.connect (bind (&Film::playlist_content_changed, this, _1, _2));
  }
  
  string
@@@ -198,15 -210,15 +198,15 @@@ Film::video_state_identifier () cons
  
        stringstream s;
        s << format()->id()
 -        << "_" << content_digest()
 +        << "_" << _playlist->video_digest()
          << "_" << crop().left << "_" << crop().right << "_" << crop().top << "_" << crop().bottom
 -        << "_" << _dcp_frame_rate
 +        << "_" << _dcp_video_frame_rate
          << "_" << f.first << "_" << f.second
          << "_" << scaler()->id()
          << "_" << j2k_bandwidth()
          << "_" << boost::lexical_cast<int> (colour_lut());
  
 -      if (dcp_ab()) {
 +      if (ab()) {
                pair<string, string> fa = Filter::ffmpeg_strings (Config::instance()->reference_filters());
                s << "ab_" << Config::instance()->reference_scaler()->id() << "_" << fa.first << "_" << fa.second;
        }
@@@ -270,7 -282,7 +270,7 @@@ Film::audio_analysis_path () cons
  {
        boost::filesystem::path p;
        p /= "analysis";
 -      p /= content_digest();
 +      p /= _playlist->audio_digest();
        return file (p.string ());
  }
  
@@@ -284,7 -296,7 +284,7 @@@ Film::make_dcp (
                throw BadSettingError (_("name"), _("cannot contain slashes"));
        }
        
 -      log()->log (String::compose ("DVD-o-matic %1 git %2 using %3", dvdomatic_version, dvdomatic_git_commit, dependency_version_summary()));
 +      log()->log (String::compose ("DCP-o-matic %1 git %2 using %3", dcpomatic_version, dcpomatic_git_commit, dependency_version_summary()));
  
        {
                char buffer[128];
                log()->log (String::compose ("Starting to make DCP on %1", buffer));
        }
        
 -      log()->log (String::compose ("Content is %1; type %2", content_path(), (content_type() == STILL ? _("still") : _("video"))));
 -      if (length()) {
 -              log()->log (String::compose ("Content length %1", length().get()));
 -      }
 -      log()->log (String::compose ("Content digest %1", content_digest()));
 -      log()->log (String::compose ("Content at %1 fps, DCP at %2 fps", source_frame_rate(), dcp_frame_rate()));
 +//    log()->log (String::compose ("Content is %1; type %2", content_path(), (content_type() == STILL ? _("still") : _("video"))));
 +//    if (length()) {
 +//            log()->log (String::compose ("Content length %1", length().get()));
 +//    }
 +//    log()->log (String::compose ("Content digest %1", content_digest()));
 +//    log()->log (String::compose ("Content at %1 fps, DCP at %2 fps", source_frame_rate(), dcp_frame_rate()));
        log()->log (String::compose ("%1 threads", Config::instance()->num_local_encoding_threads()));
        log()->log (String::compose ("J2K bandwidth %1", j2k_bandwidth()));
 -#ifdef DVDOMATIC_DEBUG
 -      log()->log ("DVD-o-matic built in debug mode.");
 +#ifdef DCPOMATIC_DEBUG
 +      log()->log ("DCP-o-matic built in debug mode.");
  #else
 -      log()->log ("DVD-o-matic built in optimised mode.");
 +      log()->log ("DCP-o-matic built in optimised mode.");
  #endif
  #ifdef LIBDCP_DEBUG
        log()->log ("libdcp built in debug mode.");
                throw MissingSettingError (_("format"));
        }
  
 -      if (content().empty ()) {
 -              throw MissingSettingError (_("content"));
 +      if (_playlist->content().empty ()) {
 +              throw StringError (_("You must add some content to the DCP before creating it"));
        }
  
        if (dcp_content_type() == 0) {
                throw MissingSettingError (_("name"));
        }
  
 -      DecodeOptions od;
 -      od.decode_subtitles = with_subtitles ();
 -
        shared_ptr<Job> r;
  
 -      if (dcp_ab()) {
 -              r = JobManager::instance()->add (shared_ptr<Job> (new ABTranscodeJob (shared_from_this(), od)));
 +      if (ab()) {
 +              r = JobManager::instance()->add (shared_ptr<Job> (new ABTranscodeJob (shared_from_this())));
        } else {
 -              r = JobManager::instance()->add (shared_ptr<Job> (new TranscodeJob (shared_from_this(), od)));
 +              r = JobManager::instance()->add (shared_ptr<Job> (new TranscodeJob (shared_from_this())));
        }
  }
  
 -/** Start a job to analyse the audio of our content file */
 +/** Start a job to analyse the audio in our Playlist */
  void
  Film::analyse_audio ()
  {
        JobManager::instance()->add (_analyse_audio_job);
  }
  
 -/** Start a job to examine our content file */
 +/** Start a job to examine a piece of content */
  void
 -Film::examine_content ()
 +Film::examine_content (shared_ptr<Content> c)
  {
 -      if (_examine_content_job) {
 -              return;
 -      }
 -
 -      _examine_content_job.reset (new ExamineContentJob (shared_from_this()));
 -      _examine_content_job->Finished.connect (bind (&Film::examine_content_finished, this));
 -      JobManager::instance()->add (_examine_content_job);
 +      shared_ptr<Job> j (new ExamineContentJob (shared_from_this(), c, trust_content_headers ()));
 +      JobManager::instance()->add (j);
  }
  
  void
@@@ -371,6 -391,12 +371,6 @@@ Film::analyse_audio_finished (
        _analyse_audio_job.reset ();
  }
  
 -void
 -Film::examine_content_finished ()
 -{
 -      _examine_content_job.reset ();
 -}
 -
  /** Start a job to send our DCP to the configured TMS */
  void
  Film::send_dcp_to_tms ()
@@@ -407,56 -433,81 +407,56 @@@ Film::write_metadata () cons
  
        boost::filesystem::create_directories (directory());
  
 -      string const m = file ("metadata");
 -      ofstream f (m.c_str ());
 -      if (!f.good ()) {
 -              throw CreateFileError (m);
 -      }
 +      xmlpp::Document doc;
 +      xmlpp::Element* root = doc.create_root_node ("Metadata");
  
 -      f << "version " << state_version << endl;
 +      root->add_child("Version")->add_child_text (boost::lexical_cast<string> (state_version));
 +      root->add_child("Name")->add_child_text (_name);
 +      root->add_child("UseDCIName")->add_child_text (_use_dci_name ? "1" : "0");
 +      root->add_child("TrustContentHeaders")->add_child_text (_trust_content_headers ? "1" : "0");
  
 -      /* User stuff */
 -      f << "name " << _name << endl;
 -      f << "use_dci_name " << _use_dci_name << endl;
 -      f << "content " << _content << endl;
 -      f << "trust_content_header " << (_trust_content_header ? "1" : "0") << endl;
        if (_dcp_content_type) {
 -              f << "dcp_content_type " << _dcp_content_type->dci_name () << endl;
 +              root->add_child("DCPContentType")->add_child_text (_dcp_content_type->dci_name ());
        }
 +
        if (_format) {
 -              f << "format " << _format->as_metadata () << endl;
 +              root->add_child("Format")->add_child_text (_format->id ());
        }
 -      f << "left_crop " << _crop.left << endl;
 -      f << "right_crop " << _crop.right << endl;
 -      f << "top_crop " << _crop.top << endl;
 -      f << "bottom_crop " << _crop.bottom << endl;
 -      for (vector<Filter const *>::const_iterator i = _filters.begin(); i != _filters.end(); ++i) {
 -              f << "filter " << (*i)->id () << endl;
 -      }
 -      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";
 +              root->add_child("TrimType")->add_child_text ("CPL");
                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;
 +              root->add_child("TrimType")->add_child_text ("Encode");
        }
 -      for (vector<string>::const_iterator i = _external_audio.begin(); i != _external_audio.end(); ++i) {
 -              f << "external_audio " << *i << endl;
 -      }
 -      f << "use_content_audio " << (_use_content_audio ? "1" : "0") << endl;
 -      f << "audio_gain " << _audio_gain << endl;
 -      f << "audio_delay " << _audio_delay << endl;
 -      f << "still_duration " << _still_duration << endl;
 -      if (_subtitle_stream) {
 -              f << "selected_subtitle_stream " << _subtitle_stream->to_string() << endl;
 -      }
 -      f << "with_subtitles " << _with_subtitles << endl;
 -      f << "subtitle_offset " << _subtitle_offset << endl;
 -      f << "subtitle_scale " << _subtitle_scale << endl;
 -      f << "colour_lut " << _colour_lut << endl;
 -      f << "j2k_bandwidth " << _j2k_bandwidth << endl;
 -      _dci_metadata.write (f);
 -      f << "dci_date " << boost::gregorian::to_iso_string (_dci_date) << endl;
 -      f << "dcp_frame_rate " << _dcp_frame_rate << endl;
 -      f << "width " << _size.width << endl;
 -      f << "height " << _size.height << endl;
 -      f << "length " << _length.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 " << _sndfile_stream->to_string() << endl;
 +                      
 +      root->add_child("LeftCrop")->add_child_text (boost::lexical_cast<string> (_crop.left));
 +      root->add_child("RightCrop")->add_child_text (boost::lexical_cast<string> (_crop.right));
 +      root->add_child("TopCrop")->add_child_text (boost::lexical_cast<string> (_crop.top));
 +      root->add_child("BottomCrop")->add_child_text (boost::lexical_cast<string> (_crop.bottom));
  
 -      for (vector<shared_ptr<SubtitleStream> >::const_iterator i = _subtitle_streams.begin(); i != _subtitle_streams.end(); ++i) {
 -              f << "subtitle_stream " << (*i)->to_string () << endl;
 +      for (vector<Filter const *>::const_iterator i = _filters.begin(); i != _filters.end(); ++i) {
 +              root->add_child("Filter")->add_child_text ((*i)->id ());
        }
 -
 -      f << "source_frame_rate " << _source_frame_rate << endl;
 +      
 +      root->add_child("Scaler")->add_child_text (_scaler->id ());
 +      root->add_child("TrimStart")->add_child_text (boost::lexical_cast<string> (_trim_start));
 +      root->add_child("TrimEnd")->add_child_text (boost::lexical_cast<string> (_trim_end));
 +      root->add_child("AB")->add_child_text (_ab ? "1" : "0");
 +      root->add_child("AudioGain")->add_child_text (boost::lexical_cast<string> (_audio_gain));
 +      root->add_child("AudioDelay")->add_child_text (boost::lexical_cast<string> (_audio_delay));
 +      root->add_child("WithSubtitles")->add_child_text (_with_subtitles ? "1" : "0");
 +      root->add_child("SubtitleOffset")->add_child_text (boost::lexical_cast<string> (_subtitle_offset));
 +      root->add_child("SubtitleScale")->add_child_text (boost::lexical_cast<string> (_subtitle_scale));
 +      root->add_child("ColourLUT")->add_child_text (boost::lexical_cast<string> (_colour_lut));
 +      root->add_child("J2KBandwidth")->add_child_text (boost::lexical_cast<string> (_j2k_bandwidth));
 +      _dci_metadata.as_xml (root->add_child ("DCIMetadata"));
 +      root->add_child("DCPVideoFrameRate")->add_child_text (boost::lexical_cast<string> (_dcp_video_frame_rate));
 +      root->add_child("DCIDate")->add_child_text (boost::gregorian::to_iso_string (_dci_date));
 +      _playlist->as_xml (root->add_child ("Playlist"));
 +
 +      doc.write_to_file_formatted (file ("metadata.xml"));
        
        _dirty = false;
  }
@@@ -468,68 -519,165 +468,68 @@@ Film::read_metadata (
        boost::mutex::scoped_lock lm (_state_mutex);
        LocaleGuard lg;
  
 -      _external_audio.clear ();
 -      _content_audio_streams.clear ();
 -      _subtitle_streams.clear ();
 -
 -      boost::optional<int> version;
 -
 -      /* Backward compatibility things */
 -      boost::optional<int> audio_sample_rate;
 -      boost::optional<int> audio_stream_index;
 -      boost::optional<int> subtitle_stream_index;
 -
 -      ifstream f (file ("metadata").c_str());
 -      if (!f.good()) {
 -              throw OpenFileError (file ("metadata"));
 +      if (boost::filesystem::exists (file ("metadata")) && !boost::filesystem::exists (file ("metadata.xml"))) {
 +              throw StringError (_("This film was created with an older version of DCP-o-matic, and unfortunately it cannot be loaded into this version.  You will need to create a new Film, re-add your content and set it up again.  Sorry!"));
        }
 -      
 -      multimap<string, string> kv = read_key_value (f);
  
 -      /* We need version before anything else */
 -      multimap<string, string>::iterator v = kv.find ("version");
 -      if (v != kv.end ()) {
 -              version = atoi (v->second.c_str());
 -      }
 +      cxml::File f (file ("metadata.xml"), "Metadata");
        
 -      for (multimap<string, string>::const_iterator i = kv.begin(); i != kv.end(); ++i) {
 -              string const k = i->first;
 -              string const v = i->second;
 +      _name = f.string_child ("Name");
 +      _use_dci_name = f.bool_child ("UseDCIName");
 +      _trust_content_headers = f.bool_child ("TrustContentHeaders");
  
 -              if (k == "audio_sample_rate") {
 -                      audio_sample_rate = atoi (v.c_str());
 -              }
 -
 -              /* User-specified stuff */
 -              if (k == "name") {
 -                      _name = v;
 -              } else if (k == "use_dci_name") {
 -                      _use_dci_name = (v == "1");
 -              } else if (k == "content") {
 -                      _content = v;
 -              } else if (k == "trust_content_header") {
 -                      _trust_content_header = (v == "1");
 -              } else if (k == "dcp_content_type") {
 -                      if (version < 3) {
 -                              _dcp_content_type = DCPContentType::from_pretty_name (v);
 -                      } else {
 -                              _dcp_content_type = DCPContentType::from_dci_name (v);
 -                      }
 -              } else if (k == "format") {
 -                      _format = Format::from_metadata (v);
 -              } else if (k == "left_crop") {
 -                      _crop.left = atoi (v.c_str ());
 -              } else if (k == "right_crop") {
 -                      _crop.right = atoi (v.c_str ());
 -              } else if (k == "top_crop") {
 -                      _crop.top = atoi (v.c_str ());
 -              } else if (k == "bottom_crop") {
 -                      _crop.bottom = atoi (v.c_str ());
 -              } else if (k == "filter") {
 -                      _filters.push_back (Filter::from_id (v));
 -              } else if (k == "scaler") {
 -                      _scaler = Scaler::from_id (v);
 -              } else if ( ((!version || version < 2) && k == "dcp_trim_start") || k == "trim_start") {
 -                      _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")) {
 -                      if (!version) {
 -                              audio_stream_index = atoi (v.c_str ());
 -                      } else {
 -                              _content_audio_stream = audio_stream_factory (v, version);
 -                      }
 -              } else if (k == "external_audio") {
 -                      _external_audio.push_back (v);
 -              } else if (k == "use_content_audio") {
 -                      _use_content_audio = (v == "1");
 -              } else if (k == "audio_gain") {
 -                      _audio_gain = atof (v.c_str ());
 -              } else if (k == "audio_delay") {
 -                      _audio_delay = atoi (v.c_str ());
 -              } else if (k == "still_duration") {
 -                      _still_duration = atoi (v.c_str ());
 -              } else if (k == "selected_subtitle_stream") {
 -                      if (!version) {
 -                              subtitle_stream_index = atoi (v.c_str ());
 -                      } else {
 -                              _subtitle_stream = subtitle_stream_factory (v, version);
 -                      }
 -              } else if (k == "with_subtitles") {
 -                      _with_subtitles = (v == "1");
 -              } else if (k == "subtitle_offset") {
 -                      _subtitle_offset = atoi (v.c_str ());
 -              } else if (k == "subtitle_scale") {
 -                      _subtitle_scale = atof (v.c_str ());
 -              } else if (k == "colour_lut") {
 -                      _colour_lut = atoi (v.c_str ());
 -              } else if (k == "j2k_bandwidth") {
 -                      _j2k_bandwidth = atoi (v.c_str ());
 -              } else if (k == "dci_date") {
 -                      _dci_date = boost::gregorian::from_undelimited_string (v);
 -              } else if (k == "dcp_frame_rate") {
 -                      _dcp_frame_rate = atoi (v.c_str ());
 +      {
 +              optional<string> c = f.optional_string_child ("DCPContentType");
 +              if (c) {
 +                      _dcp_content_type = DCPContentType::from_dci_name (c.get ());
                }
 +      }
  
 -              _dci_metadata.read (k, v);
 -              
 -              /* Cached stuff */
 -              if (k == "width") {
 -                      _size.width = atoi (v.c_str ());
 -              } else if (k == "height") {
 -                      _size.height = atoi (v.c_str ());
 -              } else if (k == "length") {
 -                      int const vv = atoi (v.c_str ());
 -                      if (vv) {
 -                              _length = 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") {
 -                      _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") {
 -                      _source_frame_rate = atof (v.c_str ());
 -              } else if (version < 4 && k == "frames_per_second") {
 -                      _source_frame_rate = atof (v.c_str ());
 -                      /* Fill in what would have been used for DCP frame rate by the older version */
 -                      _dcp_frame_rate = best_dcp_frame_rate (_source_frame_rate);
 +      {
 +              optional<string> c = f.optional_string_child ("Format");
 +              if (c) {
 +                      _format = Format::from_id (c.get ());
                }
        }
  
 -      if (!version) {
 -              if (audio_sample_rate) {
 -                      /* version < 1 didn't specify sample rate in the audio streams, so fill it in here */
 -                      for (vector<shared_ptr<AudioStream> >::iterator i = _content_audio_streams.begin(); i != _content_audio_streams.end(); ++i) {
 -                              (*i)->set_sample_rate (audio_sample_rate.get());
 -                      }
 +      {
 +              optional<string> c = f.optional_string_child ("TrimType");
 +              if (!c || c.get() == "CPL") {
 +                      _trim_type = CPL;
 +              } else if (c && c.get() == "Encode") {
 +                      _trim_type = ENCODE;
                }
 +      }
  
 -              /* also the selected stream was specified as an index */
 -              if (audio_stream_index && audio_stream_index.get() >= 0 && audio_stream_index.get() < (int) _content_audio_streams.size()) {
 -                      _content_audio_stream = _content_audio_streams[audio_stream_index.get()];
 -              }
 +      _crop.left = f.number_child<int> ("LeftCrop");
 +      _crop.right = f.number_child<int> ("RightCrop");
 +      _crop.top = f.number_child<int> ("TopCrop");
 +      _crop.bottom = f.number_child<int> ("BottomCrop");
  
 -              /* similarly the subtitle */
 -              if (subtitle_stream_index && subtitle_stream_index.get() >= 0 && subtitle_stream_index.get() < (int) _subtitle_streams.size()) {
 -                      _subtitle_stream = _subtitle_streams[subtitle_stream_index.get()];
 +      {
 +              list<shared_ptr<cxml::Node> > c = f.node_children ("Filter");
 +              for (list<shared_ptr<cxml::Node> >::iterator i = c.begin(); i != c.end(); ++i) {
 +                      _filters.push_back (Filter::from_id ((*i)->content ()));
                }
        }
 -              
 +
 +      _scaler = Scaler::from_id (f.string_child ("Scaler"));
 +      _trim_start = f.number_child<int> ("TrimStart");
 +      _trim_end = f.number_child<int> ("TrimEnd");
 +      _ab = f.bool_child ("AB");
 +      _audio_gain = f.number_child<float> ("AudioGain");
 +      _audio_delay = f.number_child<int> ("AudioDelay");
 +      _with_subtitles = f.bool_child ("WithSubtitles");
 +      _subtitle_offset = f.number_child<float> ("SubtitleOffset");
 +      _subtitle_scale = f.number_child<float> ("SubtitleScale");
 +      _colour_lut = f.number_child<int> ("ColourLUT");
 +      _j2k_bandwidth = f.number_child<int> ("J2KBandwidth");
 +      _dci_metadata = DCIMetadata (f.node_child ("DCIMetadata"));
 +      _dcp_video_frame_rate = f.number_child<int> ("DCPVideoFrameRate");
 +      _dci_date = boost::gregorian::from_undelimited_string (f.string_child ("DCIDate"));
 +
 +      _playlist->set_from_xml (f.node_child ("Playlist"));
 +
        _dirty = false;
  }
  
@@@ -577,6 -725,67 +577,6 @@@ Film::file (string f) cons
        return p.string ();
  }
  
 -/** @return full path of the content (actual video) file
 - *  of the Film.
 - */
 -string
 -Film::content_path () const
 -{
 -      boost::mutex::scoped_lock lm (_state_mutex);
 -      if (boost::filesystem::path(_content).has_root_directory ()) {
 -              return _content;
 -      }
 -
 -      return file (_content);
 -}
 -
 -ContentType
 -Film::content_type () const
 -{
 -      if (boost::filesystem::is_directory (_content)) {
 -              /* Directory of images, we assume */
 -              return VIDEO;
 -      }
 -
 -      if (still_image_file (_content)) {
 -              return STILL;
 -      }
 -
 -      return VIDEO;
 -}
 -
 -/** @return The sampling rate that we will resample the audio to */
 -int
 -Film::target_audio_sample_rate () const
 -{
 -      if (!audio_stream()) {
 -              return 0;
 -      }
 -      
 -      /* Resample to a DCI-approved sample rate */
 -      double t = dcp_audio_sample_rate (audio_stream()->sample_rate());
 -
 -      FrameRateConversion frc (source_frame_rate(), dcp_frame_rate());
 -
 -      /* Compensate if the DCP is being run at a different frame rate
 -         to the source; that is, if the video is run such that it will
 -         look different in the DCP compared to the source (slower or faster).
 -         skip/repeat doesn't come into effect here.
 -      */
 -
 -      if (frc.change_speed) {
 -              t *= source_frame_rate() * frc.factor() / dcp_frame_rate();
 -      }
 -
 -      return rint (t);
 -}
 -
 -int
 -Film::still_duration_in_frames () const
 -{
 -      return still_duration() * source_frame_rate();
 -}
 -
  /** @return a DCI-compliant name for a DCP of this film */
  string
  Film::dci_name (bool if_created_now) const
                }
        }
  
 -      switch (audio_channels()) {
 -      case 1:
 -              d << "_10";
 -              break;
 -      case 2:
 -              d << "_20";
 -              break;
 -      case 6:
 -              d << "_51";
 -              break;
 -      case 8:
 -              d << "_71";
 -              break;
 -      }
 -
 -      d << "_2K";
 +      d << "_51_2K";
  
        if (!dm.studio.empty ()) {
                d << "_" << dm.studio;
@@@ -687,22 -911,103 +687,21 @@@ Film::set_use_dci_name (bool u
  }
  
  void
 -Film::set_content (string c)
 -{
 -      string check = directory ();
 -
 -      boost::filesystem::path slash ("/");
 -      string platform_slash = slash.make_preferred().string ();
 -
 -      if (!ends_with (check, platform_slash)) {
 -              check += platform_slash;
 -      }
 -      
 -      if (boost::filesystem::path(c).has_root_directory () && starts_with (c, check)) {
 -              c = c.substr (_directory.length() + 1);
 -      }
 -
 -      string old_content;
 -      
 -      {
 -              boost::mutex::scoped_lock lm (_state_mutex);
 -              if (c == _content) {
 -                      return;
 -              }
 -
 -              old_content = _content;
 -              _content = c;
 -      }
 -
 -      /* Reset streams here in case the new content doesn't have one or the other */
 -      _content_audio_stream = shared_ptr<AudioStream> ();
 -      _subtitle_stream = shared_ptr<SubtitleStream> ();
 -
 -      /* Start off using content audio */
 -      set_use_content_audio (true);
 -
 -      /* Create a temporary decoder so that we can get information
 -         about the content.
 -      */
 -
 -      try {
 -              Decoders d = decoder_factory (shared_from_this(), DecodeOptions());
 -              
 -              set_size (d.video->native_size ());
 -              set_source_frame_rate (d.video->frames_per_second ());
 -              set_dcp_frame_rate (best_dcp_frame_rate (source_frame_rate ()));
 -              set_subtitle_streams (d.video->subtitle_streams ());
 -              if (d.audio) {
 -                      set_content_audio_streams (d.audio->audio_streams ());
 -              }
 -
 -              {
 -                      boost::mutex::scoped_lock lm (_state_mutex);
 -                      _content = c;
 -              }
 -              
 -              signal_changed (CONTENT);
 -              
 -              /* Start off with the first audio and subtitle streams */
 -              if (d.audio && !d.audio->audio_streams().empty()) {
 -                      set_content_audio_stream (d.audio->audio_streams().front());
 -              }
 -              
 -              if (!d.video->subtitle_streams().empty()) {
 -                      set_subtitle_stream (d.video->subtitle_streams().front());
 -              }
 -              
 -              examine_content ();
 -
 -      } catch (...) {
 -
 -              boost::mutex::scoped_lock lm (_state_mutex);
 -              _content = old_content;
 -              throw;
 -
 -      }
 -
 -      /* Default format */
 -      set_format (Config::instance()->default_format ());
 -
 -      /* Still image DCPs must use external audio */
 -      if (content_type() == STILL) {
 -              set_use_content_audio (false);
 -      }
 -}
 -
 -void
 -Film::set_trust_content_header (bool t)
 +Film::set_trust_content_headers (bool t)
  {
        {
                boost::mutex::scoped_lock lm (_state_mutex);
 -              _trust_content_header = t;
 +              _trust_content_headers = t;
        }
        
 -      signal_changed (TRUST_CONTENT_HEADER);
 -
 -      if (!_trust_content_header && !content().empty()) {
 +      signal_changed (TRUST_CONTENT_HEADERS);
 +      
 +      Playlist::ContentList content = _playlist->content ();
 +      if (!_trust_content_headers && !content.empty()) {
                /* We just said that we don't trust the content's header */
 -              examine_content ();
 +              for (Playlist::ContentList::iterator i = content.begin(); i != content.end(); ++i) {
 +                      examine_content (*i);
 +              }
        }
  }
               
@@@ -844,13 -1149,50 +843,13 @@@ Film::set_trim_type (TrimType t
  }
  
  void
 -Film::set_dcp_ab (bool a)
 +Film::set_ab (bool a)
  {
        {
                boost::mutex::scoped_lock lm (_state_mutex);
 -              _dcp_ab = a;
 +              _ab = a;
        }
 -      signal_changed (DCP_AB);
 -}
 -
 -void
 -Film::set_content_audio_stream (shared_ptr<AudioStream> s)
 -{
 -      {
 -              boost::mutex::scoped_lock lm (_state_mutex);
 -              _content_audio_stream = s;
 -      }
 -      signal_changed (CONTENT_AUDIO_STREAM);
 -}
 -
 -void
 -Film::set_external_audio (vector<string> a)
 -{
 -      {
 -              boost::mutex::scoped_lock lm (_state_mutex);
 -              _external_audio = a;
 -      }
 -
 -      shared_ptr<SndfileDecoder> decoder (new SndfileDecoder (shared_from_this(), DecodeOptions()));
 -      if (decoder->audio_stream()) {
 -              _sndfile_stream = decoder->audio_stream ();
 -      }
 -      
 -      signal_changed (EXTERNAL_AUDIO);
 -}
 -
 -void
 -Film::set_use_content_audio (bool e)
 -{
 -      {
 -              boost::mutex::scoped_lock lm (_state_mutex);
 -              _use_content_audio = e;
 -      }
 -
 -      signal_changed (USE_CONTENT_AUDIO);
 +      signal_changed (AB);
  }
  
  void
@@@ -873,6 -1215,26 +872,6 @@@ Film::set_audio_delay (int d
        signal_changed (AUDIO_DELAY);
  }
  
 -void
 -Film::set_still_duration (int d)
 -{
 -      {
 -              boost::mutex::scoped_lock lm (_state_mutex);
 -              _still_duration = d;
 -      }
 -      signal_changed (STILL_DURATION);
 -}
 -
 -void
 -Film::set_subtitle_stream (shared_ptr<SubtitleStream> s)
 -{
 -      {
 -              boost::mutex::scoped_lock lm (_state_mutex);
 -              _subtitle_stream = s;
 -      }
 -      signal_changed (SUBTITLE_STREAM);
 -}
 -
  void
  Film::set_with_subtitles (bool w)
  {
@@@ -935,15 -1297,85 +934,15 @@@ Film::set_dci_metadata (DCIMetadata m
  
  
  void
 -Film::set_dcp_frame_rate (int f)
 -{
 -      {
 -              boost::mutex::scoped_lock lm (_state_mutex);
 -              _dcp_frame_rate = f;
 -      }
 -      signal_changed (DCP_FRAME_RATE);
 -}
 -
 -void
 -Film::set_size (libdcp::Size s)
 -{
 -      {
 -              boost::mutex::scoped_lock lm (_state_mutex);
 -              _size = s;
 -      }
 -      signal_changed (SIZE);
 -}
 -
 -void
 -Film::set_length (SourceFrame l)
 -{
 -      {
 -              boost::mutex::scoped_lock lm (_state_mutex);
 -              _length = l;
 -      }
 -      signal_changed (LENGTH);
 -}
 -
 -void
 -Film::unset_length ()
 -{
 -      {
 -              boost::mutex::scoped_lock lm (_state_mutex);
 -              _length = boost::none;
 -      }
 -      signal_changed (LENGTH);
 -}
 -
 -void
 -Film::set_content_digest (string d)
 -{
 -      {
 -              boost::mutex::scoped_lock lm (_state_mutex);
 -              _content_digest = d;
 -      }
 -      _dirty = true;
 -}
 -
 -void
 -Film::set_content_audio_streams (vector<shared_ptr<AudioStream> > s)
 +Film::set_dcp_video_frame_rate (int f)
  {
        {
                boost::mutex::scoped_lock lm (_state_mutex);
 -              _content_audio_streams = s;
 +              _dcp_video_frame_rate = f;
        }
 -      signal_changed (CONTENT_AUDIO_STREAMS);
 +      signal_changed (DCP_VIDEO_FRAME_RATE);
  }
  
 -void
 -Film::set_subtitle_streams (vector<shared_ptr<SubtitleStream> > s)
 -{
 -      {
 -              boost::mutex::scoped_lock lm (_state_mutex);
 -              _subtitle_streams = s;
 -      }
 -      signal_changed (SUBTITLE_STREAMS);
 -}
 -
 -void
 -Film::set_source_frame_rate (float f)
 -{
 -      {
 -              boost::mutex::scoped_lock lm (_state_mutex);
 -              _source_frame_rate = f;
 -      }
 -      signal_changed (SOURCE_FRAME_RATE);
 -}
 -      
  void
  Film::signal_changed (Property p)
  {
                _dirty = true;
        }
  
 -      if (ui_signaller) {
 -              ui_signaller->emit (boost::bind (boost::ref (Changed), p));
 +      switch (p) {
 +      case Film::CONTENT:
 +              set_dcp_video_frame_rate (_playlist->best_dcp_frame_rate ());
 +              break;
 +      default:
 +              break;
        }
 -}
  
 -int
 -Film::audio_channels () const
 -{
 -      shared_ptr<AudioStream> s = audio_stream ();
 -      if (!s) {
 -              return 0;
 +      if (ui_signaller) {
 +              ui_signaller->emit (boost::bind (boost::ref (Changed), p));
        }
 -
 -      return s->channels ();
  }
  
  void
@@@ -971,6 -1406,16 +970,6 @@@ Film::set_dci_date_today (
        _dci_date = boost::gregorian::day_clock::local_day ();
  }
  
 -boost::shared_ptr<AudioStream>
 -Film::audio_stream () const
 -{
 -      if (use_content_audio()) {
 -              return _content_audio_stream;
 -      }
 -
 -      return _sndfile_stream;
 -}
 -
  string
  Film::info_path (int f) const
  {
@@@ -1026,114 -1471,20 +1025,114 @@@ Film::have_dcp () cons
        return true;
  }
  
 +shared_ptr<Player>
 +Film::player () const
 +{
 +      boost::mutex::scoped_lock lm (_state_mutex);
 +      return shared_ptr<Player> (new Player (shared_from_this (), _playlist));
 +}
 +
 +shared_ptr<Playlist>
 +Film::playlist () const
 +{
 +      boost::mutex::scoped_lock lm (_state_mutex);
 +      return _playlist;
 +}
 +
 +Playlist::ContentList
 +Film::content () const
 +{
 +      return _playlist->content ();
 +}
 +
 +void
 +Film::add_content (shared_ptr<Content> c)
 +{
 +      _playlist->add (c);
 +      examine_content (c);
 +}
 +
 +void
 +Film::remove_content (shared_ptr<Content> c)
 +{
 +      _playlist->remove (c);
 +}
 +
 +Time
 +Film::length () const
 +{
 +      return _playlist->length (shared_from_this ());
 +}
 +
  bool
 -Film::has_audio () const
 +Film::has_subtitles () const
  {
 -      if (use_content_audio()) {
 -              return audio_stream();
 -      }
 +      return _playlist->has_subtitles ();
 +}
  
 -      vector<string> const e = external_audio ();
 -      for (vector<string>::const_iterator i = e.begin(); i != e.end(); ++i) {
 -              if (!i->empty ()) {
 -                      return true;
 -              }
 +OutputVideoFrame
 +Film::best_dcp_video_frame_rate () const
 +{
 +      return _playlist->best_dcp_frame_rate ();
 +}
 +
 +void
 +Film::playlist_content_changed (boost::weak_ptr<Content> c, int p)
 +{
 +      if (p == VideoContentProperty::VIDEO_FRAME_RATE) {
 +              set_dcp_video_frame_rate (_playlist->best_dcp_frame_rate ());
 +      } 
 +
 +      if (ui_signaller) {
 +              ui_signaller->emit (boost::bind (boost::ref (ContentChanged), c, p));
        }
 +}
 +
 +void
 +Film::playlist_changed ()
 +{
 +      signal_changed (CONTENT);
 +}     
 +
 +int
 +Film::loop () const
 +{
 +      return _playlist->loop ();
 +}
 +
 +void
 +Film::set_loop (int c)
 +{
 +      _playlist->set_loop (c);
 +}
  
 -      return false;
 +OutputAudioFrame
 +Film::time_to_audio_frames (Time t) const
 +{
 +      return t * dcp_audio_frame_rate () / TIME_HZ;
  }
  
 +OutputVideoFrame
 +Film::time_to_video_frames (Time t) const
 +{
 +      return t * dcp_video_frame_rate () / TIME_HZ;
 +}
 +
 +Time
 +Film::audio_frames_to_time (OutputAudioFrame f) const
 +{
 +      return f * TIME_HZ / dcp_audio_frame_rate ();
 +}
 +
 +Time
 +Film::video_frames_to_time (OutputVideoFrame f) const
 +{
 +      return f * TIME_HZ / dcp_video_frame_rate ();
 +}
 +
 +OutputAudioFrame
 +Film::dcp_audio_frame_rate () const
 +{
 +      /* XXX */
 +      return 48000;
 +}
diff --combined src/lib/format.cc
index 688b22f16dc5f049602ab323ac75d76a803b1b30,78e20084784299024d5b3b665d5d9b5b436a3deb..e2efe9a6ba61f2c8bf840d12851e53c3ad039ff4
@@@ -29,7 -29,6 +29,7 @@@
  #include <iostream>
  #include "format.h"
  #include "film.h"
 +#include "playlist.h"
  
  #include "i18n.h"
  
@@@ -60,65 -59,76 +60,69 @@@ FixedFormat::name () cons
        return s.str ();
  }
  
 -/** @return Identifier for this format as metadata for a Film's metadata file */
 -string
 -Format::as_metadata () const
 -{
 -      return _id;
 -}
 -
  /** Fill our _formats vector with all available formats */
  void
  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 (1.19, libdcp::Size (1285, 1080), N_("119"), _("1.19"), N_("F")
+               new FixedFormat (1.19, libdcp::Size (1285, 1080), "119", _("1.19"), "F"
                        ));
        
        _formats.push_back (
-               new FixedFormat (4.0 / 3.0, libdcp::Size (1436, 1080), N_("133"), _("4:3"), N_("F")
+               new FixedFormat (4.0 / 3.0, libdcp::Size (1436, 1080), "133", _("4:3"), "F"
                        ));
        
        _formats.push_back (
-               new FixedFormat (1.38, libdcp::Size (1485, 1080), N_("138"), _("1.375"), N_("F")
+               new FixedFormat (1.38, libdcp::Size (1485, 1080), "138", _("1.375"), "F"
                        ));
        
        _formats.push_back (
-               new FixedFormat (4.0 / 3.0, libdcp::Size (1998, 1080), N_("133-in-flat"), _("4:3 within Flat"), N_("F")
+               new FixedFormat (4.0 / 3.0, libdcp::Size (1998, 1080), "133-in-flat", _("4:3 within Flat"), "F"
                        ));
        
        _formats.push_back (
-               new FixedFormat (1.37, libdcp::Size (1480, 1080), N_("137"), _("Academy"), N_("F")
+               new FixedFormat (1.37, libdcp::Size (1480, 1080), "137", _("Academy"), "F"
                        ));
        
        _formats.push_back (
-               new FixedFormat (1.66, libdcp::Size (1793, 1080), N_("166"), _("1.66"), N_("F")
+               new FixedFormat (1.66, libdcp::Size (1793, 1080), "166", _("1.66"), "F"
                        ));
        
        _formats.push_back (
-               new FixedFormat (1.66, libdcp::Size (1998, 1080), N_("166-in-flat"), _("1.66 within Flat"), N_("F")
+               new FixedFormat (1.66, libdcp::Size (1998, 1080), "166-in-flat", _("1.66 within Flat"), "F"
                        ));
        
        _formats.push_back (
-               new FixedFormat (1.78, libdcp::Size (1998, 1080), N_("178-in-flat"), _("16:9 within Flat"), N_("F")
+               new FixedFormat (1.78, libdcp::Size (1998, 1080), "178-in-flat", _("16:9 within Flat"), "F"
                        ));
        
        _formats.push_back (
-               new FixedFormat (1.78, libdcp::Size (1920, 1080), N_("178"), _("16:9"), N_("F")
+               new FixedFormat (1.78, libdcp::Size (1920, 1080), "178", _("16:9"), "F"
                        ));
        
        _formats.push_back (
-               new FixedFormat (1.85, libdcp::Size (1998, 1080), N_("185"), _("Flat"), N_("F")
+               new FixedFormat (1.85, libdcp::Size (1998, 1080), "185", _("Flat"), "F"
                        ));
        
        _formats.push_back (
-               new FixedFormat (1.78, libdcp::Size (2048, 858), N_("178-in-scope"), _("16:9 within Scope"), N_("S")
+               new FixedFormat (1.78, libdcp::Size (2048, 858), "178-in-scope", _("16:9 within Scope"), "S"
                        ));
        
        _formats.push_back (
-               new FixedFormat (2.39, libdcp::Size (2048, 858), N_("239"), _("Scope"), N_("S")
+               new FixedFormat (2.39, libdcp::Size (2048, 858), "239", _("Scope"), "S"
+                       ));
+       _formats.push_back (
+               new FixedFormat (1.896, libdcp::Size (2048, 1080), "full-frame", _("Full frame"), "C"
                        ));
                
        _formats.push_back (
-               new VariableFormat (libdcp::Size (1998, 1080), N_("var-185"), _("Flat without stretch"), N_("F")
+               new VariableFormat (libdcp::Size (1998, 1080), "var-185", _("Flat without stretch"), "F"
                        ));
        
        _formats.push_back (
-               new VariableFormat (libdcp::Size (2048, 858), N_("var-239"), _("Scope without stretch"), N_("S")
+               new VariableFormat (libdcp::Size (2048, 858), "var-239", _("Scope without stretch"), "S"
                        ));
  }
  
@@@ -158,6 -168,16 +162,6 @@@ Format::from_id (string i
        return *j;
  }
  
 -
 -/** @param m Metadata, as returned from as_metadata().
 - *  @return Matching Format, or 0.
 - */
 -Format const *
 -Format::from_metadata (string m)
 -{
 -      return from_id (m);
 -}
 -
  /** @return All available formats */
  vector<Format const *>
  Format::all ()
@@@ -208,8 -228,7 +212,8 @@@ VariableFormat::VariableFormat (libdcp:
  float
  VariableFormat::ratio (shared_ptr<const Film> f) const
  {
 -      libdcp::Size const c = f->cropped_size (f->size ());
 +      /* XXX */
 +      libdcp::Size const c;// = f->cropped_size (f->video_size ());
        return float (c.width) / c.height;
  }
  
diff --combined src/lib/po/es_ES.po
index 7d2f8511e002314ab866778bcdcd18ccffd2b1a9,944505007a05890a56655c94672b05cbb865b545..58ad48a9c9fd2d411910c38a8da878acf9f06759
@@@ -5,9 -5,9 +5,9 @@@
  #
  msgid ""
  msgstr ""
 -"Project-Id-Version: LIBDVDOMATIC\n"
 +"Project-Id-Version: LIBDCPOMATIC\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2013-04-22 15:06+0100\n"
+ "POT-Creation-Date: 2013-05-09 09:51+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"
@@@ -74,7 -74,7 +74,7 @@@ msgstr "Academy
  msgid "Advertisement"
  msgstr "Publicidad"
  
- #: src/lib/job.cc:72
+ #: src/lib/job.cc:73
  msgid "An error occurred whilst handling the file %1."
  msgstr "Ha ocurrido un error con el fichero %1."
  
@@@ -94,7 -94,7 +94,7 @@@ msgstr "Bicúbico
  msgid "Bilinear"
  msgstr "Bilineal"
  
- #: src/lib/job.cc:306
+ #: src/lib/job.cc:318
  msgid "Cancelled"
  msgstr ""
  
@@@ -107,7 -107,7 +107,7 @@@ msgid "Cannot resample audio as libswre
  msgstr ""
  "No se puede redimensionar el sonido porque no se encuentra libswresample"
  
- #: src/lib/util.cc:932
+ #: src/lib/util.cc:960
  msgid "Centre"
  msgstr ""
  
@@@ -139,16 -139,16 +139,16 @@@ msgstr "No se pudo escribir el fichero 
  msgid "Cubic interpolating deinterlacer"
  msgstr "Desentrelazado por interpolación cúbica"
  
- #: src/lib/util.cc:1007
+ #: src/lib/util.cc:1035
  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
+ #: src/lib/util.cc:1045
  #, 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
+ #: src/lib/util.cc:1038
  msgid "DCP will use every other frame of the source.\n"
  msgstr "El DCP usará fotogramas alternos de la fuente.\n"
  
@@@ -171,11 -171,11 +171,11 @@@ msgstr "Deringing filter
  msgid "Dolby CP750"
  msgstr "Dolby CP750"
  
- #: src/lib/util.cc:1012
+ #: src/lib/util.cc:1040
  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:304
+ #: src/lib/job.cc:316
  msgid "Error (%1)"
  msgstr "Error (%1)"
  
@@@ -247,13 -247,13 +247,13 @@@ msgstr "Horizontal deblocking filter
  msgid "Horizontal deblocking filter A"
  msgstr "Horizontal deblocking filter A"
  
- #: src/lib/job.cc:96 src/lib/job.cc:105
+ #: src/lib/job.cc:97 src/lib/job.cc:106
  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)"
 +"problem to the DCP-o-matic mailing list (dcpomatic@carlh.net)"
  msgstr ""
  "Error desconocido. La mejor idea es informar del problema a la lista de "
 -"correo de DVD-O-matic (dvdomatic@carlh.net)"
 +"correo de DCP-o-matic (dcpomatic@carlh.net)"
  
  #: src/lib/filter.cc:82
  msgid "Kernel deinterlacer"
@@@ -263,15 -263,15 +263,15 @@@ msgstr "Kernel deinterlacer
  msgid "Lanczos"
  msgstr "Lanczos"
  
- #: src/lib/util.cc:930
+ #: src/lib/util.cc:958
  msgid "Left"
  msgstr ""
  
- #: src/lib/util.cc:934
+ #: src/lib/util.cc:962
  msgid "Left surround"
  msgstr ""
  
- #: src/lib/util.cc:933
+ #: src/lib/util.cc:961
  msgid "Lfe (sub)"
  msgstr ""
  
@@@ -301,7 -301,7 +301,7 @@@ msgstr "Motion compensating deinterlace
  msgid "Noise reduction"
  msgstr "Reducción de ruido"
  
- #: src/lib/job.cc:302
+ #: src/lib/job.cc:314
  msgid "OK (ran for %1)"
  msgstr "OK (ejecución %1)"
  
@@@ -321,15 -321,15 +321,15 @@@ msgstr "Anuncio de servicio público
  msgid "Rating"
  msgstr "Clasificación"
  
- #: src/lib/util.cc:500
+ #: src/lib/util.cc:513
  msgid "Rec 709"
  msgstr "Rec 709"
  
- #: src/lib/util.cc:931
+ #: src/lib/util.cc:959
  msgid "Right"
  msgstr ""
  
- #: src/lib/util.cc:935
+ #: src/lib/util.cc:963
  msgid "Right surround"
  msgstr ""
  
@@@ -373,7 -373,7 +373,7 @@@ msgstr "Temporal noise reducer
  msgid "Test"
  msgstr "Test"
  
- #: src/lib/job.cc:78
+ #: src/lib/job.cc:79
  msgid ""
  "The drive that the film is stored on is low in disc space.  Free some more "
  "space and try again."
@@@ -393,7 -393,7 +393,7 @@@ msgstr "Codificar %1
  msgid "Transitional"
  msgstr "Transitional"
  
- #: src/lib/job.cc:104
+ #: src/lib/job.cc:105
  msgid "Unknown error"
  msgstr "Error desconocido"
  
@@@ -429,7 -429,7 +429,7 @@@ msgstr "Yet Another Deinterlacing Filte
  msgid "cannot contain slashes"
  msgstr "no puede contener barras"
  
- #: src/lib/util.cc:541
+ #: src/lib/util.cc:554
  msgid "connect timed out"
  msgstr "tiempo de conexión agotado"
  
@@@ -470,7 -470,7 +470,7 @@@ msgstr "no se pudo encontrar decodifica
  msgid "could not find video decoder"
  msgstr "no se pudo encontrar decodificador de vídeo"
  
- #: src/lib/sndfile_decoder.cc:72
+ #: src/lib/sndfile_decoder.cc:67
  msgid "could not open external audio file for reading"
  msgstr "no se pudo leer el fichero externo  de audio"
  
@@@ -505,11 -505,11 +505,11 @@@ msgstr "no se pudo abrir la sesión SSH
  msgid "could not write to file %1 (%2)"
  msgstr "No se pudo escribir el fichero remoto (%1)"
  
- #: src/lib/sndfile_decoder.cc:94
+ #: src/lib/sndfile_decoder.cc:89
  msgid "external audio files have differing lengths"
  msgstr "los ficheros externos de sonido tienen duraciones diferentes"
  
- #: src/lib/sndfile_decoder.cc:76
+ #: src/lib/sndfile_decoder.cc:71
  msgid "external audio files must be mono"
  msgstr "los ficheros externos de sonido deben ser mono"
  
@@@ -521,23 -521,23 +521,23 @@@ msgstr "formato
  msgid "frames per second"
  msgstr "fotogramas por segundo"
  
- #: src/lib/util.cc:115
+ #: src/lib/util.cc:128
  msgid "hour"
  msgstr "hora"
  
- #: src/lib/util.cc:112 src/lib/util.cc:117
+ #: src/lib/util.cc:125 src/lib/util.cc:130
  msgid "hours"
  msgstr "horas"
  
- #: src/lib/util.cc:122
+ #: src/lib/util.cc:135
  msgid "minute"
  msgstr "minuto"
  
- #: src/lib/util.cc:124
+ #: src/lib/util.cc:137
  msgid "minutes"
  msgstr "minutos"
  
- #: src/lib/util.cc:684
+ #: src/lib/util.cc:697
  msgid "missing key %1 in key-value set"
  msgstr "falta la clave %1 en el par clave-valor"
  
@@@ -563,15 -563,15 +563,15 @@@ msgstr "todavía no se soportan subtít
  
  #. / TRANSLATORS: remaining here follows an amount of time that is remaining
  #. / on an operation.
- #: src/lib/job.cc:299
+ #: src/lib/job.cc:311
  msgid "remaining"
  msgstr "pendiente"
  
- #: src/lib/util.cc:498
+ #: src/lib/util.cc:511
  msgid "sRGB"
  msgstr "sRGB"
  
- #: src/lib/util.cc:127
+ #: src/lib/util.cc:140
  msgid "seconds"
  msgstr "segundos"
  
diff --combined src/lib/po/fr_FR.po
index 7f3da788b2fc99389540b90b14fe107a380ba08f,a6a72598fd741330b299d4072f77dbba68aae612..d69e2f7d5c31d3587e2b2c747426b25f38e5b029
@@@ -5,11 -5,11 +5,11 @@@
  #
  msgid ""
  msgstr ""
 -"Project-Id-Version: DVD-o-matic FRENCH\n"
 +"Project-Id-Version: DCP-o-matic FRENCH\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2013-04-22 15:06+0100\n"
- "PO-Revision-Date: 2013-03-20 00:39+0100\n"
- "Last-Translator: FreeDCP.net <freedcp.net@gmail.com>\n"
+ "POT-Creation-Date: 2013-05-09 09:51+0100\n"
+ "PO-Revision-Date: 2013-05-10 14:33+0100\n"
+ "Last-Translator: \n"
  "Language-Team: \n"
  "Language: \n"
  "MIME-Version: 1.0\n"
@@@ -55,7 -55,7 +55,7 @@@ msgstr "Débruitage 3D
  
  #: src/lib/format.cc:79
  msgid "4:3"
- msgstr ""
+ msgstr "4:3"
  
  #: src/lib/format.cc:87
  msgid "4:3 within Flat"
@@@ -73,7 -73,7 +73,7 @@@ msgstr "Academy
  msgid "Advertisement"
  msgstr "Advertisement"
  
- #: src/lib/job.cc:72
+ #: src/lib/job.cc:73
  msgid "An error occurred whilst handling the file %1."
  msgstr "Une erreur s'est produite lors du traitement du fichier %1."
  
@@@ -93,21 -93,21 +93,21 @@@ msgstr "Bicubique
  msgid "Bilinear"
  msgstr "Bilinéaire"
  
- #: src/lib/job.cc:306
+ #: src/lib/job.cc:318
  msgid "Cancelled"
- msgstr ""
+ msgstr "Annulé"
  
  #: src/lib/exceptions.cc:60
  msgid "Cannot handle pixel format %1 during %2"
- msgstr ""
+ msgstr "Format du pixel %1 non géré par %2"
  
  #: 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
+ #: src/lib/util.cc:960
  msgid "Centre"
- msgstr ""
+ msgstr "Centre"
  
  #: src/lib/scp_dcp_job.cc:109
  msgid "Copy DCP to TMS"
@@@ -137,27 -137,37 +137,37 @@@ msgstr "Écriture vers fichier distant 
  msgid "Cubic interpolating deinterlacer"
  msgstr "Désentrelacement cubique interpolé"
  
- #: src/lib/util.cc:1007
+ #: src/lib/util.cc:1035
  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
+ #: src/lib/util.cc:1045
  #, 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
+ #: src/lib/util.cc:1038
  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
+ #: 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
+ #: 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"
  
@@@ -169,11 -179,11 +179,11 @@@ msgstr "Filtre anti bourdonnement
  msgid "Dolby CP750"
  msgstr "Dolby CP750"
  
- #: src/lib/util.cc:1012
+ #: src/lib/util.cc:1040
  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:304
+ #: src/lib/job.cc:316
  msgid "Error (%1)"
  msgstr "Erreur (%1)"
  
@@@ -245,13 -255,10 +255,10 @@@ msgstr "Filtre dé-bloc horizontal
  msgid "Horizontal deblocking filter A"
  msgstr "Filtre dé-bloc horizontal"
  
- #: src/lib/job.cc:96 src/lib/job.cc:105
- msgid ""
- "It is not known what caused this error.  The best idea is to report the "
- "problem to the DCP-o-matic mailing list (dcpomatic@carlh.net)"
- msgstr ""
- "Erreur indéterminée. Merci de rapporter le problème à la liste DCP-o-matic "
- "(dcpomatic@carlh.net)"
+ #: src/lib/job.cc:97
+ #: src/lib/job.cc:106
 -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)"
++msgid "It is not known what caused this error.  The best idea is to report the problem to the DCP-o-matic mailing list (dcpomatic@carlh.net)"
++msgstr "Erreur indéterminée. Merci de rapporter le problème à la liste DCP-o-matic (dcpomatic@carlh.net)"
  
  #: src/lib/filter.cc:82
  msgid "Kernel deinterlacer"
@@@ -261,15 -268,15 +268,15 @@@ msgstr "Désentrelaceur noyau
  msgid "Lanczos"
  msgstr "Lanczos"
  
- #: src/lib/util.cc:930
+ #: src/lib/util.cc:958
  msgid "Left"
  msgstr "Gauche"
  
- #: src/lib/util.cc:934
+ #: src/lib/util.cc:962
  msgid "Left surround"
  msgstr "Arrière gauche"
  
- #: src/lib/util.cc:933
+ #: src/lib/util.cc:961
  msgid "Lfe (sub)"
  msgstr "Basses fréquences"
  
@@@ -285,8 -292,11 +292,11 @@@ msgstr "Désentrelaceur linéaire inter
  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
+ #: 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"
  
  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: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:302
+ #: src/lib/job.cc:314
  msgid "OK (ran for %1)"
  msgstr "OK (processus %1)"
  
@@@ -319,15 -331,15 +331,15 @@@ msgstr "Public Service Announcement
  msgid "Rating"
  msgstr "Classification"
  
- #: src/lib/util.cc:500
+ #: src/lib/util.cc:513
  msgid "Rec 709"
  msgstr "Rec 709"
  
- #: src/lib/util.cc:931
+ #: src/lib/util.cc:959
  msgid "Right"
  msgstr "Droite"
  
- #: src/lib/util.cc:935
+ #: src/lib/util.cc:963
  msgid "Right surround"
  msgstr "Arrière droite"
  
@@@ -371,13 -383,9 +383,9 @@@ msgstr "Réduction de bruit temporel
  msgid "Test"
  msgstr "Test"
  
- #: src/lib/job.cc:78
- 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/job.cc:79
+ 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"
@@@ -391,7 -399,7 +399,7 @@@ msgstr "Transcodage %1
  msgid "Transitional"
  msgstr "Transitional"
  
- #: src/lib/job.cc:104
+ #: src/lib/job.cc:105
  msgid "Unknown error"
  msgstr "Erreur inconnue"
  
@@@ -427,7 -435,7 +435,7 @@@ msgstr "Un autre filtre de désentrelac
  msgid "cannot contain slashes"
  msgstr "slash interdit"
  
- #: src/lib/util.cc:541
+ #: src/lib/util.cc:554
  msgid "connect timed out"
  msgstr "temps de connexion expiré"
  
@@@ -467,7 -475,7 +475,7 @@@ msgstr "décodeur de sous-titre introuv
  msgid "could not find video decoder"
  msgstr "décodeur vidéo introuvable"
  
- #: src/lib/sndfile_decoder.cc:72
+ #: src/lib/sndfile_decoder.cc:67
  msgid "could not open external audio file for reading"
  msgstr "lecture du fichier audio externe impossible"
  
@@@ -481,9 -489,10 +489,10 @@@ 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)"
+ msgstr "création du dossier distant %1 impossible (%2)"
  
- #: src/lib/encoder.cc:137 src/lib/encoder.cc:314
+ #: 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"
  
@@@ -499,11 -508,11 +508,11 @@@ msgstr "démarrage de session SSH impos
  msgid "could not write to file %1 (%2)"
  msgstr "Écriture vers fichier distant (%1) impossible (%2)"
  
- #: src/lib/sndfile_decoder.cc:94
+ #: src/lib/sndfile_decoder.cc:89
  msgid "external audio files have differing lengths"
  msgstr "Les fichiers audio externes ont des durées différentes"
  
- #: src/lib/sndfile_decoder.cc:76
+ #: src/lib/sndfile_decoder.cc:71
  msgid "external audio files must be mono"
  msgstr "les fichiers audio externes doivent être en mono"
  
@@@ -515,35 -524,37 +524,37 @@@ msgstr "format
  msgid "frames per second"
  msgstr "images par seconde"
  
- #: src/lib/util.cc:115
+ #: src/lib/util.cc:128
  msgid "hour"
  msgstr "heure"
  
- #: src/lib/util.cc:112 src/lib/util.cc:117
+ #: src/lib/util.cc:125
+ #: src/lib/util.cc:130
  msgid "hours"
  msgstr "heures"
  
- #: src/lib/util.cc:122
+ #: src/lib/util.cc:135
  msgid "minute"
  msgstr "minute"
  
- #: src/lib/util.cc:124
+ #: src/lib/util.cc:137
  msgid "minutes"
  msgstr "minutes"
  
- #: src/lib/util.cc:684
+ #: src/lib/util.cc:697
  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 ""
+ msgstr "paramètre %1 manquant"
  
  #: 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:296 src/lib/film.cc:341
+ #: src/lib/film.cc:296
+ #: src/lib/film.cc:341
  msgid "name"
  msgstr "nom"
  
@@@ -557,15 -568,15 +568,15 @@@ msgstr "sous-titres non-bitmap non supp
  
  #. / TRANSLATORS: remaining here follows an amount of time that is remaining
  #. / on an operation.
- #: src/lib/job.cc:299
+ #: src/lib/job.cc:311
  msgid "remaining"
  msgstr "restant"
  
- #: src/lib/util.cc:498
+ #: src/lib/util.cc:511
  msgid "sRGB"
  msgstr "sRGB"
  
- #: src/lib/util.cc:127
+ #: src/lib/util.cc:140
  msgid "seconds"
  msgstr "secondes"
  
diff --combined src/lib/po/it_IT.po
index bd22412fc67f4b853eaf575549fc721dc3393316,6a7486d82d415d3e5285fceb4b6d6c7600a9adca..1a46e67be31c9f70d96634ab9bd4d6697aebb9c5
@@@ -7,7 -7,7 +7,7 @@@ msgid "
  msgstr ""
  "Project-Id-Version: IT VERSION\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2013-04-22 15:06+0100\n"
+ "POT-Creation-Date: 2013-05-09 09:51+0100\n"
  "PO-Revision-Date: 2013-04-28 10:26+0100\n"
  "Last-Translator: Maci <macibro@gmail.com>\n"
  "Language-Team: \n"
@@@ -73,7 -73,7 +73,7 @@@ msgstr "Academy
  msgid "Advertisement"
  msgstr "Pubblicità"
  
- #: src/lib/job.cc:72
+ #: src/lib/job.cc:73
  msgid "An error occurred whilst handling the file %1."
  msgstr "Errore durante l'elaborazione del file %1."
  
@@@ -93,7 -93,7 +93,7 @@@ msgstr "Bicubica
  msgid "Bilinear"
  msgstr "Bilineare"
  
- #: src/lib/job.cc:306
+ #: src/lib/job.cc:318
  msgid "Cancelled"
  msgstr "Cancellato"
  
@@@ -105,7 -105,7 +105,7 @@@ msgstr "Non posso gestire il formato d
  msgid "Cannot resample audio as libswresample is not present"
  msgstr "Non posso ricampionare l'audio perchè libswresample non è presente"
  
- #: src/lib/util.cc:932
+ #: src/lib/util.cc:960
  msgid "Centre"
  msgstr "Centro"
  
@@@ -137,15 -137,15 +137,15 @@@ msgstr "Non posso scrivere il file remo
  msgid "Cubic interpolating deinterlacer"
  msgstr "Deinterlacciatore cubico interpolato"
  
- #: src/lib/util.cc:1007
+ #: src/lib/util.cc:1035
  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
+ #: src/lib/util.cc:1045
  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
+ #: src/lib/util.cc:1038
  msgid "DCP will use every other frame of the source.\n"
  msgstr "Il DCP userà ogni altro fotogramma del sorgente.\n"
  
@@@ -168,11 -168,11 +168,11 @@@ msgstr "Filtro deringing
  msgid "Dolby CP750"
  msgstr "Dolby CP750"
  
- #: src/lib/util.cc:1012
+ #: src/lib/util.cc:1040
  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:304
+ #: src/lib/job.cc:316
  msgid "Error (%1)"
  msgstr "Errore (%1)"
  
@@@ -244,13 -244,13 +244,13 @@@ msgstr "Filtro sblocco orizzontale
  msgid "Horizontal deblocking filter A"
  msgstr "Filtro A sblocco orizzontale"
  
- #: src/lib/job.cc:96 src/lib/job.cc:105
+ #: src/lib/job.cc:97 src/lib/job.cc:106
  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)"
 +"problem to the DCP-o-matic mailing list (dcpomatic@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)"
 +"report del problema alla mailing list di DCP-o-matic (dcpomatic@carlh.net)"
  
  #: src/lib/filter.cc:82
  msgid "Kernel deinterlacer"
@@@ -260,15 -260,15 +260,15 @@@ msgstr "Deinterlacciatore Kernel
  msgid "Lanczos"
  msgstr "Lanczos"
  
- #: src/lib/util.cc:930
+ #: src/lib/util.cc:958
  msgid "Left"
  msgstr "Sinistro"
  
- #: src/lib/util.cc:934
+ #: src/lib/util.cc:962
  msgid "Left surround"
  msgstr "Surround sinistro"
  
- #: src/lib/util.cc:933
+ #: src/lib/util.cc:961
  msgid "Lfe (sub)"
  msgstr "Lfe(sub)"
  
@@@ -298,7 -298,7 +298,7 @@@ msgstr "Dinterlacciatore compensativo d
  msgid "Noise reduction"
  msgstr "Riduzione del rumore"
  
- #: src/lib/job.cc:302
+ #: src/lib/job.cc:314
  msgid "OK (ran for %1)"
  msgstr "OK (eseguito in %1)"
  
@@@ -318,15 -318,15 +318,15 @@@ msgstr "Annuncio di pubblico servizio
  msgid "Rating"
  msgstr "Punteggio"
  
- #: src/lib/util.cc:500
+ #: src/lib/util.cc:513
  msgid "Rec 709"
  msgstr "Rec 709"
  
- #: src/lib/util.cc:931
+ #: src/lib/util.cc:959
  msgid "Right"
  msgstr "Destro"
  
- #: src/lib/util.cc:935
+ #: src/lib/util.cc:963
  msgid "Right surround"
  msgstr "Surround destro"
  
@@@ -370,7 -370,7 +370,7 @@@ msgstr "Riduttore temporale di rumore
  msgid "Test"
  msgstr "Prova"
  
- #: src/lib/job.cc:78
+ #: src/lib/job.cc:79
  msgid ""
  "The drive that the film is stored on is low in disc space.  Free some more "
  "space and try again."
@@@ -390,7 -390,7 +390,7 @@@ msgstr "Transcodifica %1
  msgid "Transitional"
  msgstr "Di transizione"
  
- #: src/lib/job.cc:104
+ #: src/lib/job.cc:105
  msgid "Unknown error"
  msgstr "Errore sconosciuto"
  
@@@ -426,7 -426,7 +426,7 @@@ msgstr "Altro filtro di deinterlacciame
  msgid "cannot contain slashes"
  msgstr "non può contenere barre"
  
- #: src/lib/util.cc:541
+ #: src/lib/util.cc:554
  msgid "connect timed out"
  msgstr "connessione scaduta"
  
@@@ -466,7 -466,7 +466,7 @@@ msgstr "non riesco a trovare il decode
  msgid "could not find video decoder"
  msgstr "non riesco a trovare il decoder video"
  
- #: src/lib/sndfile_decoder.cc:72
+ #: src/lib/sndfile_decoder.cc:67
  msgid "could not open external audio file for reading"
  msgstr "non riesco ad aprire il file dell'audio esterno per leggerlo"
  
@@@ -498,11 -498,11 +498,11 @@@ msgstr "non posso avviare la sessione S
  msgid "could not write to file %1 (%2)"
  msgstr "non posso scrivere il file (%1)"
  
- #: src/lib/sndfile_decoder.cc:94
+ #: src/lib/sndfile_decoder.cc:89
  msgid "external audio files have differing lengths"
  msgstr "i files dell'audio esterno hanno durata diversa"
  
- #: src/lib/sndfile_decoder.cc:76
+ #: src/lib/sndfile_decoder.cc:71
  msgid "external audio files must be mono"
  msgstr "i files dell'audio esterno devono essere mono"
  
@@@ -514,23 -514,23 +514,23 @@@ msgstr "formato
  msgid "frames per second"
  msgstr "fotogrammi al secondo"
  
- #: src/lib/util.cc:115
+ #: src/lib/util.cc:128
  msgid "hour"
  msgstr "ora"
  
- #: src/lib/util.cc:112 src/lib/util.cc:117
+ #: src/lib/util.cc:125 src/lib/util.cc:130
  msgid "hours"
  msgstr "ore"
  
- #: src/lib/util.cc:122
+ #: src/lib/util.cc:135
  msgid "minute"
  msgstr "minuto"
  
- #: src/lib/util.cc:124
+ #: src/lib/util.cc:137
  msgid "minutes"
  msgstr "minuti"
  
- #: src/lib/util.cc:684
+ #: src/lib/util.cc:697
  msgid "missing key %1 in key-value set"
  msgstr "persa la chiave %1 tra i valori chiave"
  
@@@ -556,15 -556,15 +556,15 @@@ msgstr "sottotitoli non-bitmap non anco
  
  #. / TRANSLATORS: remaining here follows an amount of time that is remaining
  #. / on an operation.
- #: src/lib/job.cc:299
+ #: src/lib/job.cc:311
  msgid "remaining"
  msgstr "restano"
  
- #: src/lib/util.cc:498
+ #: src/lib/util.cc:511
  msgid "sRGB"
  msgstr "sRGB"
  
- #: src/lib/util.cc:127
+ #: src/lib/util.cc:140
  msgid "seconds"
  msgstr "secondi"
  
diff --combined src/lib/po/sv_SE.po
index ff86e23af926d175446fbe5258a912ddbaf6cbfd,58d336ef8046dbb6bf1cb8a79a30006c606f99f9..d9a9c5955b05d0d71bca2c2fe9718d7b75c55e51
@@@ -5,9 -5,9 +5,9 @@@
  #
  msgid ""
  msgstr ""
 -"Project-Id-Version: DVD-o-matic\n"
 +"Project-Id-Version: DCP-o-matic\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2013-04-22 15:06+0100\n"
+ "POT-Creation-Date: 2013-05-09 09:51+0100\n"
  "PO-Revision-Date: 2013-04-10 15:35+0100\n"
  "Last-Translator: Adam Klotblixt <adam.klotblixt@gmail.com>\n"
  "Language-Team: \n"
@@@ -73,7 -73,7 +73,7 @@@ msgstr "Academy
  msgid "Advertisement"
  msgstr "Reklam"
  
- #: src/lib/job.cc:72
+ #: src/lib/job.cc:73
  msgid "An error occurred whilst handling the file %1."
  msgstr "Ett fel inträffade vid hantering av filen %1"
  
@@@ -93,7 -93,7 +93,7 @@@ msgstr "Bikubisk
  msgid "Bilinear"
  msgstr "Bilinjär"
  
- #: src/lib/job.cc:306
+ #: src/lib/job.cc:318
  msgid "Cancelled"
  msgstr "Avbruten"
  
@@@ -106,7 -106,7 +106,7 @@@ msgid "Cannot resample audio as libswre
  msgstr ""
  "Kan inte omsampla ljudet eftersom libswresample inte finns tillgängligt"
  
- #: src/lib/util.cc:932
+ #: src/lib/util.cc:960
  msgid "Centre"
  msgstr "Mitt"
  
@@@ -138,15 -138,15 +138,15 @@@ msgstr "Kunde inte skriva till fjärrfi
  msgid "Cubic interpolating deinterlacer"
  msgstr "Kubiskt interpolerande avflätare"
  
- #: src/lib/util.cc:1007
+ #: src/lib/util.cc:1035
  msgid "DCP and source have the same rate.\n"
  msgstr "DCP och källa har samma bildfrekvens.\n"
  
- #: src/lib/util.cc:1017
+ #: src/lib/util.cc:1045
  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
+ #: src/lib/util.cc:1038
  msgid "DCP will use every other frame of the source.\n"
  msgstr "DCP kommer att använda varannan bild från källan.\n"
  
@@@ -169,11 -169,11 +169,11 @@@ msgstr "Avringningsfilter
  msgid "Dolby CP750"
  msgstr "Dolby CP750"
  
- #: src/lib/util.cc:1012
+ #: src/lib/util.cc:1040
  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:304
+ #: src/lib/job.cc:316
  msgid "Error (%1)"
  msgstr "Fel (%1)"
  
@@@ -245,13 -245,13 +245,13 @@@ msgstr "Filter för horisontal kantighe
  msgid "Horizontal deblocking filter A"
  msgstr "Filter för horisontal kantighetsutjämning A"
  
- #: src/lib/job.cc:96 src/lib/job.cc:105
+ #: src/lib/job.cc:97 src/lib/job.cc:106
  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)"
 +"problem to the DCP-o-matic mailing list (dcpomatic@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)"
 +"problemet är till DCP-o-matics mejl-lista (dcpomatic@carlh.net)"
  
  #: src/lib/filter.cc:82
  msgid "Kernel deinterlacer"
@@@ -261,15 -261,15 +261,15 @@@ msgstr "Kernel-avflätare
  msgid "Lanczos"
  msgstr "Lanczos"
  
- #: src/lib/util.cc:930
+ #: src/lib/util.cc:958
  msgid "Left"
  msgstr "Vänster"
  
- #: src/lib/util.cc:934
+ #: src/lib/util.cc:962
  msgid "Left surround"
  msgstr "Vänster surround"
  
- #: src/lib/util.cc:933
+ #: src/lib/util.cc:961
  msgid "Lfe (sub)"
  msgstr "Lfe (sub)"
  
@@@ -299,7 -299,7 +299,7 @@@ msgstr "Rörelsekompenserande avflätar
  msgid "Noise reduction"
  msgstr "Brusreducering"
  
- #: src/lib/job.cc:302
+ #: src/lib/job.cc:314
  msgid "OK (ran for %1)"
  msgstr "OK (kördes %1)"
  
@@@ -319,15 -319,15 +319,15 @@@ msgstr "Offentligt Servicemeddelande
  msgid "Rating"
  msgstr "Klassificeringsklipp"
  
- #: src/lib/util.cc:500
+ #: src/lib/util.cc:513
  msgid "Rec 709"
  msgstr "Rec 709"
  
- #: src/lib/util.cc:931
+ #: src/lib/util.cc:959
  msgid "Right"
  msgstr "Höger"
  
- #: src/lib/util.cc:935
+ #: src/lib/util.cc:963
  msgid "Right surround"
  msgstr "Höger surround"
  
@@@ -371,7 -371,7 +371,7 @@@ msgstr "Temporal brusreducering
  msgid "Test"
  msgstr "Test"
  
- #: src/lib/job.cc:78
+ #: src/lib/job.cc:79
  msgid ""
  "The drive that the film is stored on is low in disc space.  Free some more "
  "space and try again."
@@@ -391,7 -391,7 +391,7 @@@ msgstr "Konvertera %1
  msgid "Transitional"
  msgstr "Övergångsklipp"
  
- #: src/lib/job.cc:104
+ #: src/lib/job.cc:105
  msgid "Unknown error"
  msgstr "Okänt fel"
  
@@@ -431,7 -431,7 +431,7 @@@ msgid "cannot contain slashes
  msgstr "får inte innehålla snedstreck"
  
  # Svengelska
- #: src/lib/util.cc:541
+ #: src/lib/util.cc:554
  #, fuzzy
  msgid "connect timed out"
  msgstr "uppkopplingen tajmade ur"
@@@ -472,7 -472,7 +472,7 @@@ msgstr "kunde inte hitta undertext-avko
  msgid "could not find video decoder"
  msgstr "kunde inte hitta video-avkodare"
  
- #: src/lib/sndfile_decoder.cc:72
+ #: src/lib/sndfile_decoder.cc:67
  msgid "could not open external audio file for reading"
  msgstr "kunde inte öppna extern audio-fil för läsning"
  
@@@ -504,11 -504,11 +504,11 @@@ msgstr "kunde inte starta SSH-session
  msgid "could not write to file %1 (%2)"
  msgstr "kunde inte skriva till fil %1 (%2)"
  
- #: src/lib/sndfile_decoder.cc:94
+ #: src/lib/sndfile_decoder.cc:89
  msgid "external audio files have differing lengths"
  msgstr "externa audio-filer har olika längder"
  
- #: src/lib/sndfile_decoder.cc:76
+ #: src/lib/sndfile_decoder.cc:71
  msgid "external audio files must be mono"
  msgstr "externa audio-filer måste vara mono"
  
@@@ -520,23 -520,23 +520,23 @@@ msgstr "format
  msgid "frames per second"
  msgstr "bilder per sekund"
  
- #: src/lib/util.cc:115
+ #: src/lib/util.cc:128
  msgid "hour"
  msgstr "timme"
  
- #: src/lib/util.cc:112 src/lib/util.cc:117
+ #: src/lib/util.cc:125 src/lib/util.cc:130
  msgid "hours"
  msgstr "timmar"
  
- #: src/lib/util.cc:122
+ #: src/lib/util.cc:135
  msgid "minute"
  msgstr "minut"
  
- #: src/lib/util.cc:124
+ #: src/lib/util.cc:137
  msgid "minutes"
  msgstr "minuter"
  
- #: src/lib/util.cc:684
+ #: src/lib/util.cc:697
  msgid "missing key %1 in key-value set"
  msgstr "saknad nyckel %1 i nyckel-värde grupp"
  
@@@ -562,15 -562,15 +562,15 @@@ msgstr "icke-rastergrafiska undertexte
  
  #. / TRANSLATORS: remaining here follows an amount of time that is remaining
  #. / on an operation.
- #: src/lib/job.cc:299
+ #: src/lib/job.cc:311
  msgid "remaining"
  msgstr "återstående tid"
  
- #: src/lib/util.cc:498
+ #: src/lib/util.cc:511
  msgid "sRGB"
  msgstr "sRGB"
  
- #: src/lib/util.cc:127
+ #: src/lib/util.cc:140
  msgid "seconds"
  msgstr "sekunder"
  
diff --combined src/lib/util.cc
index 9063b46d49b3514ecf43ebdfe7fbc7f21e996fab,2f8be6edde675dc37de0c1336b7d3a406bcf61fe..de5fbf8d18ecb56182a799d6a58f23532b39bc30
@@@ -27,7 -27,7 +27,7 @@@
  #include <iostream>
  #include <fstream>
  #include <climits>
 -#ifdef DVDOMATIC_POSIX
 +#ifdef DCPOMATIC_POSIX
  #include <execinfo.h>
  #include <cxxabi.h>
  #endif
@@@ -39,6 -39,7 +39,7 @@@
  #include <boost/lexical_cast.hpp>
  #include <boost/thread.hpp>
  #include <boost/filesystem.hpp>
+ #include <glib.h>
  #include <openjpeg.h>
  #include <openssl/md5.h>
  #include <magick/MagickCore.h>
@@@ -60,33 -61,32 +61,38 @@@ extern "C" 
  #include "filter.h"
  #include "sound_processor.h"
  #include "config.h"
+ #ifdef DVDOMATIC_WINDOWS
+ #include "stack.hpp"
+ #endif
  
  #include "i18n.h"
  
 -using std::cout;
  using std::string;
  using std::stringstream;
 -using std::list;
 +using std::setfill;
  using std::ostream;
 +using std::endl;
  using std::vector;
 +using std::hex;
 +using std::setw;
  using std::ifstream;
 -using std::istream;
 +using std::ios;
  using std::min;
  using std::max;
 +using std::list;
  using std::multimap;
 +using std::istream;
 +using std::numeric_limits;
  using std::pair;
+ using std::ofstream;
  using boost::shared_ptr;
 +using boost::thread;
  using boost::lexical_cast;
  using boost::optional;
  using libdcp::Size;
  
  boost::thread::id ui_thread;
+ boost::filesystem::path backtrace_file;
  
  /** Convert some number of seconds to a string representation
   *  in hours, minutes and seconds.
@@@ -113,12 -113,6 +119,12 @@@ seconds_to_hms (int s
        return hms.str ();
  }
  
 +string
 +time_to_hms (Time t)
 +{
 +      return seconds_to_hms (t / TIME_HZ);
 +}
 +
  /** @param s Number of seconds.
   *  @return String containing an approximate description of s (e.g. "about 2 hours")
   */
@@@ -155,7 -149,7 +161,7 @@@ seconds_to_approximate_hms (int s
        return ap.str ();
  }
  
 -#ifdef DVDOMATIC_POSIX
 +#ifdef DCPOMATIC_POSIX
  /** @param l Mangled C++ identifier.
   *  @return Demangled version.
   */
@@@ -254,12 -248,28 +260,28 @@@ seconds (struct timeval t
        return t.tv_sec + (double (t.tv_usec) / 1e6);
  }
  
- /** Call the required functions to set up DCP-o-matic's static arrays, etc.
+ #ifdef DVDOMATIC_WINDOWS
+ LONG WINAPI exception_handler(struct _EXCEPTION_POINTERS *)
+ {
+       dbg::stack s;
+       ofstream f (backtrace_file.string().c_str());
+       std::copy(s.begin(), s.end(), std::ostream_iterator<dbg::stack_frame>(f, "\n"));
+       return EXCEPTION_CONTINUE_SEARCH;
+ }
+ #endif
+ /** Call the required functions to set up DVD-o-matic's static arrays, etc.
   *  Must be called from the UI thread, if there is one.
   */
  void
 -dvdomatic_setup ()
 +dcpomatic_setup ()
  {
+ #ifdef DVDOMATIC_WINDOWS
+       backtrace_file /= g_get_user_config_dir ();
+       backtrace_file /= "backtrace.txt";
+       SetUnhandledExceptionFilter(exception_handler);
+ #endif        
+       
        avfilter_register_all ();
        
        Format::setup_formats ();
        ui_thread = boost::this_thread::get_id ();
  }
  
 -#ifdef DVDOMATIC_WINDOWS
 +#ifdef DCPOMATIC_WINDOWS
  boost::filesystem::path
  mo_path ()
  {
  #endif
  
  void
 -dvdomatic_setup_gettext_i18n (string lang)
 +dcpomatic_setup_gettext_i18n (string lang)
  {
 -#ifdef DVDOMATIC_POSIX
 +#ifdef DCPOMATIC_POSIX
        lang += ".UTF8";
  #endif
  
        }
  
        setlocale (LC_ALL, "");
 -      textdomain ("libdvdomatic");
 +      textdomain ("libdcpomatic");
  
 -#ifdef DVDOMATIC_WINDOWS
 -      bindtextdomain ("libdvdomatic", mo_path().string().c_str());
 -      bind_textdomain_codeset ("libdvdomatic", "UTF8");
 +#ifdef DCPOMATIC_WINDOWS
 +      bindtextdomain ("libdcpomatic", mo_path().string().c_str());
 +      bind_textdomain_codeset ("libdcpomatic", "UTF8");
  #endif        
  
 -#ifdef DVDOMATIC_POSIX
 -      bindtextdomain ("libdvdomatic", POSIX_LOCALE_PREFIX);
 +#ifdef DCPOMATIC_POSIX
 +      bindtextdomain ("libdcpomatic", POSIX_LOCALE_PREFIX);
  #endif
  }
  
@@@ -373,11 -383,11 +395,11 @@@ md5_digest (void const * data, int size
   *  @return MD5 digest of file's contents.
   */
  string
 -md5_digest (string file)
 +md5_digest (boost::filesystem::path file)
  {
 -      ifstream f (file.c_str(), std::ios::binary);
 +      ifstream f (file.string().c_str(), std::ios::binary);
        if (!f.good ()) {
 -              throw OpenFileError (file);
 +              throw OpenFileError (file.string());
        }
        
        f.seekg (0, std::ios::end);
@@@ -434,11 -444,66 +456,11 @@@ about_equal (float a, float b
        return (fabs (a - b) < 1e-4);
  }
  
 -class FrameRateCandidate
 -{
 -public:
 -      FrameRateCandidate (float source_, int dcp_)
 -              : source (source_)
 -              , dcp (dcp_)
 -      {}
 -
 -      float source;
 -      int dcp;
 -};
 -
 -int
 -best_dcp_frame_rate (float source_fps)
 -{
 -      list<int> const allowed_dcp_frame_rates = Config::instance()->allowed_dcp_frame_rates ();
 -
 -      /* Work out what rates we could manage, including those achieved by using skip / repeat. */
 -      list<FrameRateCandidate> candidates;
 -
 -      /* Start with the ones without skip / repeat so they will get matched in preference to skipped/repeated ones */
 -      for (list<int>::const_iterator i = allowed_dcp_frame_rates.begin(); i != allowed_dcp_frame_rates.end(); ++i) {
 -              candidates.push_back (FrameRateCandidate (*i, *i));
 -      }
 -
 -      /* Then the skip/repeat ones */
 -      for (list<int>::const_iterator i = allowed_dcp_frame_rates.begin(); i != allowed_dcp_frame_rates.end(); ++i) {
 -              candidates.push_back (FrameRateCandidate (float (*i) / 2, *i));
 -              candidates.push_back (FrameRateCandidate (float (*i) * 2, *i));
 -      }
 -
 -      /* Pick the best one, bailing early if we hit an exact match */
 -      float error = std::numeric_limits<float>::max ();
 -      optional<FrameRateCandidate> best;
 -      list<FrameRateCandidate>::iterator i = candidates.begin();
 -      while (i != candidates.end()) {
 -              
 -              if (about_equal (i->source, source_fps)) {
 -                      best = *i;
 -                      break;
 -              }
 -
 -              float const e = fabs (i->source - source_fps);
 -              if (e < error) {
 -                      error = e;
 -                      best = *i;
 -              }
 -
 -              ++i;
 -      }
 -
 -      assert (best);
 -      return best->dcp;
 -}
 -
 -/** @param An arbitrary sampling rate.
 - *  @return The appropriate DCP-approved sampling rate (48kHz or 96kHz).
 +/** @param An arbitrary audio frame rate.
 + *  @return The appropriate DCP-approved frame rate (48kHz or 96kHz).
   */
  int
 -dcp_audio_sample_rate (int fs)
 +dcp_audio_frame_rate (int fs)
  {
        if (fs <= 48000) {
                return 48000;
        return 96000;
  }
  
 -bool operator== (Crop const & a, Crop const & b)
 -{
 -      return (a.left == b.left && a.right == b.right && a.top == b.top && a.bottom == b.bottom);
 -}
 -
 -bool operator!= (Crop const & a, Crop const & b)
 -{
 -      return !(a == b);
 -}
 -
  /** @param index Colour LUT index.
   *  @return Human-readable name.
   */
@@@ -559,6 -634,22 +581,6 @@@ Socket::read_uint32 (
        return ntohl (v);
  }
  
 -/** @param other A Rect.
 - *  @return The intersection of this with `other'.
 - */
 -Rect
 -Rect::intersection (Rect const & other) const
 -{
 -      int const tx = max (x, other.x);
 -      int const ty = max (y, other.y);
 -      
 -      return Rect (
 -              tx, ty,
 -              min (x + width, other.x + other.width) - tx,
 -              min (y + height, other.y + other.height) - ty
 -              );
 -}
 -
  /** Round a number up to the nearest multiple of another number.
   *  @param c Index.
   *  @param s Array of numbers to round, indexed by c.
@@@ -675,6 -766,151 +697,6 @@@ get_optional_int (multimap<string, stri
        return lexical_cast<int> (i->second);
  }
  
 -/** Construct an AudioBuffers.  Audio data is undefined after this constructor.
 - *  @param channels Number of channels.
 - *  @param frames Number of frames to reserve space for.
 - */
 -AudioBuffers::AudioBuffers (int channels, int frames)
 -      : _channels (channels)
 -      , _frames (frames)
 -      , _allocated_frames (frames)
 -{
 -      _data = new float*[_channels];
 -      for (int i = 0; i < _channels; ++i) {
 -              _data[i] = new float[frames];
 -      }
 -}
 -
 -/** Copy constructor.
 - *  @param other Other AudioBuffers; data is copied.
 - */
 -AudioBuffers::AudioBuffers (AudioBuffers const & other)
 -      : _channels (other._channels)
 -      , _frames (other._frames)
 -      , _allocated_frames (other._frames)
 -{
 -      _data = new float*[_channels];
 -      for (int i = 0; i < _channels; ++i) {
 -              _data[i] = new float[_frames];
 -              memcpy (_data[i], other._data[i], _frames * sizeof (float));
 -      }
 -}
 -
 -/* XXX: it's a shame that this is a copy-and-paste of the above;
 -   probably fixable with c++0x.
 -*/
 -AudioBuffers::AudioBuffers (boost::shared_ptr<const AudioBuffers> other)
 -      : _channels (other->_channels)
 -      , _frames (other->_frames)
 -      , _allocated_frames (other->_frames)
 -{
 -      _data = new float*[_channels];
 -      for (int i = 0; i < _channels; ++i) {
 -              _data[i] = new float[_frames];
 -              memcpy (_data[i], other->_data[i], _frames * sizeof (float));
 -      }
 -}
 -
 -/** AudioBuffers destructor */
 -AudioBuffers::~AudioBuffers ()
 -{
 -      for (int i = 0; i < _channels; ++i) {
 -              delete[] _data[i];
 -      }
 -
 -      delete[] _data;
 -}
 -
 -/** @param c Channel index.
 - *  @return Buffer for this channel.
 - */
 -float*
 -AudioBuffers::data (int c) const
 -{
 -      assert (c >= 0 && c < _channels);
 -      return _data[c];
 -}
 -
 -/** Set the number of frames that these AudioBuffers will report themselves
 - *  as having.
 - *  @param f Frames; must be less than or equal to the number of allocated frames.
 - */
 -void
 -AudioBuffers::set_frames (int f)
 -{
 -      assert (f <= _allocated_frames);
 -      _frames = f;
 -}
 -
 -/** Make all samples on all channels silent */
 -void
 -AudioBuffers::make_silent ()
 -{
 -      for (int i = 0; i < _channels; ++i) {
 -              make_silent (i);
 -      }
 -}
 -
 -/** Make all samples on a given channel silent.
 - *  @param c Channel.
 - */
 -void
 -AudioBuffers::make_silent (int c)
 -{
 -      assert (c >= 0 && c < _channels);
 -      
 -      for (int i = 0; i < _frames; ++i) {
 -              _data[c][i] = 0;
 -      }
 -}
 -
 -/** Copy data from another AudioBuffers to this one.  All channels are copied.
 - *  @param from AudioBuffers to copy from; must have the same number of channels as this.
 - *  @param frames_to_copy Number of frames to copy.
 - *  @param read_offset Offset to read from in `from'.
 - *  @param write_offset Offset to write to in `to'.
 - */
 -void
 -AudioBuffers::copy_from (AudioBuffers* from, int frames_to_copy, int read_offset, int write_offset)
 -{
 -      assert (from->channels() == channels());
 -
 -      assert (from);
 -      assert (read_offset >= 0 && (read_offset + frames_to_copy) <= from->_allocated_frames);
 -      assert (write_offset >= 0 && (write_offset + frames_to_copy) <= _allocated_frames);
 -
 -      for (int i = 0; i < _channels; ++i) {
 -              memcpy (_data[i] + write_offset, from->_data[i] + read_offset, frames_to_copy * sizeof(float));
 -      }
 -}
 -
 -/** Move audio data around.
 - *  @param from Offset to move from.
 - *  @param to Offset to move to.
 - *  @param frames Number of frames to move.
 - */
 -    
 -void
 -AudioBuffers::move (int from, int to, int frames)
 -{
 -      if (frames == 0) {
 -              return;
 -      }
 -      
 -      assert (from >= 0);
 -      assert (from < _frames);
 -      assert (to >= 0);
 -      assert (to < _frames);
 -      assert (frames > 0);
 -      assert (frames <= _frames);
 -      assert ((from + frames) <= _frames);
 -      assert ((to + frames) <= _frames);
 -      
 -      for (int i = 0; i < _channels; ++i) {
 -              memmove (_data[i] + to, _data[i] + from, frames * sizeof(float));
 -      }
 -}
 -
  /** Trip an assert if the caller is not in the UI thread */
  void
  ensure_ui_thread ()
        assert (boost::this_thread::get_id() == ui_thread);
  }
  
 -/** @param v Source video frame.
 +/** @param v Content video frame.
   *  @param audio_sample_rate Source audio sample rate.
   *  @param frames_per_second Number of video frames per second.
   *  @return Equivalent number of audio frames for `v'.
   */
  int64_t
 -video_frames_to_audio_frames (SourceFrame v, float audio_sample_rate, float frames_per_second)
 +video_frames_to_audio_frames (ContentVideoFrame v, float audio_sample_rate, float frames_per_second)
  {
        return ((int64_t) v * audio_sample_rate / frames_per_second);
  }
  
 -/** @param f Filename.
 - *  @return true if this file is a still image, false if it is something else.
 - */
 -bool
 -still_image_file (string f)
 -{
 -      string ext = boost::filesystem::path(f).extension().string();
 -
 -      transform (ext.begin(), ext.end(), ext.begin(), ::tolower);
 -      
 -      return (ext == N_(".tif") || ext == N_(".tiff") || ext == N_(".jpg") || ext == N_(".jpeg") || ext == N_(".png") || ext == N_(".bmp"));
 -}
 -
  /** @return A pair containing CPU model name and the number of processors */
  pair<string, int>
  cpu_info ()
        pair<string, int> info;
        info.second = 0;
        
 -#ifdef DVDOMATIC_POSIX
 +#ifdef DCPOMATIC_POSIX
        ifstream f (N_("/proc/cpuinfo"));
        while (f.good ()) {
                string l;
@@@ -739,6 -988,58 +761,6 @@@ audio_channel_name (int c
        return channels[c];
  }
  
 -AudioMapping::AudioMapping (int c)
 -      : _source_channels (c)
 -{
 -
 -}
 -
 -optional<libdcp::Channel>
 -AudioMapping::source_to_dcp (int c) const
 -{
 -      if (c >= _source_channels) {
 -              return optional<libdcp::Channel> ();
 -      }
 -
 -      if (_source_channels == 1) {
 -              /* mono sources to centre */
 -              return libdcp::CENTRE;
 -      }
 -      
 -      return static_cast<libdcp::Channel> (c);
 -}
 -
 -optional<int>
 -AudioMapping::dcp_to_source (libdcp::Channel c) const
 -{
 -      if (_source_channels == 1) {
 -              if (c == libdcp::CENTRE) {
 -                      return 0;
 -              } else {
 -                      return optional<int> ();
 -              }
 -      }
 -
 -      if (static_cast<int> (c) >= _source_channels) {
 -              return optional<int> ();
 -      }
 -      
 -      return static_cast<int> (c);
 -}
 -
 -int
 -AudioMapping::dcp_channels () const
 -{
 -      if (_source_channels == 1) {
 -              /* The source is mono, so to put the mono channel into
 -                 the centre we need to generate a 5.1 soundtrack.
 -              */
 -              return 6;
 -      }
 -
 -      return _source_channels;
 -}
 -
  FrameRateConversion::FrameRateConversion (float source, int dcp)
        : skip (false)
        , repeat (false)
@@@ -775,8 -1076,8 +797,8 @@@ LocaleGuard::LocaleGuard (
  
          if (old) {
                  _old = strdup (old);
-                 if (strcmp (_old, "POSIX")) {
-                         setlocale (LC_NUMERIC, "POSIX");
+                 if (strcmp (_old, "C")) {
+                         setlocale (LC_NUMERIC, "C");
                  }
          }
  }
diff --combined src/lib/wscript
index 0d9da3a8f9aac503d20cb508a07779ffc0656e72,253a496d1ae1caa07fb0ea02b613385b7fec23c8..d8cc8261d386bf0f06482b0bd71082312f22762b
@@@ -6,53 -6,48 +6,53 @@@ sources = ""
          ab_transcoder.cc
            analyse_audio_job.cc
            audio_analysis.cc
 +          audio_buffers.cc
 +          audio_content.cc
            audio_decoder.cc
 +          audio_mapping.cc
            audio_source.cc
            config.cc
            combiner.cc
 +          content.cc
            cross.cc
            dci_metadata.cc
            dcp_content_type.cc
            dcp_video_frame.cc
            decoder.cc
 -          decoder_factory.cc
 -          delay_line.cc
            dolby_cp750.cc
            encoder.cc
            examine_content_job.cc
            exceptions.cc
            filter_graph.cc
            ffmpeg_compatibility.cc
 +          ffmpeg_content.cc
            ffmpeg_decoder.cc
            film.cc
            filter.cc
            format.cc
 -          gain.cc
            image.cc
 +          imagemagick_content.cc
            imagemagick_decoder.cc
            job.cc
            job_manager.cc
            log.cc
            lut.cc
 -          matcher.cc
 +          player.cc
 +          playlist.cc
            scp_dcp_job.cc
            scaler.cc
            server.cc
 +          sndfile_content.cc
            sndfile_decoder.cc
            sound_processor.cc
 -          stream.cc
            subtitle.cc
            timer.cc
            transcode_job.cc
            transcoder.cc
 -          trimmer.cc
 +          types.cc
            ui_signaller.cc
            util.cc
 +          video_content.cc
            video_decoder.cc
            video_source.cc
            writer.cc
@@@ -64,24 -59,26 +64,28 @@@ def build(bld)
      else:
          obj = bld(features = 'cxx cxxshlib')
  
 -    obj.name = 'libdvdomatic'
 +    obj.name = 'libdcpomatic'
      obj.export_includes = ['.']
      obj.uselib = """
                   AVCODEC AVUTIL AVFORMAT AVFILTER SWSCALE SWRESAMPLE 
                   BOOST_FILESYSTEM BOOST_THREAD BOOST_DATETIME BOOST_SIGNALS2 
 -                 SNDFILE OPENJPEG POSTPROC TIFF MAGICK SSH DCP GLIB LZMA
 +                 SNDFILE OPENJPEG POSTPROC TIFF MAGICK SSH DCP CXML GLIB LZMA
                   """
+     obj.source = sources + ' version.cc'
      if bld.env.TARGET_WINDOWS:
-         obj.uselib += ' WINSOCK2'
+         obj.uselib += ' WINSOCK2 BFD DBGHELP IBERTY'
+         obj.source += ' stack.cpp'
 +    if bld.env.STATIC:
 +        obj.uselib += ' XML++'
 +    obj.source = sources + " version.cc"
 +    obj.target = 'dcpomatic'
  
 -    obj.target = 'dvdomatic'
 -
 -    i18n.po_to_mo(os.path.join('src', 'lib'), 'libdvdomatic', bld)
 +    i18n.po_to_mo(os.path.join('src', 'lib'), 'libdcpomatic', bld)
  
  def pot(bld):
 -    i18n.pot(os.path.join('src', 'lib'), sources, 'libdvdomatic')
 +    i18n.pot(os.path.join('src', 'lib'), sources, 'libdcpomatic')
  
  def pot_merge(bld):
 -    i18n.pot_merge(os.path.join('src', 'lib'), 'libdvdomatic')
 +    i18n.pot_merge(os.path.join('src', 'lib'), 'libdcpomatic')
diff --combined src/tools/po/es_ES.po
index 346aa2b39d1ea2137cba34740f9980c82698e01e,30f568c987481381d0c44d322a3551d0ddf7e871..b64478334198f7dbd052c0a50ef96fad1416c86d
@@@ -5,9 -5,9 +5,9 @@@
  #
  msgid ""
  msgstr ""
 -"Project-Id-Version: DVDOMATIC\n"
 +"Project-Id-Version: DCPOMATIC\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2013-04-22 15:06+0100\n"
+ "POT-Creation-Date: 2013-05-09 09:51+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"
  "Content-Transfer-Encoding: 8bit\n"
  "X-Generator: Poedit 1.5.5\n"
  
- #: src/tools/dcpomatic.cc:177
+ #: src/tools/dvdomatic.cc:178
  msgid "&Analyse audio"
  msgstr "&Analizar audio"
  
- #: src/tools/dcpomatic.cc:183
+ #: src/tools/dvdomatic.cc:184
  msgid "&Edit"
  msgstr "&Editar"
  
- #: src/tools/dcpomatic.cc:182
+ #: src/tools/dvdomatic.cc:183
  msgid "&File"
  msgstr "&Archivo"
  
- #: src/tools/dcpomatic.cc:185
+ #: src/tools/dvdomatic.cc:186
  msgid "&Help"
  msgstr "&Ayuda"
  
- #: src/tools/dcpomatic.cc:184
+ #: src/tools/dvdomatic.cc:185
  msgid "&Jobs"
  msgstr "&Tareas"
  
- #: src/tools/dcpomatic.cc:173
+ #: src/tools/dvdomatic.cc:174
  msgid "&Make DCP"
  msgstr "&Crear DCP"
  
- #: src/tools/dcpomatic.cc:161
+ #: src/tools/dvdomatic.cc:162
  msgid "&Open..."
  msgstr "&Abrir..."
  
- #: src/tools/dcpomatic.cc:170
+ #: src/tools/dvdomatic.cc:171
  msgid "&Preferences..."
  msgstr "&Preferencias..."
  
- #: src/tools/dcpomatic.cc:165
+ #: src/tools/dvdomatic.cc:166
  msgid "&Properties..."
  msgstr "&Propiedades..."
  
- #: src/tools/dcpomatic.cc:167
+ #: src/tools/dvdomatic.cc:168
  msgid "&Quit"
  msgstr "&Salir"
  
- #: src/tools/dcpomatic.cc:163
+ #: src/tools/dvdomatic.cc:164
  msgid "&Save"
  msgstr "&Guardar"
  
- #: src/tools/dcpomatic.cc:174
+ #: src/tools/dvdomatic.cc:175
  msgid "&Send DCP to TMS"
  msgstr "&Enviar DCP al TMS"
  
- #: src/tools/dcpomatic.cc:417
+ #: src/tools/dvdomatic.cc:426
  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/dcpomatic.cc:180
+ #: src/tools/dvdomatic.cc:181
  msgid "About"
  msgstr "Acerca de"
  
- #: src/tools/dcpomatic.cc:527
+ #: src/tools/dvdomatic.cc:502
  #, fuzzy
  msgid "Could not load film %1 (%2)"
  msgstr "No se pudo cargar la película %s (%s)"
  
- #: src/tools/dcpomatic.cc:339
+ #: src/tools/dvdomatic.cc:348
  #, c-format
  msgid "Could not open film at %s (%s)"
  msgstr "No se pudo cargar la película en %s (%s)"
  
++<<<<<<< HEAD
 +#: src/tools/dcpomatic.cc:287 src/tools/dcpomatic.cc:410
 +#: src/tools/dcpomatic.cc:531
 +msgid "DCP-o-matic"
 +msgstr "DCP-o-matic"
 +
 +#: src/tools/dcpomatic.cc:75
 +msgid "Film changed"
 +msgstr "Película cambiada"
 +
 +#: src/tools/dcpomatic.cc:416
+ #: src/tools/dvdomatic.cc:288 src/tools/dvdomatic.cc:419
+ #: src/tools/dvdomatic.cc:506
+ msgid "DVD-o-matic"
+ msgstr "DVD-o-matic"
+ #: src/tools/dvdomatic.cc:76
+ msgid "Film changed"
+ msgstr "Película cambiada"
+ #: src/tools/dvdomatic.cc:425
  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/dcpomatic.cc:160
+ #: src/tools/dvdomatic.cc:161
  msgid "New..."
  msgstr "Nuevo..."
  
- #: src/tools/dcpomatic.cc:175
+ #: src/tools/dvdomatic.cc:176
  msgid "S&how DCP"
  msgstr "&Mostrar DCP"
  
- #: src/tools/dcpomatic.cc:74
+ #: src/tools/dvdomatic.cc:75
+ #, c-format
  msgid "Save changes to film \"%s\" before closing?"
  msgstr ""
  
- #: src/tools/dcpomatic.cc:319
+ #: src/tools/dvdomatic.cc:328
  msgid "Select film to open"
  msgstr "Selecciona la película a abrir"
  
- #: src/tools/dcpomatic.cc:303
- #, fuzzy
- msgid "The directory %1 already exists."
- msgstr "La carpeta %s ya existe."
+ #: src/tools/dvdomatic.cc:307
+ msgid ""
+ "The directory %1 already exists and is not empty.  Are you sure you want to "
+ "use it?"
+ msgstr ""
  
- #: src/tools/dcpomatic.cc:324
+ #: src/tools/dvdomatic.cc:333
  msgid ""
  "You did not select a folder.  Make sure that you select a folder before "
  "clicking Open."
  msgstr ""
+ #, fuzzy
+ #~ msgid "The directory %1 already exists."
+ #~ msgstr "La carpeta %s ya existe."
diff --combined src/tools/po/fr_FR.po
index 8ce305ccf8b66073c27892d6d64ff5da41001be4,6b8f1e783f5a9e192082b31afa987feae3d86e11..a2c91e65ee19d8cfcd1cf041df65a8d6d9b66ab6
@@@ -5,10 -5,10 +5,10 @@@
  #
  msgid ""
  msgstr ""
 -"Project-Id-Version: DVD-o-matic FRENCH\n"
 +"Project-Id-Version: DCP-o-matic FRENCH\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2013-04-22 15:06+0100\n"
- "PO-Revision-Date: 2013-03-13 22:33+0100\n"
+ "POT-Creation-Date: 2013-05-09 09:51+0100\n"
+ "PO-Revision-Date: 2013-05-10 14:09+0100\n"
  "Last-Translator: \n"
  "Language-Team: \n"
  "Language: \n"
  "Content-Type: text/plain; charset=UTF-8\n"
  "Content-Transfer-Encoding: 8bit\n"
  
- #: src/tools/dcpomatic.cc:177
+ #: src/tools/dvdomatic.cc:178
  msgid "&Analyse audio"
  msgstr "&Analyser le son"
  
- #: src/tools/dcpomatic.cc:183
+ #: src/tools/dvdomatic.cc:184
  msgid "&Edit"
  msgstr "&Edition"
  
- #: src/tools/dcpomatic.cc:182
+ #: src/tools/dvdomatic.cc:183
  msgid "&File"
  msgstr "&Fichier"
  
- #: src/tools/dcpomatic.cc:185
+ #: src/tools/dvdomatic.cc:186
  msgid "&Help"
  msgstr "&Aide"
  
- #: src/tools/dcpomatic.cc:184
+ #: src/tools/dvdomatic.cc:185
  msgid "&Jobs"
  msgstr "&Travaux"
  
- #: src/tools/dcpomatic.cc:173
+ #: src/tools/dvdomatic.cc:174
  msgid "&Make DCP"
  msgstr "&Créer le DCP"
  
- #: src/tools/dcpomatic.cc:161
+ #: src/tools/dvdomatic.cc:162
  msgid "&Open..."
  msgstr "&Ouvrir..."
  
- #: src/tools/dcpomatic.cc:170
+ #: src/tools/dvdomatic.cc:171
  msgid "&Preferences..."
  msgstr "&Préférences..."
  
- #: src/tools/dcpomatic.cc:165
+ #: src/tools/dvdomatic.cc:166
  msgid "&Properties..."
  msgstr "&Propriétés..."
  
- #: src/tools/dcpomatic.cc:167
+ #: src/tools/dvdomatic.cc:168
  msgid "&Quit"
  msgstr "&Quitter"
  
- #: src/tools/dcpomatic.cc:163
+ #: src/tools/dvdomatic.cc:164
  msgid "&Save"
  msgstr "&Enregistrer"
  
- #: src/tools/dcpomatic.cc:174
+ #: src/tools/dvdomatic.cc:175
  msgid "&Send DCP to TMS"
  msgstr "&Envoyer le DCP dans le TMS"
  
- #: src/tools/dcpomatic.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:426
+ 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/dcpomatic.cc:180
+ #: src/tools/dvdomatic.cc:181
  msgid "About"
  msgstr "A Propos"
  
- #: src/tools/dcpomatic.cc:527
+ #: src/tools/dvdomatic.cc:502
  #, fuzzy
  msgid "Could not load film %1 (%2)"
  msgstr "Impossible de charger le film %s (%s)"
  
- #: src/tools/dcpomatic.cc:339
+ #: src/tools/dvdomatic.cc:348
  #, c-format
  msgid "Could not open film at %s (%s)"
  msgstr "Impossible d'ouvrir le film à %s (%s)"
  
- #: src/tools/dcpomatic.cc:287 src/tools/dcpomatic.cc:410
- #: src/tools/dcpomatic.cc:531
- msgid "DCP-o-matic"
- msgstr "DCP-o-matic"
+ #: src/tools/dvdomatic.cc:288
+ #: src/tools/dvdomatic.cc:419
+ #: src/tools/dvdomatic.cc:506
+ msgid "DVD-o-matic"
+ msgstr "DVD-o-matic"
  
- #: src/tools/dcpomatic.cc:75
+ #: src/tools/dvdomatic.cc:76
  msgid "Film changed"
  msgstr "Film changé"
  
- #: src/tools/dcpomatic.cc:416
+ #: src/tools/dvdomatic.cc:425
  msgid "Free, open-source DCP generation from almost anything."
  msgstr "Création de DCP libre et open-source à partir de presque tout."
  
- #: src/tools/dcpomatic.cc:160
+ #: src/tools/dvdomatic.cc:161
  msgid "New..."
  msgstr "Nouveau..."
  
- #: src/tools/dcpomatic.cc:175
+ #: src/tools/dvdomatic.cc:176
  msgid "S&how DCP"
  msgstr "Voir le DCP"
  
- #: src/tools/dcpomatic.cc:74
+ #: src/tools/dvdomatic.cc:75
+ #, c-format
  msgid "Save changes to film \"%s\" before closing?"
- msgstr ""
+ msgstr "Enregistrer les changements du film \"%s\" avant de fermer ?"
  
- #: src/tools/dcpomatic.cc:319
+ #: src/tools/dvdomatic.cc:328
  msgid "Select film to open"
  msgstr "Sélectionner le film à ouvrir"
  
- #: src/tools/dcpomatic.cc:303
- #, fuzzy
- msgid "The directory %1 already exists."
- msgstr "Le dossier %s existe déjà."
+ #: src/tools/dvdomatic.cc:307
+ msgid "The directory %1 already exists and is not empty.  Are you sure you want to use it?"
+ msgstr "Le dossier %1 existe et n'est pas vide. Etes-vous sûr de vouloir l'utiliser ?"
  
- #: src/tools/dcpomatic.cc:324
- msgid ""
- "You did not select a folder.  Make sure that you select a folder before "
- "clicking Open."
- msgstr ""
+ #: src/tools/dvdomatic.cc:333
+ msgid "You did not select a folder.  Make sure that you select a folder before clicking Open."
+ msgstr "Aucun dossier sélectionné. Selectionnez un dossier avant de cliquer sur Ouvrir"
+ #, fuzzy
+ #~ msgid "The directory %1 already exists."
+ #~ msgstr "Le dossier %s existe déjà."
diff --combined src/tools/po/sv_SE.po
index 69706d6479563932ca4cf325de84f006cbe85de5,7e88f84b1c974a6e9843117600fd547d652f19ba..6507bb69cd688f32da0dc5a554dc6856ced4152e
@@@ -5,9 -5,9 +5,9 @@@
  #
  msgid ""
  msgstr ""
 -"Project-Id-Version: DVD-o-matic\n"
 +"Project-Id-Version: DCP-o-matic\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2013-04-22 15:06+0100\n"
+ "POT-Creation-Date: 2013-05-09 09:51+0100\n"
  "PO-Revision-Date: 2013-04-09 10:12+0100\n"
  "Last-Translator: Adam Klotblixt <adam.klotblixt@gmail.com>\n"
  "Language-Team: \n"
  "Content-Transfer-Encoding: 8bit\n"
  "X-Generator: Poedit 1.5.5\n"
  
- #: src/tools/dcpomatic.cc:177
+ #: src/tools/dvdomatic.cc:178
  msgid "&Analyse audio"
  msgstr "&Analysera audio"
  
- #: src/tools/dcpomatic.cc:183
+ #: src/tools/dvdomatic.cc:184
  msgid "&Edit"
  msgstr "&Redigera"
  
- #: src/tools/dcpomatic.cc:182
+ #: src/tools/dvdomatic.cc:183
  msgid "&File"
  msgstr "&Fil"
  
- #: src/tools/dcpomatic.cc:185
+ #: src/tools/dvdomatic.cc:186
  msgid "&Help"
  msgstr "&Hjälp"
  
- #: src/tools/dcpomatic.cc:184
+ #: src/tools/dvdomatic.cc:185
  msgid "&Jobs"
  msgstr "&Jobb"
  
- #: src/tools/dcpomatic.cc:173
+ #: src/tools/dvdomatic.cc:174
  msgid "&Make DCP"
  msgstr "&Skapa DCP"
  
- #: src/tools/dcpomatic.cc:161
+ #: src/tools/dvdomatic.cc:162
  msgid "&Open..."
  msgstr "&Öppna"
  
- #: src/tools/dcpomatic.cc:170
+ #: src/tools/dvdomatic.cc:171
  msgid "&Preferences..."
  msgstr "&Inställningar"
  
- #: src/tools/dcpomatic.cc:165
+ #: src/tools/dvdomatic.cc:166
  msgid "&Properties..."
  msgstr "&Egenskaper"
  
- #: src/tools/dcpomatic.cc:167
+ #: src/tools/dvdomatic.cc:168
  msgid "&Quit"
  msgstr "&Avsluta"
  
- #: src/tools/dcpomatic.cc:163
+ #: src/tools/dvdomatic.cc:164
  msgid "&Save"
  msgstr "&Spara"
  
- #: src/tools/dcpomatic.cc:174
+ #: src/tools/dvdomatic.cc:175
  msgid "&Send DCP to TMS"
  msgstr "&Skicka DCP till TMS"
  
- #: src/tools/dcpomatic.cc:417
+ #: src/tools/dvdomatic.cc:426
  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/dcpomatic.cc:180
+ #: src/tools/dvdomatic.cc:181
  msgid "About"
  msgstr "Om"
  
- #: src/tools/dcpomatic.cc:527
+ #: src/tools/dvdomatic.cc:502
  msgid "Could not load film %1 (%2)"
  msgstr "Kunde inte öppna filmen %1 (%2)"
  
- #: src/tools/dcpomatic.cc:339
+ #: src/tools/dvdomatic.cc:348
  #, c-format
  msgid "Could not open film at %s (%s)"
  msgstr "Kunde inte öppna filmen vid %s (%s)"
  
- #: src/tools/dcpomatic.cc:287 src/tools/dcpomatic.cc:410
- #: src/tools/dcpomatic.cc:531
+ #: src/tools/dvdomatic.cc:288 src/tools/dvdomatic.cc:419
+ #: src/tools/dvdomatic.cc:506
 -msgid "DVD-o-matic"
 -msgstr "DVD-o-matic"
 +msgid "DCP-o-matic"
 +msgstr "DCP-o-matic"
  
- #: src/tools/dcpomatic.cc:75
+ #: src/tools/dvdomatic.cc:76
  msgid "Film changed"
  msgstr "Film ändrad"
  
- #: src/tools/dcpomatic.cc:416
+ #: src/tools/dvdomatic.cc:425
  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/dcpomatic.cc:160
+ #: src/tools/dvdomatic.cc:161
  msgid "New..."
  msgstr "Ny..."
  
- #: src/tools/dcpomatic.cc:175
+ #: src/tools/dvdomatic.cc:176
  msgid "S&how DCP"
  msgstr "&Visa DCP"
  
- #: src/tools/dcpomatic.cc:74
+ #: src/tools/dvdomatic.cc:75
+ #, fuzzy, c-format
  msgid "Save changes to film \"%s\" before closing?"
 -msgstr "Spara ändringarna till filmen \"%1\" före avslut?"
 +msgstr "Spara ändringarna till filmen \"%s\" före avslut?"
  
- #: src/tools/dcpomatic.cc:319
+ #: src/tools/dvdomatic.cc:328
  msgid "Select film to open"
  msgstr "Välj film att öppna"
  
- #: src/tools/dcpomatic.cc:303
- msgid "The directory %1 already exists."
- msgstr "Katalogen %1 finns redan."
+ #: src/tools/dvdomatic.cc:307
+ msgid ""
+ "The directory %1 already exists and is not empty.  Are you sure you want to "
+ "use it?"
+ msgstr ""
  
- #: src/tools/dcpomatic.cc:324
+ #: src/tools/dvdomatic.cc:333
  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."
+ #~ msgid "The directory %1 already exists."
+ #~ msgstr "Katalogen %1 finns redan."
diff --combined src/wx/po/es_ES.po
index a193325e6c09ad55d08e2602b90ff4a875d114a2,efc8436c553f3d87860c1224f3e0e27f78fe6c7d..bf5dce4b08e69d60c72de97ce20b4bde28d3b98a
@@@ -5,9 -5,9 +5,9 @@@
  #
  msgid ""
  msgstr ""
 -"Project-Id-Version: libdvdomatic-wx\n"
 +"Project-Id-Version: libdcpomatic-wx\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2013-04-22 15:06+0100\n"
+ "POT-Creation-Date: 2013-05-09 09:51+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"
@@@ -21,7 -21,7 +21,6 @@@
  msgid "%"
  msgstr "%"
  
- #: src/wx/config_dialog.cc:61
 -#: src/wx/config_dialog.cc:98
  msgid "(restart DCP-o-matic to see language changes)"
  msgstr ""
  
@@@ -33,7 -33,11 +32,11 @@@ msgstr "1 canal
  msgid "A/B"
  msgstr "A/B"
  
- #: src/wx/config_dialog.cc:143
+ #: src/wx/config_dialog.cc:61
+ msgid "A/B mode"
+ msgstr ""
+ #: src/wx/config_dialog.cc:325
  msgid "Add"
  msgstr "Añadir"
  
@@@ -79,7 -83,7 +82,7 @@@ msgstr "pero tengo que usar el fader a
  msgid "Calculate..."
  msgstr "Calcular..."
  
- #: src/wx/job_manager_view.cc:88
+ #: src/wx/job_manager_view.cc:97
  msgid "Cancel"
  msgstr ""
  
@@@ -123,6 -127,11 +126,11 @@@ msgstr "No se pudo establecer el conten
  msgid "Create in folder"
  msgstr "Crear en carpeta"
  
+ #: src/wx/config_dialog.cc:244
+ #, fuzzy
+ msgid "Creator"
+ msgstr "Crear en carpeta"
  #: src/wx/film_editor.cc:1371
  #, c-format
  msgid "Cropped to %dx%d (%.2f:1)\n"
@@@ -140,28 -149,38 +148,37 @@@ msgstr "Velocidad DCP
  msgid "DCP Name"
  msgstr "Nombre DCP"
  
 -#: src/wx/config_dialog.cc:46
 -#, fuzzy
 -msgid "DCP-o-matic Preferences"
 -msgstr "Preferencias DVD-o-matic"
 +#: src/wx/wx_util.cc:61
 +msgid "DCP-o-matic"
 +msgstr "DCP-o-matic"
  
 -#: src/wx/wx_util.cc:63 src/wx/wx_util.cc:71
 -msgid "DVD-o-matic"
 -msgstr "DVD-o-matic"
 +#: src/wx/config_dialog.cc:44
 +msgid "DCP-o-matic Preferences"
 +msgstr "Preferencias DCP-o-matic"
  
  #: src/wx/audio_dialog.cc:101
  #, fuzzy, c-format
 -msgid "DVD-o-matic audio - %s"
 -msgstr "Audio DVD-o-matic - %1"
 +msgid "DCP-o-matic audio - %s"
 +msgstr "Audio DCP-o-matic - %1"
  
- #: src/wx/config_dialog.cc:102
+ #: src/wx/config_dialog.cc:120
  msgid "Default DCI name details"
  msgstr "Detalles por defecto del nombre DCI"
  
- #: src/wx/config_dialog.cc:93
+ #: src/wx/config_dialog.cc:130
+ #, fuzzy
+ msgid "Default content type"
+ msgstr "Tipo de contenido"
+ #: src/wx/config_dialog.cc:111
  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
+ #: src/wx/config_dialog.cc:125
+ msgid "Default format"
+ msgstr ""
+ #: src/wx/film_editor.cc:116 src/wx/job_manager_view.cc:109
  msgid "Details..."
  msgstr "Detalles..."
  
@@@ -173,17 -192,18 +190,18 @@@ msgstr "Espacio requerido en disco
  msgid "Duration"
  msgstr "Duración"
  
- #: src/wx/config_dialog.cc:145
+ #: src/wx/config_dialog.cc:327
  msgid "Edit"
  msgstr "Editar"
  
- #: src/wx/config_dialog.cc:103 src/wx/config_dialog.cc:122
+ #: src/wx/config_dialog.cc:121 src/wx/config_dialog.cc:282
  #: src/wx/film_editor.cc:312
  msgid "Edit..."
  msgstr "Editar..."
  
- #: src/wx/config_dialog.cc:128
- msgid "Encoding Servers"
+ #: src/wx/config_dialog.cc:55
+ #, fuzzy
+ msgid "Encoding servers"
  msgstr "Servidores de codificación"
  
  #: src/wx/film_editor.cc:171
@@@ -242,10 -262,14 +260,14 @@@ msgstr "Hz
  msgid "I want to play this back at fader"
  msgstr "Quiero reproducir con el fader a"
  
- #: src/wx/config_dialog.cc:132
+ #: src/wx/config_dialog.cc:201 src/wx/config_dialog.cc:314
  msgid "IP address"
  msgstr "Dirección IP"
  
+ #: src/wx/config_dialog.cc:240
+ msgid "Issuer"
+ msgstr ""
  #: src/wx/film_editor.cc:339
  msgid "JPEG2000 bandwidth"
  msgstr "Ancho de banda JPEG2000"
@@@ -262,6 -286,14 +284,14 @@@ msgstr "Longitud
  msgid "MBps"
  msgstr "MBps"
  
+ #: src/wx/config_dialog.cc:57
+ msgid "Metadata"
+ msgstr ""
+ #: src/wx/config_dialog.cc:53
+ msgid "Miscellaneous"
+ msgstr ""
  #: src/wx/dir_picker_ctrl.cc:52
  msgid "My Documents"
  msgstr "Mis documentos"
@@@ -296,6 -328,15 +326,15 @@@ msgstr "Tipo de paquete (ej. OV)
  msgid "Padded with black to %dx%d (%.2f:1)\n"
  msgstr ""
  
+ #: src/wx/config_dialog.cc:213
+ #, fuzzy
+ msgid "Password"
+ msgstr "Clave del TMS"
+ #: src/wx/job_manager_view.cc:103 src/wx/job_manager_view.cc:188
+ msgid "Pause"
+ msgstr ""
  #: src/wx/audio_dialog.cc:60
  msgid "Peak"
  msgstr "Pico"
@@@ -316,23 -357,29 +355,29 @@@ msgstr "RMS
  msgid "Rating (e.g. 15)"
  msgstr "Clasificación (ej. 16)"
  
- #: src/wx/config_dialog.cc:118
- msgid "Reference filters for A/B"
+ #: src/wx/config_dialog.cc:278
+ #, fuzzy
+ msgid "Reference filters"
  msgstr "Filtros de referencia para A/B"
  
- #: src/wx/config_dialog.cc:107
- msgid "Reference scaler for A/B"
+ #: src/wx/config_dialog.cc:267
+ #, fuzzy
+ msgid "Reference scaler"
  msgstr "Escalador de referencia para A/B"
  
- #: src/wx/config_dialog.cc:147
+ #: src/wx/config_dialog.cc:329
  msgid "Remove"
  msgstr "Quitar"
  
+ #: src/wx/job_manager_view.cc:191
+ msgid "Resume"
+ msgstr ""
  #: src/wx/film_editor.cc:282
  msgid "Right crop"
  msgstr "Recorte derecha"
  
- #: src/wx/job_manager_view.cc:108
+ #: src/wx/job_manager_view.cc:126
  msgid "Running"
  msgstr "Ejecutando"
  
@@@ -357,7 -404,7 +402,7 @@@ msgstr "Seleccionar fichero de contenid
  msgid "Server"
  msgstr "Servidor"
  
- #: src/wx/config_dialog.cc:49
+ #: src/wx/config_dialog.cc:87
  msgid "Set language"
  msgstr ""
  
@@@ -393,27 -440,21 +438,21 @@@ msgstr "Escala del subtítulo
  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:59
+ #, fuzzy
+ msgid "TMS"
+ msgstr "RMS"
  
- #: src/wx/config_dialog.cc:73
- msgid "TMS target path"
+ #: src/wx/config_dialog.cc:205
+ #, fuzzy
+ msgid "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
+ #: src/wx/config_dialog.cc:318
  msgid "Threads"
  msgstr "Hilos"
  
  msgid "Threads to use"
  msgstr "Hilos a utilizar"
  
- #: src/wx/config_dialog.cc:88
+ #: src/wx/config_dialog.cc:106
  msgid "Threads to use for encoding on this host"
  msgstr "Hilos a utilizar para la codificación en esta máquina"
  
@@@ -466,6 -507,11 +505,11 @@@ msgstr "Usar el audio del contenido
  msgid "Use external audio"
  msgstr "Usar audio externo"
  
+ #: src/wx/config_dialog.cc:209
+ #, fuzzy
+ msgid "User name"
+ msgstr "Usar el nombre DCI"
  #: src/wx/film_editor.cc:75
  msgid "Video"
  msgstr "Vídeo"
@@@ -516,5 -562,11 +560,11 @@@ msgstr "s
  msgid "unknown"
  msgstr "desconocido"
  
+ #~ msgid "TMS IP address"
+ #~ msgstr "Dirección IP del TMS"
+ #~ msgid "TMS user name"
+ #~ msgstr "Usuario del TMS"
  #~ msgid "Original Size"
  #~ msgstr "Tamaño original"
diff --combined src/wx/po/fr_FR.po
index 36ae4a9252727678ed8e53a57c20177d451764c1,ad138d45a1ce2fb9f2044fb617f01b48dde2a83e..aee97956f49d728a69ad4f242694f2e33e994e64
@@@ -5,11 -5,11 +5,11 @@@
  #
  msgid ""
  msgstr ""
 -"Project-Id-Version: DVD-o-matic FRENCH\n"
 +"Project-Id-Version: DCP-o-matic FRENCH\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2013-04-22 15:06+0100\n"
- "PO-Revision-Date: 2013-03-20 00:34+0100\n"
- "Last-Translator: FreeDCP.net <freedcp.net@gmail.com>\n"
+ "POT-Creation-Date: 2013-05-09 09:51+0100\n"
+ "PO-Revision-Date: 2013-05-10 14:19+0100\n"
+ "Last-Translator: \n"
  "Language-Team: \n"
  "Language: \n"
  "MIME-Version: 1.0\n"
@@@ -20,9 -20,9 +20,9 @@@
  msgid "%"
  msgstr "%"
  
- #: src/wx/config_dialog.cc:61
+ #: src/wx/config_dialog.cc:98
  msgid "(restart DCP-o-matic to see language changes)"
- msgstr ""
+ msgstr "(redémarrez DCP-o-matic pour voir les changements de langue)"
  
  #: src/wx/film_editor.cc:1276
  msgid "1 channel"
@@@ -32,11 -32,16 +32,16 @@@ msgstr "1 canal
  msgid "A/B"
  msgstr "A/B"
  
- #: src/wx/config_dialog.cc:143
+ #: src/wx/config_dialog.cc:61
+ msgid "A/B mode"
+ msgstr "A/B mode"
+ #: src/wx/config_dialog.cc:325
  msgid "Add"
  msgstr "Ajouter"
  
- #: src/wx/audio_dialog.cc:32 src/wx/film_editor.cc:77
+ #: src/wx/audio_dialog.cc:32
+ #: src/wx/film_editor.cc:77
  msgid "Audio"
  msgstr "Audio"
  
@@@ -55,7 -60,7 +60,7 @@@ msgstr "Langue audio (ex. FR)
  #: src/wx/film_editor.cc:824
  #, c-format
  msgid "Audio will be resampled from %dHz to %dHz\n"
- msgstr ""
+ msgstr "L'audio sera rééchantillonné de %dHz à %dHz\n"
  
  #: src/wx/job_wrapper.cc:38
  #, c-format
@@@ -78,7 -83,7 +83,7 @@@ msgstr "Je souhaite utiliser ce volume
  msgid "Calculate..."
  msgstr "Calcul..."
  
- #: src/wx/job_manager_view.cc:88
+ #: src/wx/job_manager_view.cc:97
  msgid "Cancel"
  msgstr "Annuler"
  
@@@ -122,10 -127,14 +127,14 @@@ msgstr "Sélectionner du contenu imposs
  msgid "Create in folder"
  msgstr "Créer dans le dossier"
  
+ #: src/wx/config_dialog.cc:244
+ msgid "Creator"
+ msgstr "Créateur"
  #: src/wx/film_editor.cc:1371
  #, c-format
  msgid "Cropped to %dx%d (%.2f:1)\n"
- msgstr ""
+ msgstr "Découpe de %dx%d (%.2f:1)\n"
  
  #: src/wx/dci_metadata_dialog.cc:28
  msgid "DCI name"
@@@ -139,28 -148,38 +148,37 @@@ msgstr "Cadence image du DCP
  msgid "DCP Name"
  msgstr "Nom du DCP"
  
 -#: src/wx/config_dialog.cc:46
 -msgid "DCP-o-matic Preferences"
 -msgstr "Préférences de DCP-o-matic"
 +#: src/wx/wx_util.cc:61
 +msgid "DCP-o-matic"
 +msgstr "DCP-o-matic"
  
 -#: src/wx/wx_util.cc:63
 -#: src/wx/wx_util.cc:71
 -msgid "DVD-o-matic"
 -msgstr "DVD-o-matic"
 +#: src/wx/config_dialog.cc:44
 +msgid "DCP-o-matic Preferences"
 +msgstr "Préférences DCP-o-matic"
  
  #: src/wx/audio_dialog.cc:101
  #, c-format
 -msgid "DVD-o-matic audio - %s"
 -msgstr "Son DVD-o-matic  - %s"
 +msgid "DCP-o-matic audio - %s"
 +msgstr "Son DCP-o-matic  - %s"
  
- #: src/wx/config_dialog.cc:102
+ #: src/wx/config_dialog.cc:120
  msgid "Default DCI name details"
  msgstr "Détails du nom DCI par défaut"
  
- #: src/wx/config_dialog.cc:93
+ #: src/wx/config_dialog.cc:130
+ msgid "Default content type"
+ msgstr "Type de contenu par défaut"
+ #: src/wx/config_dialog.cc:111
  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
+ #: src/wx/config_dialog.cc:125
+ msgid "Default format"
+ msgstr "Format par défaut"
+ #: src/wx/film_editor.cc:116
+ #: src/wx/job_manager_view.cc:109
  msgid "Details..."
  msgstr "Détails..."
  
@@@ -172,17 -191,19 +190,19 @@@ msgstr "Espace disque requis
  msgid "Duration"
  msgstr "Durée"
  
- #: src/wx/config_dialog.cc:145
+ #: src/wx/config_dialog.cc:327
  msgid "Edit"
  msgstr "Édition"
  
- #: src/wx/config_dialog.cc:103 src/wx/config_dialog.cc:122
+ #: src/wx/config_dialog.cc:121
+ #: src/wx/config_dialog.cc:282
  #: src/wx/film_editor.cc:312
  msgid "Edit..."
  msgstr "Éditer..."
  
- #: src/wx/config_dialog.cc:128
- msgid "Encoding Servers"
+ #: src/wx/config_dialog.cc:55
+ #, fuzzy
+ msgid "Encoding servers"
  msgstr "Serveurs d'encodage"
  
  #: src/wx/film_editor.cc:171
@@@ -205,7 -226,8 +225,8 @@@ msgstr "Propriétés du film
  msgid "Film name"
  msgstr "Nom du Film"
  
- #: src/wx/film_editor.cc:307 src/wx/filter_dialog.cc:32
+ #: src/wx/film_editor.cc:307
+ #: src/wx/filter_dialog.cc:32
  msgid "Filters"
  msgstr "Filtres"
  
@@@ -241,10 -263,15 +262,15 @@@ msgstr "Hz
  msgid "I want to play this back at fader"
  msgstr "Je veux le jouer à ce volume"
  
- #: src/wx/config_dialog.cc:132
+ #: src/wx/config_dialog.cc:201
+ #: src/wx/config_dialog.cc:314
  msgid "IP address"
  msgstr "Adresse IP"
  
+ #: src/wx/config_dialog.cc:240
+ msgid "Issuer"
+ msgstr "Emetteur"
  #: src/wx/film_editor.cc:339
  msgid "JPEG2000 bandwidth"
  msgstr "Qualité JPEG2000"
@@@ -261,6 -288,14 +287,14 @@@ msgstr "Longueur / durée
  msgid "MBps"
  msgstr "MBps"
  
+ #: src/wx/config_dialog.cc:57
+ msgid "Metadata"
+ msgstr "Métadonnées"
+ #: src/wx/config_dialog.cc:53
+ msgid "Miscellaneous"
+ msgstr "Divers"
  #: src/wx/dir_picker_ctrl.cc:52
  msgid "My Documents"
  msgstr "Mes Documents"
@@@ -273,7 -308,8 +307,8 @@@ msgstr "Nom
  msgid "New Film"
  msgstr "Nouveau Film"
  
- #: src/wx/film_editor.cc:309 src/wx/film_editor.cc:671
+ #: src/wx/film_editor.cc:309
+ #: src/wx/film_editor.cc:671
  msgid "None"
  msgstr "Aucun"
  
@@@ -284,7 -320,7 +319,7 @@@ msgstr "Cadence d'images originale
  #: src/wx/film_editor.cc:1360
  #, c-format
  msgid "Original video is %dx%d (%.2f:1)\n"
- msgstr ""
+ msgstr "La vidéo originale est %dx%d (%.2f:1)\n"
  
  #: src/wx/dci_metadata_dialog.cc:57
  msgid "Package Type (e.g. OV)"
@@@ -293,7 -329,16 +328,16 @@@ msgstr "Type de paquet (ex. OV)
  #: src/wx/film_editor.cc:1392
  #, c-format
  msgid "Padded with black to %dx%d (%.2f:1)\n"
- msgstr ""
+ msgstr "Enveloppe noire de %dx%d (%.2f:1)\n"
+ #: src/wx/config_dialog.cc:213
+ msgid "Password"
+ msgstr "Mot de passe"
+ #: src/wx/job_manager_view.cc:103
+ #: src/wx/job_manager_view.cc:188
+ msgid "Pause"
+ msgstr "Pause"
  
  #: src/wx/audio_dialog.cc:60
  msgid "Peak"
@@@ -315,30 -360,34 +359,34 @@@ msgstr "RMS
  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:278
+ msgid "Reference filters"
+ msgstr "Filtres de référence"
  
- #: 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:267
+ msgid "Reference scaler"
+ msgstr "Échelle de référence"
  
- #: src/wx/config_dialog.cc:147
+ #: src/wx/config_dialog.cc:329
  msgid "Remove"
  msgstr "Supprimer"
  
+ #: src/wx/job_manager_view.cc:191
+ msgid "Resume"
+ msgstr "Reprendre"
  #: src/wx/film_editor.cc:282
  msgid "Right crop"
  msgstr "Découpe droite"
  
- #: src/wx/job_manager_view.cc:108
+ #: src/wx/job_manager_view.cc:126
  msgid "Running"
  msgstr "Progression"
  
  #: src/wx/film_editor.cc:1384
  #, c-format
  msgid "Scaled to %dx%d (%.2f:1)\n"
- msgstr ""
+ msgstr "Mis à l'échelle de %dx%d (%.2f:1)\n"
  
  #: src/wx/film_editor.cc:319
  msgid "Scaler"
@@@ -356,9 -405,9 +404,9 @@@ msgstr "Sélectionner le fichier vidéo
  msgid "Server"
  msgstr "Serveur"
  
- #: src/wx/config_dialog.cc:49
+ #: src/wx/config_dialog.cc:87
  msgid "Set language"
- msgstr ""
+ msgstr "Selectionnez la langue"
  
  #: src/wx/film_editor.cc:368
  msgid "Show Audio..."
@@@ -392,27 -441,20 +440,20 @@@ msgstr "Taille du sous-titre
  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:59
+ #, fuzzy
+ msgid "TMS"
+ msgstr "RMS"
  
- #: src/wx/config_dialog.cc:78
- msgid "TMS user name"
- msgstr "Nom d'utilisateur du TMS"
+ #: src/wx/config_dialog.cc:205
+ msgid "Target path"
+ msgstr "Chemin d'accès"
  
  #: src/wx/dci_metadata_dialog.cc:41
  msgid "Territory (e.g. UK)"
  msgstr "Territoire (ex. FR)"
  
- #: src/wx/config_dialog.cc:136
+ #: src/wx/config_dialog.cc:318
  msgid "Threads"
  msgstr "Processus"
  
  msgid "Threads to use"
  msgstr "Nombre de processus à utiliser"
  
- #: src/wx/config_dialog.cc:88
+ #: src/wx/config_dialog.cc:106
  msgid "Threads to use for encoding on this host"
  msgstr "Nombre de processus à utiliser sur cet hôte"
  
@@@ -464,6 -506,10 +505,10 @@@ msgstr "Utiliser le son intégré
  msgid "Use external audio"
  msgstr "Utiliser une source audio externe"
  
+ #: src/wx/config_dialog.cc:209
+ msgid "User name"
+ msgstr "Nom d'utilisateur"
  #: src/wx/film_editor.cc:75
  msgid "Video"
  msgstr "Vidéo"
@@@ -492,7 -538,8 +537,8 @@@ msgstr "encoder toutes les images mais 
  msgid "encode only the subset"
  msgstr "encoder seulement la sélection"
  
- #: src/wx/film_editor.cc:694 src/wx/film_editor.cc:697
+ #: src/wx/film_editor.cc:694
+ #: src/wx/film_editor.cc:697
  msgid "frames"
  msgstr "images"
  
@@@ -503,16 -550,23 +549,23 @@@ msgstr "ms
  
  #: src/wx/film_editor.cc:440
  msgid "pixels"
- msgstr ""
+ msgstr "pixels"
  
  #. / 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
+ #: src/wx/properties_dialog.cc:62
+ #: src/wx/properties_dialog.cc:63
  msgid "unknown"
  msgstr "inconnu"
  
+ #~ msgid "TMS IP address"
+ #~ msgstr "Adresse IP du TMS"
+ #~ msgid "TMS user name"
+ #~ msgstr "Nom d'utilisateur du TMS"
  #~ msgid "Original Size"
  #~ msgstr "Taille Originale"
diff --combined src/wx/po/it_IT.po
index 2c6c6786802ca35ee8751b41b4f8a11271bdc16b,37ee492fe0bd7a8817472d522f0cabe99f024264..f667a6f2147715b6b2a12c88fc3313b606ff79af
@@@ -7,7 -7,7 +7,7 @@@ msgid "
  msgstr ""
  "Project-Id-Version: IT VERSION\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2013-04-22 15:06+0100\n"
+ "POT-Creation-Date: 2013-05-09 09:51+0100\n"
  "PO-Revision-Date: 2013-04-28 10:27+0100\n"
  "Last-Translator: Maci <macibro@gmail.com>\n"
  "Language-Team: \n"
  msgid "%"
  msgstr "%"
  
 -#: src/wx/config_dialog.cc:98
 -#, fuzzy
 +#: src/wx/config_dialog.cc:61
  msgid "(restart DCP-o-matic to see language changes)"
 -msgstr "(riavviare DVD-o-matic per vedere i cambiamenti di lingua)"
 +msgstr "(riavviare DCP-o-matic per vedere i cambiamenti di lingua)"
  
  #: src/wx/film_editor.cc:1276
  msgid "1 channel"
@@@ -33,7 -34,11 +33,11 @@@ msgstr "1 canale
  msgid "A/B"
  msgstr "A/B"
  
- #: src/wx/config_dialog.cc:143
+ #: src/wx/config_dialog.cc:61
+ msgid "A/B mode"
+ msgstr ""
+ #: src/wx/config_dialog.cc:325
  msgid "Add"
  msgstr "Aggiungi"
  
@@@ -79,7 -84,7 +83,7 @@@ msgstr "Ma dovrò riprodurre con il fad
  msgid "Calculate..."
  msgstr "Calcola..."
  
- #: src/wx/job_manager_view.cc:88
+ #: src/wx/job_manager_view.cc:97
  msgid "Cancel"
  msgstr "Annulla"
  
@@@ -123,6 -128,11 +127,11 @@@ msgstr "Non posso regolare il contenuto
  msgid "Create in folder"
  msgstr "Crea nella cartella"
  
+ #: src/wx/config_dialog.cc:244
+ #, fuzzy
+ msgid "Creator"
+ msgstr "Crea nella cartella"
  #: src/wx/film_editor.cc:1371
  #, c-format
  msgid "Cropped to %dx%d (%.2f:1)\n"
@@@ -140,28 -150,38 +149,37 @@@ msgstr "Frequenza fotogrammi del DCP
  msgid "DCP Name"
  msgstr "Nome del DCP"
  
 -#: src/wx/config_dialog.cc:46
 -#, fuzzy
 -msgid "DCP-o-matic Preferences"
 -msgstr "Preferenze DVD-o-matic"
 +#: src/wx/wx_util.cc:61
 +msgid "DCP-o-matic"
 +msgstr "DCP-o-matic"
  
 -#: src/wx/wx_util.cc:63 src/wx/wx_util.cc:71
 -msgid "DVD-o-matic"
 -msgstr "DVD-o-matic"
 +#: src/wx/config_dialog.cc:44
 +msgid "DCP-o-matic Preferences"
 +msgstr "Preferenze DCP-o-matic"
  
  #: src/wx/audio_dialog.cc:101
  #, c-format
 -msgid "DVD-o-matic audio - %s"
 -msgstr "Audio DVD-o-matic - %s"
 +msgid "DCP-o-matic audio - %s"
 +msgstr "Audio DCP-o-matic - %s"
  
- #: src/wx/config_dialog.cc:102
+ #: src/wx/config_dialog.cc:120
  msgid "Default DCI name details"
  msgstr "Dettagli del nome di default DCI"
  
- #: src/wx/config_dialog.cc:93
+ #: src/wx/config_dialog.cc:130
+ #, fuzzy
+ msgid "Default content type"
+ msgstr "Tipo di contenuto"
+ #: src/wx/config_dialog.cc:111
  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
+ #: src/wx/config_dialog.cc:125
+ msgid "Default format"
+ msgstr ""
+ #: src/wx/film_editor.cc:116 src/wx/job_manager_view.cc:109
  msgid "Details..."
  msgstr "Dettagli"
  
@@@ -173,17 -193,18 +191,18 @@@ msgstr "Spazio su disco rischiesto
  msgid "Duration"
  msgstr "Durata"
  
- #: src/wx/config_dialog.cc:145
+ #: src/wx/config_dialog.cc:327
  msgid "Edit"
  msgstr "Modifica"
  
- #: src/wx/config_dialog.cc:103 src/wx/config_dialog.cc:122
+ #: src/wx/config_dialog.cc:121 src/wx/config_dialog.cc:282
  #: src/wx/film_editor.cc:312
  msgid "Edit..."
  msgstr "Modifica..."
  
- #: src/wx/config_dialog.cc:128
- msgid "Encoding Servers"
+ #: src/wx/config_dialog.cc:55
+ #, fuzzy
+ msgid "Encoding servers"
  msgstr "Servers di codifica"
  
  #: src/wx/film_editor.cc:171
@@@ -242,10 -263,14 +261,14 @@@ msgstr "Hz
  msgid "I want to play this back at fader"
  msgstr "Sto usando il fader a"
  
- #: src/wx/config_dialog.cc:132
+ #: src/wx/config_dialog.cc:201 src/wx/config_dialog.cc:314
  msgid "IP address"
  msgstr "Indirizzo IP"
  
+ #: src/wx/config_dialog.cc:240
+ msgid "Issuer"
+ msgstr ""
  #: src/wx/film_editor.cc:339
  msgid "JPEG2000 bandwidth"
  msgstr "Banda passante JPEG2000"
@@@ -262,6 -287,14 +285,14 @@@ msgstr "Lunghezza
  msgid "MBps"
  msgstr "MBps"
  
+ #: src/wx/config_dialog.cc:57
+ msgid "Metadata"
+ msgstr ""
+ #: src/wx/config_dialog.cc:53
+ msgid "Miscellaneous"
+ msgstr ""
  #: src/wx/dir_picker_ctrl.cc:52
  msgid "My Documents"
  msgstr "Documenti"
@@@ -296,6 -329,15 +327,15 @@@ msgstr "Tipo di Package (es. OV)
  msgid "Padded with black to %dx%d (%.2f:1)\n"
  msgstr "Riempito con nero a %dx%d (%.2f:1)\n"
  
+ #: src/wx/config_dialog.cc:213
+ #, fuzzy
+ msgid "Password"
+ msgstr "Password del TMS"
+ #: src/wx/job_manager_view.cc:103 src/wx/job_manager_view.cc:188
+ msgid "Pause"
+ msgstr ""
  #: src/wx/audio_dialog.cc:60
  msgid "Peak"
  msgstr "Picco"
@@@ -316,23 -358,29 +356,29 @@@ msgstr "RMS
  msgid "Rating (e.g. 15)"
  msgstr "Classificazione (es. 15)"
  
- #: src/wx/config_dialog.cc:118
- msgid "Reference filters for A/B"
+ #: src/wx/config_dialog.cc:278
+ #, fuzzy
+ msgid "Reference filters"
  msgstr "Filtri di riferimento A/B"
  
- #: src/wx/config_dialog.cc:107
- msgid "Reference scaler for A/B"
+ #: src/wx/config_dialog.cc:267
+ #, fuzzy
+ msgid "Reference scaler"
  msgstr "Scalatura di riferimento A/B"
  
- #: src/wx/config_dialog.cc:147
+ #: src/wx/config_dialog.cc:329
  msgid "Remove"
  msgstr "Rimuovi"
  
+ #: src/wx/job_manager_view.cc:191
+ msgid "Resume"
+ msgstr ""
  #: src/wx/film_editor.cc:282
  msgid "Right crop"
  msgstr "Taglio a destra"
  
- #: src/wx/job_manager_view.cc:108
+ #: src/wx/job_manager_view.cc:126
  msgid "Running"
  msgstr "In corso"
  
@@@ -357,7 -405,7 +403,7 @@@ msgstr "Seleziona il file con il conten
  msgid "Server"
  msgstr "Server"
  
- #: src/wx/config_dialog.cc:49
+ #: src/wx/config_dialog.cc:87
  msgid "Set language"
  msgstr "Seleziona la lingua"
  
@@@ -393,27 -441,21 +439,21 @@@ msgstr "Scala dei Sottotitoli
  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:59
+ #, fuzzy
+ msgid "TMS"
+ msgstr "RMS"
  
- #: src/wx/config_dialog.cc:73
- msgid "TMS target path"
+ #: src/wx/config_dialog.cc:205
+ #, fuzzy
+ msgid "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
+ #: src/wx/config_dialog.cc:318
  msgid "Threads"
  msgstr "Threads"
  
  msgid "Threads to use"
  msgstr "Threads da usare"
  
- #: src/wx/config_dialog.cc:88
+ #: src/wx/config_dialog.cc:106
  msgid "Threads to use for encoding on this host"
  msgstr "Threads da usare per codificare su questo host"
  
@@@ -465,6 -507,11 +505,11 @@@ msgstr "Usa l'audio del contenuto
  msgid "Use external audio"
  msgstr "Usa l'audio esterno"
  
+ #: src/wx/config_dialog.cc:209
+ #, fuzzy
+ msgid "User name"
+ msgstr "Usa nome DCI"
  #: src/wx/film_editor.cc:75
  msgid "Video"
  msgstr "Video"
@@@ -515,5 -562,11 +560,11 @@@ msgstr "s
  msgid "unknown"
  msgstr "sconosciuto"
  
+ #~ msgid "TMS IP address"
+ #~ msgstr "Indirizzo IP del TMS"
+ #~ msgid "TMS user name"
+ #~ msgstr "Nome utente del TMS"
  #~ msgid "Original Size"
  #~ msgstr "Dimensione Originale"
diff --combined src/wx/po/sv_SE.po
index 9ed7ee2bee987350af06f5b6d379008fcbb41abd,7c10aebcb733fa832cf32c341233097d84d1166b..f31d98c38a1d75ff7d7124bdc435b82c50d521ad
@@@ -5,9 -5,9 +5,9 @@@
  #
  msgid ""
  msgstr ""
 -"Project-Id-Version: DVD-o-matic\n"
 +"Project-Id-Version: DCP-o-matic\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2013-04-22 15:06+0100\n"
+ "POT-Creation-Date: 2013-05-09 09:51+0100\n"
  "PO-Revision-Date: 2013-04-09 10:13+0100\n"
  "Last-Translator: Adam Klotblixt <adam.klotblixt@gmail.com>\n"
  "Language-Team: \n"
  msgid "%"
  msgstr "%"
  
 -#: src/wx/config_dialog.cc:98
 -#, fuzzy
 +#: src/wx/config_dialog.cc:61
  msgid "(restart DCP-o-matic to see language changes)"
 -msgstr "(starta om DVD-o-matic för att se språkändringar)"
 +msgstr "(starta om DCP-o-matic för att se språkändringar)"
  
  #: src/wx/film_editor.cc:1276
  msgid "1 channel"
@@@ -33,7 -34,11 +33,11 @@@ msgstr "1 kanal
  msgid "A/B"
  msgstr "A/B"
  
- #: src/wx/config_dialog.cc:143
+ #: src/wx/config_dialog.cc:61
+ msgid "A/B mode"
+ msgstr ""
+ #: src/wx/config_dialog.cc:325
  msgid "Add"
  msgstr "Lägg till"
  
@@@ -79,7 -84,7 +83,7 @@@ msgstr "Men jag måste använda mixervo
  msgid "Calculate..."
  msgstr "Beräkna..."
  
- #: src/wx/job_manager_view.cc:88
+ #: src/wx/job_manager_view.cc:97
  msgid "Cancel"
  msgstr "Avbryt"
  
@@@ -123,6 -128,11 +127,11 @@@ msgstr "Kunde inte fastställa innehål
  msgid "Create in folder"
  msgstr "Skapa i katalog"
  
+ #: src/wx/config_dialog.cc:244
+ #, fuzzy
+ msgid "Creator"
+ msgstr "Skapa i katalog"
  #: src/wx/film_editor.cc:1371
  #, c-format
  msgid "Cropped to %dx%d (%.2f:1)\n"
@@@ -140,28 -150,38 +149,37 @@@ msgstr "DCP bildhastighet
  msgid "DCP Name"
  msgstr "DCP Namn"
  
 -#: src/wx/config_dialog.cc:46
 -#, fuzzy
 -msgid "DCP-o-matic Preferences"
 -msgstr "DVD-o-matic Inställningar"
 +#: src/wx/wx_util.cc:61
 +msgid "DCP-o-matic"
 +msgstr "DCP-o-matic"
  
 -#: src/wx/wx_util.cc:63 src/wx/wx_util.cc:71
 -msgid "DVD-o-matic"
 -msgstr "DVD-o-matic"
 +#: src/wx/config_dialog.cc:44
 +msgid "DCP-o-matic Preferences"
 +msgstr "DCP-o-matic Inställningar"
  
  #: src/wx/audio_dialog.cc:101
  #, c-format
 -msgid "DVD-o-matic audio - %s"
 -msgstr "DVD-o-matic audio - %s"
 +msgid "DCP-o-matic audio - %s"
 +msgstr "DCP-o-matic audio - %s"
  
- #: src/wx/config_dialog.cc:102
+ #: src/wx/config_dialog.cc:120
  msgid "Default DCI name details"
  msgstr "Detaljer om förvalda DCI-namn"
  
- #: src/wx/config_dialog.cc:93
+ #: src/wx/config_dialog.cc:130
+ #, fuzzy
+ msgid "Default content type"
+ msgstr "Innehållstyp"
+ #: src/wx/config_dialog.cc:111
  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
+ #: src/wx/config_dialog.cc:125
+ msgid "Default format"
+ msgstr ""
+ #: src/wx/film_editor.cc:116 src/wx/job_manager_view.cc:109
  msgid "Details..."
  msgstr "Detaljer..."
  
@@@ -173,17 -193,18 +191,18 @@@ msgstr "Diskutrymme som krävs
  msgid "Duration"
  msgstr "Längd"
  
- #: src/wx/config_dialog.cc:145
+ #: src/wx/config_dialog.cc:327
  msgid "Edit"
  msgstr "Redigera"
  
- #: src/wx/config_dialog.cc:103 src/wx/config_dialog.cc:122
+ #: src/wx/config_dialog.cc:121 src/wx/config_dialog.cc:282
  #: src/wx/film_editor.cc:312
  msgid "Edit..."
  msgstr "Redigera..."
  
- #: src/wx/config_dialog.cc:128
- msgid "Encoding Servers"
+ #: src/wx/config_dialog.cc:55
+ #, fuzzy
+ msgid "Encoding servers"
  msgstr "Kodningsservrar"
  
  #: src/wx/film_editor.cc:171
@@@ -242,10 -263,14 +261,14 @@@ msgstr "Hz
  msgid "I want to play this back at fader"
  msgstr "Jag vill spela upp detta med mixervolym"
  
- #: src/wx/config_dialog.cc:132
+ #: src/wx/config_dialog.cc:201 src/wx/config_dialog.cc:314
  msgid "IP address"
  msgstr "IP-adress"
  
+ #: src/wx/config_dialog.cc:240
+ msgid "Issuer"
+ msgstr ""
  #: src/wx/film_editor.cc:339
  msgid "JPEG2000 bandwidth"
  msgstr "JPEG2000 bandbredd"
@@@ -262,6 -287,14 +285,14 @@@ msgstr "Längd
  msgid "MBps"
  msgstr "MBps"
  
+ #: src/wx/config_dialog.cc:57
+ msgid "Metadata"
+ msgstr ""
+ #: src/wx/config_dialog.cc:53
+ msgid "Miscellaneous"
+ msgstr ""
  #: src/wx/dir_picker_ctrl.cc:52
  msgid "My Documents"
  msgstr "Mina Dokument"
@@@ -296,6 -329,15 +327,15 @@@ msgstr "Förpackningstyp (ex. OV)
  msgid "Padded with black to %dx%d (%.2f:1)\n"
  msgstr "Svarta kanter tillagda för %dx%d (%.2f:1)\n"
  
+ #: src/wx/config_dialog.cc:213
+ #, fuzzy
+ msgid "Password"
+ msgstr "TMS lösenord"
+ #: src/wx/job_manager_view.cc:103 src/wx/job_manager_view.cc:188
+ msgid "Pause"
+ msgstr ""
  #: src/wx/audio_dialog.cc:60
  msgid "Peak"
  msgstr "Topp"
@@@ -316,23 -358,29 +356,29 @@@ msgstr "RMS
  msgid "Rating (e.g. 15)"
  msgstr "Klassificering (ex. 15)"
  
- #: src/wx/config_dialog.cc:118
- msgid "Reference filters for A/B"
+ #: src/wx/config_dialog.cc:278
+ #, fuzzy
+ msgid "Reference filters"
  msgstr "Referensfilter för A/B"
  
- #: src/wx/config_dialog.cc:107
- msgid "Reference scaler for A/B"
+ #: src/wx/config_dialog.cc:267
+ #, fuzzy
+ msgid "Reference scaler"
  msgstr "Referensomskalare för A/B"
  
- #: src/wx/config_dialog.cc:147
+ #: src/wx/config_dialog.cc:329
  msgid "Remove"
  msgstr "Ta bort"
  
+ #: src/wx/job_manager_view.cc:191
+ msgid "Resume"
+ msgstr ""
  #: src/wx/film_editor.cc:282
  msgid "Right crop"
  msgstr "Höger beskärning"
  
- #: src/wx/job_manager_view.cc:108
+ #: src/wx/job_manager_view.cc:126
  msgid "Running"
  msgstr "Körs"
  
@@@ -357,7 -405,7 +403,7 @@@ msgstr "Välj innehållsfil
  msgid "Server"
  msgstr "Server"
  
- #: src/wx/config_dialog.cc:49
+ #: src/wx/config_dialog.cc:87
  msgid "Set language"
  msgstr "Välj språk"
  
@@@ -393,27 -441,21 +439,21 @@@ msgstr "Undertext Skalning
  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:59
+ #, fuzzy
+ msgid "TMS"
+ msgstr "RMS"
  
- #: src/wx/config_dialog.cc:73
- msgid "TMS target path"
+ #: src/wx/config_dialog.cc:205
+ #, fuzzy
+ msgid "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
+ #: src/wx/config_dialog.cc:318
  msgid "Threads"
  msgstr "Trådar"
  
  msgid "Threads to use"
  msgstr "Antal trådar att använda"
  
- #: src/wx/config_dialog.cc:88
+ #: src/wx/config_dialog.cc:106
  msgid "Threads to use for encoding on this host"
  msgstr "Antal trådar att använda vid kodning på denna maskin"
  
@@@ -466,6 -508,11 +506,11 @@@ msgstr "Använd innehållets audio
  msgid "Use external audio"
  msgstr "Använd extern audio"
  
+ #: src/wx/config_dialog.cc:209
+ #, fuzzy
+ msgid "User name"
+ msgstr "Använd DCI-namnet"
  #: src/wx/film_editor.cc:75
  msgid "Video"
  msgstr "Video"
@@@ -516,5 -563,11 +561,11 @@@ msgstr "s
  msgid "unknown"
  msgstr "okänt"
  
+ #~ msgid "TMS IP address"
+ #~ msgstr "TMS IP-adress"
+ #~ msgid "TMS user name"
+ #~ msgstr "TMS användarnamn"
  #~ msgid "Original Size"
  #~ msgstr "Ursprunglig Storlek"
diff --combined wscript
index ca40d08ebc184af073ef86646f06c6ad0563f902,d730ac84a6a7d0624e2aa71f3ee00e9c9eca5b83..f2b21bde35462934858cfbfac42610ecec387c11
+++ b/wscript
@@@ -2,8 -2,8 +2,8 @@@ import subproces
  import os
  import sys
  
 -APPNAME = 'dvdomatic'
 -VERSION = '0.93pre'
 +APPNAME = 'dcpomatic'
 +VERSION = '1.00pre'
  
  def options(opt):
      opt.load('compiler_cxx')
@@@ -21,23 -21,26 +21,26 @@@ def configure(conf)
      if conf.options.target_windows:
          conf.load('winres')
  
 -    conf.env.append_value('CXXFLAGS', ['-D__STDC_CONSTANT_MACROS', '-msse', '-mfpmath=sse', '-ffast-math', '-fno-strict-aliasing',
 +    conf.env.append_value('CXXFLAGS', ['-D__STDC_CONSTANT_MACROS', '-D__STDC_LIMIT_MACROS', '-msse', '-mfpmath=sse', '-ffast-math', '-fno-strict-aliasing',
                                         '-Wall', '-Wno-attributes', '-Wextra'])
  
      if conf.options.target_windows:
 -        conf.env.append_value('CXXFLAGS', ['-DDVDOMATIC_WINDOWS', '-DWIN32_LEAN_AND_MEAN', '-DBOOST_USE_WINDOWS_H', '-DUNICODE'])
 +        conf.env.append_value('CXXFLAGS', ['-DDCPOMATIC_WINDOWS', '-DWIN32_LEAN_AND_MEAN', '-DBOOST_USE_WINDOWS_H', '-DUNICODE'])
          wxrc = os.popen('wx-config --rescomp').read().split()[1:]
          conf.env.append_value('WINRCFLAGS', wxrc)
          if conf.options.enable_debug:
              conf.env.append_value('CXXFLAGS', ['-mconsole'])
              conf.env.append_value('LINKFLAGS', ['-mconsole'])
          conf.check(lib = 'ws2_32', uselib_store = 'WINSOCK2', msg = "Checking for library winsock2")
+         conf.check(lib = 'bfd', uselib_store = 'BFD', msg = "Checking for library bfd")
+         conf.check(lib = 'dbghelp', uselib_store = 'DBGHELP', msg = "Checking for library dbghelp")
+         conf.check(lib = 'iberty', uselib_store = 'IBERTY', msg = "Checking for library iberty")
          boost_lib_suffix = '-mt'
          boost_thread = 'boost_thread_win32-mt'
      else:
 -        conf.env.append_value('CXXFLAGS', '-DDVDOMATIC_POSIX')
 +        conf.env.append_value('CXXFLAGS', '-DDCPOMATIC_POSIX')
          conf.env.append_value('CXXFLAGS', '-DPOSIX_LOCALE_PREFIX="%s/share/locale"' % conf.env['PREFIX'])
 -        conf.env.append_value('CXXFLAGS', '-DPOSIX_ICON_PREFIX="%s/share/dvdomatic"' % conf.env['PREFIX'])
 +        conf.env.append_value('CXXFLAGS', '-DPOSIX_ICON_PREFIX="%s/share/dcpomatic"' % conf.env['PREFIX'])
          boost_lib_suffix = ''
          boost_thread = 'boost_thread'
          conf.env.append_value('LINKFLAGS', '-pthread')
      conf.env.VERSION = VERSION
  
      if conf.options.enable_debug:
 -        conf.env.append_value('CXXFLAGS', ['-g', '-DDVDOMATIC_DEBUG'])
 +        conf.env.append_value('CXXFLAGS', ['-g', '-DDCPOMATIC_DEBUG'])
      else:
          conf.env.append_value('CXXFLAGS', '-O2')
  
      if not conf.options.static:
          conf.check_cfg(package = 'libdcp', atleast_version = '0.49', args = '--cflags --libs', uselib_store = 'DCP', mandatory = True)
 +        conf.check_cfg(package = 'libcxml', atleast_version = '0.01', args = '--cflags --libs', uselib_store = 'CXML', mandatory = True)
          conf.check_cfg(package = 'libavformat', args = '--cflags --libs', uselib_store = 'AVFORMAT', mandatory = True)
          conf.check_cfg(package = 'libavfilter', args = '--cflags --libs', uselib_store = 'AVFILTER', mandatory = True)
          conf.check_cfg(package = 'libavcodec', args = '--cflags --libs', uselib_store = 'AVCODEC', mandatory = True)
          conf.check_cfg(package = 'libavutil', args = '--cflags --libs', uselib_store = 'AVUTIL', mandatory = True)
          conf.check_cfg(package = 'libswscale', args = '--cflags --libs', uselib_store = 'SWSCALE', mandatory = True)
 -        conf.check_cfg(package = 'libswresample', args = '--cflags --libs', uselib_store = 'SWRESAMPLE', mandatory = False)
 +        conf.check_cfg(package = 'libswresample', args = '--cflags --libs', uselib_store = 'SWRESAMPLE', mandatory = True)
          conf.check_cfg(package = 'libpostproc', args = '--cflags --libs', uselib_store = 'POSTPROC', mandatory = True)
      else:
          # This is hackio grotesquio for static builds (ie for .deb packages).  We need to link some things
@@@ -73,9 -75,6 +76,9 @@@
          conf.env.HAVE_DCP = 1
          conf.env.STLIB_DCP = ['dcp', 'asdcp-libdcp', 'kumu-libdcp']
          conf.env.LIB_DCP = ['glibmm-2.4', 'xml++-2.6', 'ssl', 'crypto', 'bz2']
 +        conf.env.HAVE_CXML = 1
 +        conf.env.STLIB_CXML = ['cxml']
 +        conf.check_cfg(package = 'libxml++-2.6', args = '--cflags --libs', uselib_store = 'XML++', mandatory = True)
          conf.env.HAVE_AVFORMAT = 1
          conf.env.STLIB_AVFORMAT = ['avformat']
          conf.env.HAVE_AVFILTER = 1
          conf.env.STLIB_AVUTIL = ['avutil']
          conf.env.HAVE_SWSCALE = 1
          conf.env.STLIB_SWSCALE = ['swscale']
 -        conf.env.HAVE_SWRESAMPLE = 1
 -        conf.env.STLIB_SWRESAMPLE = ['swresample']
          conf.env.HAVE_POSTPROC = 1
          conf.env.STLIB_POSTPROC = ['postproc']
 -
 -        # This doesn't seem to be set up, and we need it otherwise resampling support
 -        # won't be included.  Hack upon a hack, obviously
 -        conf.env.append_value('CXXFLAGS', ['-DHAVE_SWRESAMPLE=1'])
 +        conf.env.HAVE_SWRESAMPLE = 1
 +        conv.env.STLIB_SWRESAMPLE = ['swresample']
  
      conf.check_cfg(package = 'sndfile', args = '--cflags --libs', uselib_store = 'SNDFILE', mandatory = True)
      conf.check_cfg(package = 'glib-2.0', args = '--cflags --libs', uselib_store = 'GLIB', mandatory = True)
@@@ -224,22 -227,21 +227,22 @@@ def build(bld)
      d = { 'PREFIX' : '${PREFIX' }
  
      obj = bld(features = 'subst')
 -    obj.source = 'dvdomatic.desktop.in'
 -    obj.target = 'dvdomatic.desktop'
 +    obj.source = 'dcpomatic.desktop.in'
 +    obj.target = 'dcpomatic.desktop'
      obj.dict = d
  
      obj = bld(features = 'subst')
 -    obj.source = 'dvdomatic_batch.desktop.in'
 -    obj.target = 'dvdomatic_batch.desktop'
 +    obj.source = 'dcpomatic_batch.desktop.in'
 +    obj.target = 'dcpomatic_batch.desktop'
      obj.dict = d
  
 -    bld.install_files('${PREFIX}/share/applications', ['dvdomatic.desktop', 'dvdomatic_batch.desktop'])
 +    bld.install_files('${PREFIX}/share/applications', ['dcpomatic.desktop', 'dcpomatic_batch.desktop'])
 +
      for r in ['22x22', '32x32', '48x48', '64x64', '128x128']:
 -        bld.install_files('${PREFIX}/share/icons/hicolor/%s/apps' % r, 'icons/%s/dvdomatic.png' % r)
 +        bld.install_files('${PREFIX}/share/icons/hicolor/%s/apps' % r, 'icons/%s/dcpomatic.png' % r)
  
      if not bld.env.TARGET_WINDOWS:
 -        bld.install_files('${PREFIX}/share/dvdomatic', 'icons/taskbar_icon.png')
 +        bld.install_files('${PREFIX}/share/dcpomatic', 'icons/taskbar_icon.png')
  
      bld.add_post_fun(post)
  
@@@ -261,8 -263,8 +264,8 @@@ def create_version_cc(version)
  
      try:
          text =  '#include "version.h"\n'
 -        text += 'char const * dvdomatic_git_commit = \"%s\";\n' % commit
 -        text += 'char const * dvdomatic_version = \"%s\";\n' % version
 +        text += 'char const * dcpomatic_git_commit = \"%s\";\n' % commit
 +        text += 'char const * dcpomatic_version = \"%s\";\n' % version
          print('Writing version information to src/lib/version.cc')
          o = open('src/lib/version.cc', 'w')
          o.write(text)