Merge master.
authorCarl Hetherington <cth@carlh.net>
Tue, 11 Feb 2014 12:04:27 +0000 (12:04 +0000)
committerCarl Hetherington <cth@carlh.net>
Tue, 11 Feb 2014 12:04:27 +0000 (12:04 +0000)
46 files changed:
ChangeLog
README
README.md [new file with mode: 0644]
branch-notes [deleted file]
cscript
debian/changelog
debian/rules
doc/manual/Makefile
doc/manual/dcpomatic.xml
doc/manual/diagrams/3d-left-right.svg
doc/manual/diagrams/3d-top-bottom.svg [new file with mode: 0644]
platform/linux/dcpomatic.desktop.in
platform/linux/dcpomatic.spec.in [new file with mode: 0644]
platform/linux/dcpomatic_batch.desktop.in
platform/linux/dcpomatic_server.desktop.in
platform/linux/wscript
src/lib/audio_analysis.cc
src/lib/config.h
src/lib/ffmpeg.cc
src/lib/ffmpeg_content.h
src/lib/image.cc
src/lib/job.cc
src/lib/log.cc
src/lib/player.cc
src/lib/po/it_IT.po
src/lib/scp_dcp_job.cc
src/lib/server_finder.cc
src/lib/transcode_job.cc
src/lib/util.cc
src/lib/util.h
src/lib/writer.cc
src/lib/wscript
src/tools/dcpomatic.cc
src/tools/dcpomatic_create.cc
src/tools/po/it_IT.po
src/tools/server_test.cc
src/tools/wscript
src/wx/about_dialog.cc
src/wx/audio_plot.cc
src/wx/film_viewer.cc
src/wx/po/it_IT.po
src/wx/timeline.cc
src/wx/wscript
test/resampler_test.cc
test/wscript
wscript

index b9a027fce3c7ac212fea2569c30fd70a85b649b3..e51740c338193fd7ef59463297fe24d3b78d53c3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,78 @@
+2014-02-11  Carl Hetherington  <cth@carlh.net>
+
+       * Be more careful when catching exceptions from KDM creation.
+
+2014-02-10  Carl Hetherington  <cth@carlh.net>
+
+       * Version 1.64.11 released.
+
+2014-02-10  Carl Hetherington  <cth@carlh.net>
+
+       * Version 1.64.10 released.
+
+2014-02-10  Carl Hetherington  <cth@carlh.net>
+
+       * Try to fix Centos RPM dependencies.
+
+       * Version 1.64.9 released.
+
+2014-02-10  Carl Hetherington  <cth@carlh.net>
+
+       * Version 1.64.8 released.
+
+2014-02-09  Carl Hetherington  <cth@carlh.net>
+
+       * Build with a more careful version of libopenjpeg that handles
+       out-of-memory conditions slightly better.
+
+       * Possibly fix repeated no route to host errors in some cases.
+
+       * Some small bits of increased low-memory stability.
+
+       * Version 1.64.7 released.
+
+2014-02-08  Carl Hetherington  <cth@carlh.net>
+
+       * Fix exception when seeking with missing content (part of #317).
+
+       * Version 1.64.6 released.
+
+2014-02-08  Carl Hetherington  <cth@carlh.net>
+
+       * Version 1.64.5 released.
+
+2014-02-08  Carl Hetherington  <cth@carlh.net>
+
+       * Version 1.64.4 released.
+
+2014-02-08  Carl Hetherington  <cth@carlh.net>
+
+       * Version 1.64.3 released.
+
+2014-02-08  Carl Hetherington  <cth@carlh.net>
+
+       * Bump libdcp version to get some fixes for Interop XML.
+
+2014-02-07  Carl Hetherington  <cth@carlh.net>
+
+       * Add basic stuff to build RPMs for Centos.
+
+2014-02-05  Carl Hetherington  <cth@carlh.net>
+
+       * Version 1.64.2 released.
+
+2014-02-05  Carl Hetherington  <cth@carlh.net>
+
+       * A variety of fixes to small problems found by Coverity.
+
+2014-02-05  Carl Hetherington  <cth@carlh.net>
+
+       * Version 1.64.1 released.
+
+2014-02-05  Carl Hetherington  <cth@carlh.net>
+
+       * Updates to it_IT translation from William Fanelli.
+
 2014-02-02  Carl Hetherington  <cth@carlh.net>
 
        * Version 1.64.0 released.
diff --git a/README b/README
index c218ed1a52521ff71fdb357040f4ec1fd04a8a1b..9ae9d0c3f647005a177bc3527f5b54aaad19babd 100644 (file)
--- a/README
+++ b/README
@@ -1,93 +1,3 @@
-DCP-o-matic
------------
+DCP-o-matic is a program to generate DCPs (digital content packages) for digital cinema.
 
-Hello!
-
-
-Building for Linux
-------------------
-
-./waf configure
-./waf
-sudo ./waf install
-
-
-Building for Windows
---------------------
-
-...is quite involved.  You need to build (or download) all the dependencies.
-I'll put my scripts up at some point.
-
-
-Dependencies
-------------
-
-You will need these libraries:
-
-    libdcp (from http://carlh.net/software/libdcp)
-    FFmpeg version 0.9.x or higher
-    libtiff
-    boost thread and filesystem
-    libopenjpeg 1.5.0 or higher
-    wxWidgets
-    libsndfile
-    libssh
-
-
-Documentation
--------------
-
-There is a manual available at http://carlh.net/software/dcpomatic
-The DocBook source for this is in doc/manual.
-
-
-In a nutshell
--------------
-
-The `dcpomatic' program is a GTK front-end which is probably easiest
-to use.  It will create a directory for a particular project, and write
-its data to that directory.  The basic approach is:
-
-"File->New"; specify a directory.
-Fill in the fields in the window (most importantly the `content' field:
-  specify your video, and the `Name' field: give your project [and hence DCP]
-  a name.)
-Move the slider to see thumbnails; adjust crop if necessary.
-Select "Jobs->Make DCP" and go and make a really strong cup of tea.
-The DCP will be written to the project's directory; copy this to your
-  media server and ingest.
-
-The `Format' field dictates what size your image will be:
-
-- 4:3 within Flat: 1.33:1 images inside a flat (1.85:1) frame; play
-  back using the DCI 1.85 / DCI Flat preset on your projector.
-- Academy: 1.37:1; play using DCI 1.37 if you have such a thing.
-- 16:9 within Flat: 1.78:1 images inside a 1.85:1 frame.
-- Flat: 1.85:1 images to the DCI spec.
-- Scope: 2.39:1 images to the DCI spec.
-
-
-Server/client
--------------
-
-Running the `servomatic' program on a remote machine will make it
-listen on port 6192 (by default) and process requests from a dcpomatic
-instance.  This has been written with no thought to security, so don't
-do it over the public internet!  The connection will probably need to
-be 1 Gb/s to make it worthwhile.
-
-To tell the client about available servers you will need to go to
-Edit->Preferences and add the server's IP address and the number of
-parallel threads that the server should execute (make it equal to the
-number of CPUs or cores).
-
-
-
-Problems
---------
-
-Email me at cth@carlh.net in the first instance.
-
-
-Carl Hetherington
-August 2012
+Please see [dcpomatic.com](http://dcpomatic.com/) for details.
diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..9ae9d0c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,3 @@
+DCP-o-matic is a program to generate DCPs (digital content packages) for digital cinema.
+
+Please see [dcpomatic.com](http://dcpomatic.com/) for details.
diff --git a/branch-notes b/branch-notes
deleted file mode 100644 (file)
index f713f5d..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-things to put back
-       frame rate description  
-       trust content header?
-       overall length?
-       trim method (trim in general)
-       A/B
-
diff --git a/cscript b/cscript
index 4103f936675791d5545496f44f1aa95902b1a9cc..ef9294f9a83d9a248dbd4de20e7e9445261a3be2 100644 (file)
--- a/cscript
+++ b/cscript
@@ -2,88 +2,88 @@ import glob
 import shutil
 import os
 
-build_depends = {'debhelper': '8.0.0',
-                 'python': '2.7.3',
-                 'g++': '4:4.6.3',
-                 'pkg-config': '0.26',
-                 'libssh-dev': '0.5.2',
-                 'libboost-filesystem-dev': '1.46.0',
-                 'libboost-thread-dev': '1.46.0',
-                 'libsndfile1-dev': '1.0.25',
-                 'libmagick++-dev': '8:6.6.9.7',
-                 'libgtk2.0-dev': '2.24.10'}
-
-depends = dict()
-
-depends['12.04'] = {'libc6': '2.15',
-                    'libssh-4': '0.5.2',
-                    'libboost-filesystem1.46.1': '1.46.1',
-                    'libboost-thread1.46.1': '1.46.1',
-                    'libsndfile1': '1.0.25',
-                    'libmagick++4': '8:6.6.9.7',
-                    'libxml++2.6-2': '2.34.1',
-                    'libgtk2.0-0': '2.24.10',
-                    'libxmlsec1': '1.2.14-1.2build1',
-                    'libxmlsec1-openssl': '1.2.14-1.2build1',
-                    'libboost-date-time1.46.1': '1.46.1',
-                    'libcurl3': '7.22.0-3ubuntu4',
-                    'libzip2': '0.10-1ubuntu1'}
-
-depends['12.10'] = {'libc6': '2.15',
-                    'libssh-4': '0.5.2',
-                    'libboost-filesystem1.49.0': '1.49.0',
-                    'libboost-thread1.49.0': '1.49.0',
-                    'libsndfile1': '1.0.25',
-                    'libmagick++5': '8:6.7.7.10',
-                    'libxml++2.6-2': '2.34.2',
-                    'libgtk2.0-0': '2.24.13',
-                    'libxmlsec1': '1.2.18-2',
-                    'libxmlsec1-openssl': '1.2.18-2',
-                    'libboost-date-time1.49.0': '1.49.0',
-                    'libcurl3': '7.27.0-1ubuntu1',
-                    'libzip2': '0.10.1-1.1'}
-
-depends['13.04'] = {'libc6': '2.15',
-                    'libssh-4': '0.5.2',
+deb_build_depends = {'debhelper': '8.0.0',
+                     'python': '2.7.3',
+                     'g++': '4:4.6.3',
+                     'pkg-config': '0.26',
+                     'libssh-dev': '0.5.2',
+                     'libboost-filesystem-dev': '1.46.0',
+                     'libboost-thread-dev': '1.46.0',
+                     'libsndfile1-dev': '1.0.25',
+                     'libmagick++-dev': '8:6.6.9.7',
+                     'libgtk2.0-dev': '2.24.10'}
+
+deb_depends = dict()
+
+deb_depends['12.04'] = {'libc6': '2.15',
+                        'libssh-4': '0.5.2',
+                        'libboost-filesystem1.46.1': '1.46.1',
+                        'libboost-thread1.46.1': '1.46.1',
+                        'libsndfile1': '1.0.25',
+                        'libmagick++4': '8:6.6.9.7',
+                        'libxml++2.6-2': '2.34.1',
+                        'libgtk2.0-0': '2.24.10',
+                        'libxmlsec1': '1.2.14-1.2build1',
+                        'libxmlsec1-openssl': '1.2.14-1.2build1',
+                        'libboost-date-time1.46.1': '1.46.1',
+                        'libcurl3': '7.22.0-3ubuntu4',
+                        'libzip2': '0.10-1ubuntu1'}
+
+deb_depends['12.10'] = {'libc6': '2.15',
+                        'libssh-4': '0.5.2',
+                        'libboost-filesystem1.49.0': '1.49.0',
+                        'libboost-thread1.49.0': '1.49.0',
+                        'libsndfile1': '1.0.25',
+                        'libmagick++5': '8:6.7.7.10',
+                        'libxml++2.6-2': '2.34.2',
+                        'libgtk2.0-0': '2.24.13',
+                        'libxmlsec1': '1.2.18-2',
+                        'libxmlsec1-openssl': '1.2.18-2',
+                        'libboost-date-time1.49.0': '1.49.0',
+                        'libcurl3': '7.27.0-1ubuntu1',
+                        'libzip2': '0.10.1-1.1'}
+
+deb_depends['13.04'] = {'libc6': '2.15',
+                        'libssh-4': '0.5.2',
+                        'libboost-filesystem1.49.0': '1.49.0',
+                        'libboost-thread1.49.0': '1.49.0',
+                        'libsndfile1': '1.0.25',
+                        'libmagick++5': '8:6.7.7.10',
+                        'libxml++2.6-2': '2.34.2',
+                        'libgtk2.0-0': '2.24.13',
+                        'libxmlsec1': '1.2.18-2',
+                        'libxmlsec1-openssl': '1.2.18-2',
+                        'libboost-date-time1.49.0': '1.49.0',
+                        'libcurl3': '7.29.0-1ubuntu3',
+                        'libzip2': '0.10.1-1.1'}
+
+deb_depends['13.10'] = {'libc6': '2.17-93',
+                        'libssh-4': '0.5.4',
+                        'libboost-filesystem1.53.0': '1.53.0',
+                        'libboost-thread1.53.0': '1.53.0',
+                        'libsndfile1': '1.0.25',
+                        'libmagick++5': '8:6.7.7.10',
+                        'libxml++2.6-2': '2.36.0',
+                        'libgtk2.0-0': '2.24.20',
+                        'libxmlsec1': '1.2.18-2',
+                        'libxmlsec1-openssl': '1.2.18-2',
+                        'libboost-date-time1.49.0': '1.49.0',
+                        'libcurl3': '7.29.0-1ubuntu3',
+                        'libzip2': '0.10.1-1.1'}
+
+deb_depends['7'] = {'libc6': '2.13',
+                    'libssh-4': '0.5.4',
                     'libboost-filesystem1.49.0': '1.49.0',
                     'libboost-thread1.49.0': '1.49.0',
                     'libsndfile1': '1.0.25',
                     'libmagick++5': '8:6.7.7.10',
                     'libxml++2.6-2': '2.34.2',
-                    'libgtk2.0-0': '2.24.13',
-                    'libxmlsec1': '1.2.18-2',
-                    'libxmlsec1-openssl': '1.2.18-2',
-                    'libboost-date-time1.49.0': '1.49.0',
-                    'libcurl3': '7.29.0-1ubuntu3',
-                    'libzip2': '0.10.1-1.1'}
-
-depends['13.10'] = {'libc6': '2.17-93',
-                    'libssh-4': '0.5.4',
-                    'libboost-filesystem1.53.0': '1.53.0',
-                    'libboost-thread1.53.0': '1.53.0',
-                    'libsndfile1': '1.0.25',
-                    'libmagick++5': '8:6.7.7.10',
-                    'libxml++2.6-2': '2.36.0',
-                    'libgtk2.0-0': '2.24.20',
-                    'libxmlsec1': '1.2.18-2',
-                    'libxmlsec1-openssl': '1.2.18-2',
+                    'libgtk2.0-0': '2.24.10',
+                    'libxmlsec1': '1.2.18',
                     'libboost-date-time1.49.0': '1.49.0',
-                    'libcurl3': '7.29.0-1ubuntu3',
-                    'libzip2': '0.10.1-1.1'}
-
-depends['7'] = {'libc6': '2.13',
-                'libssh-4': '0.5.4',
-                'libboost-filesystem1.49.0': '1.49.0',
-                'libboost-thread1.49.0': '1.49.0',
-                'libsndfile1': '1.0.25',
-                'libmagick++5': '8:6.7.7.10',
-                'libxml++2.6-2': '2.34.2',
-                'libgtk2.0-0': '2.24.10',
-                'libxmlsec1': '1.2.18',
-                'libboost-date-time1.49.0': '1.49.0',
-                'libxmlsec1-openssl': '1.2.18',
-                'libcurl3': '7.26.0',
-                'libzip2': '0.10.1'}
+                    'libxmlsec1-openssl': '1.2.18',
+                    'libcurl3': '7.26.0',
+                    'libzip2': '0.10.1'}
 
 def packages(name, packages, f):
     s = '%s: ' % name
@@ -91,13 +91,13 @@ def packages(name, packages, f):
         s += str(p) + ', '
     print >>f,s[:-2]
 
-def make_control(version, bits, filename, debug):
+def make_control(debian_version, bits, filename, debug):
     f = open(filename, 'w')
     print >>f,'Source: dcpomatic'
     print >>f,'Section: video'
     print >>f,'Priority: extra'
     print >>f,'Maintainer: Carl Hetherington <carl@dcpomatic.com>'
-    packages('Build-Depends', build_depends, f)
+    packages('Build-Depends', deb_build_depends, f)
     print >>f,'Standards-Version: 3.9.3'
     print >>f,'Homepage: http://dcpomatic.com/'
     print >>f,''
@@ -107,7 +107,7 @@ def make_control(version, bits, filename, debug):
     else:
         print >>f,'Architecture: amd64'
 
-    packages('Depends', depends[version], f)
+    packages('Depends', deb_depends[debian_version], f)
 
     print >>f,'Description: Generator of Digital Cinema Packages (DCPs)'
     print >>f,'  DCP-o-matic generates Digital Cinema Packages (DCPs) from video and audio'
@@ -123,66 +123,106 @@ def make_control(version, bits, filename, debug):
             print >>f,'Architecture: amd64'
         print >>f,'Section: debug'
         print >>f,'Priority: extra'
-        packages('Depends', depends[version], f)
+        packages('Depends', deb_depends[debian_version], f)
         print >>f,'Description: debugging symbols for dcpomatic'
         print >>f,'  This package contains the debugging symbols for dcpomatic.'
         print >>f,''
 
 def dependencies(target):
     return (('ffmpeg-cdist', '5ac3a6af077c10f07c31954c372a8f29e4e18e2a'),
-            ('libdcp', '054cc86'))
+            ('libdcp', 'f74c462'))
 
 def build(target, options):
     cmd = './waf configure --prefix=%s' % target.work_dir_cscript()
     if target.platform == 'windows':
         cmd += ' --target-windows'
     elif target.platform == 'linux':
-        cmd += ' --static'
-    target.command(cmd)
+        if target.distro == 'debian' or target.distro == 'ubuntu':
+            cmd += ' --target-debian'
+        elif target.distro == 'centos':
+            cmd += ' --target-centos'
 
+    target.command(cmd)
     target.command('./waf')
 
     if target.platform == 'linux' or target.platform == 'osx':
         target.command('./waf install')
 
+def package_windows(target):
+    shutil.copyfile('build/platform/windows/installer.%s.nsi' % target.bits, 'build/platform/windows/installer2.%s.nsi' % target.bits)
+    target.command('sed -i "s~%%resources%%~%s/platform/windows~g" build/platform/windows/installer2.%s.nsi' % (os.getcwd(), target.bits))
+    target.command('sed -i "s~%%static_deps%%~%s~g" build/platform/windows/installer2.%s.nsi' % (target.windows_prefix, target.bits))
+    target.command('sed -i "s~%%cdist_deps%%~%s~g" build/platform/windows/installer2.%s.nsi' % (target.work_dir_cscript(), target.bits))
+    target.command('sed -i "s~%%binaries%%~%s/build~g" build/platform/windows/installer2.%s.nsi' % (os.getcwd(), target.bits))
+    target.command('sed -i "s~%%bits%%~32~g" build/platform/windows/installer2.%s.nsi' % target.bits)
+    target.command('makensis build/platform/windows/installer2.%s.nsi' % target.bits)
+    return os.path.abspath(glob.glob('build/platform/windows/*%s*.exe' % target.bits)[0])
+
+def package_debian(target, cpu, version):
+    make_control(target.version, target.bits, 'debian/control', target.debug)
+    target.command('./waf dist')
+    f = open('debian/files', 'w')
+    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('../../dcpomatic-%s.tar.bz2' % version, 'dcpomatic_%s.orig.tar.bz2' % version)
+    target.command('tar xjf dcpomatic_%s.orig.tar.bz2' % version)
+    os.chdir('dcpomatic-%s' % version)
+    target.command('dch -b -v %s-1 "New upstream release."' % version)
+    target.set('CDIST_LINKFLAGS', target.get('LINKFLAGS'))
+    target.set('CDIST_CXXFLAGS', target.get('CXXFLAGS'))
+    target.set('CDIST_PKG_CONFIG_PATH', target.get('PKG_CONFIG_PATH'))
+    target.command('dpkg-buildpackage')
+    
+    debs = []
+    for p in glob.glob('../*.deb'):
+        debs.append(os.path.abspath(p))
+    
+    return debs
+
+def package_centos(target, cpu, version):
+    os.makedirs('%s/rpmbuild/BUILD' % target.work_dir_cdist())
+    os.makedirs('%s/rpmbuild/RPMS' % target.work_dir_cdist())
+    os.makedirs('%s/rpmbuild/SOURCES' % target.work_dir_cdist())
+    os.makedirs('%s/rpmbuild/SPECS' % target.work_dir_cdist())
+    os.makedirs('%s/rpmbuild/SRPMS' % target.work_dir_cdist())
+
+    f = open('%s/.rpmmacros' % target.dir_in_chroot, 'w')
+    print >>f,"%%_topdir %srpmbuild" % target.dir_in_chroot
+    f.close()
+
+    target.command('./waf dist')
+    shutil.copyfile(
+        "%s/src/dcpomatic/dcpomatic-%s.tar.bz2" % (target.work_dir_cdist(), version),
+        "%s/rpmbuild/SOURCES/dcpomatic-%s.tar.bz2" % (target.work_dir_cdist(), version)
+        )
+
+    target.command('rpmbuild -bb build/platform/linux/dcpomatic.spec')
+    rpms = []
+
+    if cpu == "amd64":
+        cpu = "x86_64"
+
+    for p in glob.glob('%s/rpmbuild/RPMS/%s/*.rpm' % (target.work_dir_cdist(), cpu)):
+        rpms.append(os.path.abspath(p))
+
+    return rpms
+
 def package(target, version):
     if target.platform == 'windows':
-        shutil.copyfile('build/platform/windows/installer.%s.nsi' % target.bits, 'build/platform/windows/installer2.%s.nsi' % target.bits)
-        target.command('sed -i "s~%%resources%%~%s/platform/windows~g" build/platform/windows/installer2.%s.nsi' % (os.getcwd(), target.bits))
-        target.command('sed -i "s~%%static_deps%%~%s~g" build/platform/windows/installer2.%s.nsi' % (target.windows_prefix, target.bits))
-        target.command('sed -i "s~%%cdist_deps%%~%s~g" build/platform/windows/installer2.%s.nsi' % (target.work_dir_cscript(), target.bits))
-        target.command('sed -i "s~%%binaries%%~%s/build~g" build/platform/windows/installer2.%s.nsi' % (os.getcwd(), target.bits))
-        target.command('sed -i "s~%%bits%%~32~g" build/platform/windows/installer2.%s.nsi' % target.bits)
-        target.command('makensis build/platform/windows/installer2.%s.nsi' % target.bits)
-        return os.path.abspath(glob.glob('build/platform/windows/*%s*.exe' % target.bits)[0])
+        return package_windows(target)
     elif target.platform == 'linux':
         if target.bits == 32:
-            cpu = 'i386'
-        else:
-            cpu = 'amd64'
-
-        make_control(target.version, target.bits, 'debian/control', target.debug)
-        target.command('./waf dist')
-        f = open('debian/files', 'w')
-        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('../../dcpomatic-%s.tar.bz2' % version, 'dcpomatic_%s.orig.tar.bz2' % version)
-        target.command('tar xjf dcpomatic_%s.orig.tar.bz2' % version)
-        os.chdir('dcpomatic-%s' % version)
-        target.command('dch -b -v %s-1 "New upstream release."' % version)
-        target.set('CDIST_LINKFLAGS', target.get('LINKFLAGS'))
-        target.set('CDIST_CXXFLAGS', target.get('CXXFLAGS'))
-        target.set('CDIST_PKG_CONFIG_PATH', target.get('PKG_CONFIG_PATH'))
-        target.command('dpkg-buildpackage')
-        
-        debs = []
-        for p in glob.glob('../*.deb'):
-            debs.append(os.path.abspath(p))
-
-        return debs
+           cpu = 'i386'
+        else:  
+            cpu        = 'amd64'
+
+       if target.distro == 'debian' or target.distro == 'ubuntu':
+            return package_debian(target, cpu, version)
+        elif target.distro == 'centos':
+            return package_centos(target, cpu, version)
     elif target.platform == 'osx':
         target.command('bash platform/osx/make_dmg.sh %s' % target.work_dir_cscript())
         return os.path.abspath(glob.glob('build/platform/osx/DCP-o-matic*.dmg')[0])
index 6290cc9e7b51cb36c715c2a09a0f19c8908680cf..0b4453a31c4d1de55a47eed24b1978bb46a1bf97 100644 (file)
@@ -1,4 +1,4 @@
-dcpomatic (1.64.0-1) UNRELEASED; urgency=low
+dcpomatic (1.64.11-1) UNRELEASED; urgency=low
 
   * New upstream release.
   * New upstream release.
@@ -81,8 +81,19 @@ dcpomatic (1.64.0-1) UNRELEASED; urgency=low
   * New upstream release.
   * New upstream release.
   * New upstream release.
+  * New upstream release.
+  * New upstream release.
+  * New upstream release.
+  * New upstream release.
+  * New upstream release.
+  * New upstream release.
+  * New upstream release.
+  * New upstream release.
+  * New upstream release.
+  * New upstream release.
+  * New upstream release.
 
- -- Carl Hetherington <carl@d1stkfactory>  Sun, 02 Feb 2014 23:46:54 +0000
+ -- Carl Hetherington <carl@d1stkfactory>  Mon, 10 Feb 2014 20:09:25 +0000
 
 dcpomatic (0.87-1) UNRELEASED; urgency=low
 
index 8973231b56805bf436f4eb99da35aa1a4b2f9ebb..f24aabac199f7bcf18f54fd35af3c19df4999d2b 100755 (executable)
@@ -14,7 +14,7 @@
 
 override_dh_auto_configure:
        LINKFLAGS=$(CDIST_LINKFLAGS) CXXFLAGS="$(CXXFLAGS) $(CDIST_CXXFLAGS)" PKG_CONFIG_PATH=$(CDIST_PKG_CONFIG_PATH) \
-                ./waf --nocache configure --prefix=/usr --static --enable-debug
+                ./waf --nocache configure --prefix=/usr --target-debian --enable-debug
 
 override_dh_auto_build:
        ./waf --nocache build
index 8be93db1926b7e437b41589cefd1a918ccc869a3..2b2d709c97f598592d4b13646b2c8dc7cdbb8918 100644 (file)
@@ -2,7 +2,7 @@
 
 all:   html pdf
 
-DIAGRAMS := file-structure.svg 3d-left-right.svg
+DIAGRAMS := file-structure.svg 3d-left-right.svg 3d-top-bottom.svg
 
 SCREENSHOTS := file-new.png video-new-film.png still-new-film.png video-select-content-file.png \
                still-select-content-file.png examine-thumbs.png examine-content.png timing-tab.png \
index 50fb11c1b3077158ac9863dcb75dbe8ca5c5a1e0..dafa67962e4ddfaee4abbc7dfa5b674d28590476 100644 (file)
@@ -72,7 +72,7 @@ This manual uses icons from the <ulink url="http://tango.freedesktop.org/">Tango
 <title>Windows</title>
 
 <para>
-To install DCP-o-matic on Windows, simply download the installer from
+To install DCP-o-matic on Windows, download the installer from
 <ulink url="http://dcpomatic.com/">http://dcpomatic.com/</ulink>
 and double-click it.  Click through the installer wizard, and
 DCP-o-matic will be installed onto your machine.
@@ -121,12 +121,19 @@ and set DCP-o-matic up for you.
 
 <section>
 <title>Debian Linux</title>
-
 <para>
 Packages are also available for Debian 7 (squeeze) from <ulink
 url="http://dcpomatic.com/">http://dcpomatic.com/</ulink>.
 </para>
+</section>
 
+<section>
+<title>Arch Linux</title>
+<para>
+Packages for Arch Linux are available from <ulink
+url="https://aur.archlinux.org/packages/dcpomatic/">https://aur.archlinux.org/packages/dcpomatic/</ulink>,
+thanks to Stefan Karner.
+</para>
 </section>
 
 <section>
@@ -533,8 +540,8 @@ The <guilabel>Video</guilabel> tab controls properties of the image, as shown in
 The first option on this tab is the &lsquo;type&rsquo; of the video.
 This specifies how DCP-o-matic should interpret the video's image.
 <guilabel>2D</guilabel> is the default; this just takes the video
-image as a standard 2D frame.  The other option <guilabel>3D
-left/right</guilabel> tells DCP-o-matic to interpret the frame as a
+image as a standard 2D frame.  The <guilabel>3D
+left/right</guilabel> option tells DCP-o-matic to interpret the frame as a
 left-right pair, as shown in <xref linkend="fig-3d-left-right"/>.
 </para>
 
@@ -548,10 +555,20 @@ left-right pair, as shown in <xref linkend="fig-3d-left-right"/>.
 </figure>
 
 <para>
-This option can be used to generate a 3D DCP.  Other means of creating
-3D will be added in the future.
+Alternatively the <guilabel>3D top/bottom</guilabel> option tells
+DCP-o-matic to see the frame as a top-bottom pair, as shown in <xref
+linkend="fig-3d-top-bottom"/>.
 </para>
 
+<figure id="fig-3d-top-bottom"> 
+  <title>3D top/bottom image type</title>
+  <mediaobject>
+    <imageobject> 
+       <imagedata scale="100" fileref="diagrams/3d-top-bottom&dia;"/>
+    </imageobject> 
+  </mediaobject>
+</figure>
+
 </section>
 
 
@@ -962,7 +979,7 @@ high enough resolution to be worth presenting in 4K.
 The <guilabel>JPEG2000 bandwidth</guilabel>; setting changes how big the final
 image files used within the DCP will be.  Larger numbers will give
 better quality, but correspondingly larger DCPs.  The bandwidth can be
-between 50 and 250 megabits per second (MBps).
+between 50 and 250 megabits per second (Mbit/s).
 </para>
 
 <para>
index 02df7092f38a21e599d95d41f3a9d5b1f074594a..a51c93833ca55dd895ddbf40e080e4502316d8b6 100644 (file)
@@ -14,7 +14,7 @@
    id="svg4899"
    version="1.1"
    inkscape:version="0.48.4 r9939"
-   sodipodi:docname="New document 5">
+   sodipodi:docname="3d-left-right.svg">
   <defs
      id="defs4901">
     <marker
@@ -92,9 +92,9 @@
      borderopacity="1.0"
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
-     inkscape:zoom="1.9220686"
-     inkscape:cx="257.32427"
-     inkscape:cy="523.31639"
+     inkscape:zoom="2.4155251"
+     inkscape:cx="274"
+     inkscape:cy="557.5"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      showgrid="false"
      inkscape:guide-bbox="true"
      inkscape:window-width="1366"
      inkscape:window-height="714"
-     inkscape:window-x="0"
+     inkscape:window-x="1024"
      inkscape:window-y="27"
      inkscape:window-maximized="1">
     <sodipodi:guide
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
+        <dc:title />
       </cc:Work>
     </rdf:RDF>
   </metadata>
      id="layer1">
     <text
        xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:inconsolata;-inkscape-font-specification:inconsolata"
+       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Latin Modern Mono;-inkscape-font-specification:Latin Modern Mono"
        x="182.2476"
        y="462.34418"
        id="text4907"
          id="tspan4913">image</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:inconsolata;-inkscape-font-specification:inconsolata"
+       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Latin Modern Mono;-inkscape-font-specification:Latin Modern Mono"
        x="310.8606"
        y="462.3082"
        id="text4915"
        sodipodi:nodetypes="cc" />
     <text
        xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:inconsolata;-inkscape-font-specification:inconsolata"
+       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Latin Modern Mono;-inkscape-font-specification:Latin Modern Mono"
        x="246.67448"
        y="396.21439"
        id="text6541"
        sodipodi:nodetypes="cc" />
     <text
        xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:inconsolata;-inkscape-font-specification:inconsolata"
+       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Latin Modern Mono;-inkscape-font-specification:Latin Modern Mono"
        x="170.6097"
        y="560.70441"
        id="text6575"
diff --git a/doc/manual/diagrams/3d-top-bottom.svg b/doc/manual/diagrams/3d-top-bottom.svg
new file mode 100644 (file)
index 0000000..f30814f
--- /dev/null
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg4899"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="3d-top-bottom.svg">
+  <defs
+     id="defs4901">
+    <marker
+       inkscape:stockid="Arrow2Mstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Mstart"
+       style="overflow:visible">
+      <path
+         id="path5751"
+         style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.6) translate(0,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Mend"
+       style="overflow:visible;">
+      <path
+         id="path5754"
+         style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.6) rotate(180) translate(0,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mend"
+       style="overflow:visible;">
+      <path
+         id="path5736"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+         transform="scale(0.4) rotate(180) translate(10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mstart-2"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5751-0"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(0.6,0.6)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-0"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5754-9"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.5697329"
+     inkscape:cx="252.36295"
+     inkscape:cy="505.5"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1366"
+     inkscape:window-height="714"
+     inkscape:window-x="1024"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+    <sodipodi:guide
+       orientation="0,1"
+       position="93.830754,642.26787"
+       id="guide3010" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="203.85633,435.10586"
+       id="guide3012" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata4904">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Latin Modern Mono;-inkscape-font-specification:Latin Modern Mono"
+       x="200.2476"
+       y="448.34418"
+       id="text4907"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan4909"
+         x="200.2476"
+         y="448.34418">Left</tspan><tspan
+         sodipodi:role="line"
+         x="200.2476"
+         y="463.34418"
+         id="tspan4911">eye</tspan><tspan
+         sodipodi:role="line"
+         x="200.2476"
+         y="478.34418"
+         id="tspan4913">image</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Latin Modern Mono;-inkscape-font-specification:Latin Modern Mono"
+       x="200.3076"
+       y="554.04352"
+       id="text4915"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan4917"
+         x="200.3076"
+         y="554.04352">Right</tspan><tspan
+         sodipodi:role="line"
+         x="200.3076"
+         y="569.04352"
+         id="tspan4919">eye</tspan><tspan
+         sodipodi:role="line"
+         x="200.3076"
+         y="584.04352"
+         id="tspan4921">image</tspan></text>
+    <rect
+       style="color:#000000;fill:none;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect5713"
+       width="167.88153"
+       height="207.55882"
+       x="132.9384"
+       y="410.08606" />
+    <path
+       style="fill:none;stroke:#4d4d4d;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0"
+       d="m 133.49553,513.97874 166.94494,0"
+       id="path5715"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow2Mstart);marker-end:url(#Arrow2Mend)"
+       d="m 315.99595,617.25632 0,-207.0057"
+       id="path5721"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Latin Modern Mono;-inkscape-font-specification:Latin Modern Mono"
+       x="323.12064"
+       y="515.34296"
+       id="text6541"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6543"
+         x="323.12064"
+         y="515.34296">height</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow2Mstart);marker-end:url(#Arrow2Mend)"
+       d="m 120.25051,617.4954 0,-103.18935"
+       id="path5721-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Latin Modern Mono;-inkscape-font-specification:Latin Modern Mono"
+       x="50.20705"
+       y="567.07489"
+       id="text6575"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6577"
+         x="50.20705"
+         y="567.07489">height / 2</tspan></text>
+  </g>
+</svg>
index aabd992f5486b752d019bea04f8341911fbe1617..76e62940456aba2fb5faf0a47f52f752139e415e 100644 (file)
@@ -3,7 +3,7 @@ Encoding=UTF-8
 Version=1.0
 Type=Application
 Terminal=false
-Exec=@PREFIX@/bin/dcpomatic
+Exec=@INSTALL_PREFIX@/bin/dcpomatic
 Name=DCP-o-matic
 Icon=dcpomatic
 Comment=DCP generator
diff --git a/platform/linux/dcpomatic.spec.in b/platform/linux/dcpomatic.spec.in
new file mode 100644 (file)
index 0000000..b2005c4
--- /dev/null
@@ -0,0 +1,70 @@
+Summary:A program that generates Digital Cinema Packages (DCPs) from video and audio files
+Name:dcpomatic
+Version:@version@
+Release:1%{?dist}
+License:GPL
+Group:Applications/Multimedia
+URL:http://dcpomatic.com/
+Requires: ImageMagick-c++, glibmm24, libzip
+
+%description
+DCP-o-matic generates Digital Cinema Packages (DCPs) from video and audio
+files (such as those from DVDs or Blu-Rays) for presentation on DCI-compliant
+digital projectors.
+
+%files
+%{_bindir}/dcpomatic
+%{_bindir}/dcpomatic_batch
+%{_bindir}/dcpomatic_cli
+%{_bindir}/dcpomatic_create
+%{_bindir}/dcpomatic_kdm
+%{_bindir}/dcpomatic_server
+%{_bindir}/dcpomatic_server_cli
+%{_datadir}/applications/dcpomatic.desktop
+%{_datadir}/applications/dcpomatic_batch.desktop
+%{_datadir}/applications/dcpomatic_server.desktop
+%{_datadir}/dcpomatic/taskbar_icon.png
+%{_datadir}/icons/hicolor/128x128/apps/dcpomatic.png
+%{_datadir}/icons/hicolor/22x22/apps/dcpomatic.png
+%{_datadir}/icons/hicolor/32x32/apps/dcpomatic.png
+%{_datadir}/icons/hicolor/48x48/apps/dcpomatic.png
+%{_datadir}/icons/hicolor/64x64/apps/dcpomatic.png
+%{_datadir}/locale/de_DE/LC_MESSAGES/dcpomatic.mo
+%{_datadir}/locale/de_DE/LC_MESSAGES/libdcpomatic-wx.mo
+%{_datadir}/locale/de_DE/LC_MESSAGES/libdcpomatic.mo
+%{_datadir}/locale/es_ES/LC_MESSAGES/dcpomatic.mo
+%{_datadir}/locale/es_ES/LC_MESSAGES/libdcpomatic-wx.mo
+%{_datadir}/locale/es_ES/LC_MESSAGES/libdcpomatic.mo
+%{_datadir}/locale/fr_FR/LC_MESSAGES/dcpomatic.mo
+%{_datadir}/locale/fr_FR/LC_MESSAGES/libdcpomatic-wx.mo
+%{_datadir}/locale/fr_FR/LC_MESSAGES/libdcpomatic.mo
+%{_datadir}/locale/it_IT/LC_MESSAGES/dcpomatic.mo
+%{_datadir}/locale/it_IT/LC_MESSAGES/libdcpomatic-wx.mo
+%{_datadir}/locale/it_IT/LC_MESSAGES/libdcpomatic.mo
+%{_datadir}/locale/sv_SE/LC_MESSAGES/dcpomatic.mo
+%{_datadir}/locale/sv_SE/LC_MESSAGES/libdcpomatic-wx.mo
+%{_datadir}/locale/sv_SE/LC_MESSAGES/libdcpomatic.mo
+
+%prep
+rm -rf $RPM_BUILD_DIR/dcpomatic-@version@
+tar xjf $RPM_SOURCE_DIR/dcpomatic-@version@.tar.bz2
+%build
+cd dcpomatic-@version@
+export PKG_CONFIG_PATH=/home/carl/lib/pkgconfig:/usr/local/lib/pkgconfig
+CXXFLAGS="-I/home/carl/include" LDFLAGS="-L/home/carl/lib" ./waf configure --prefix=%{buildroot}/usr --install-prefix=/usr --target-centos
+./waf
+%install
+cd dcpomatic-@version@
+./waf install
+
+%post
+/bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null || :
+
+%postun
+if [ $1 -eq 0 ] ; then
+    /bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null
+    /usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
+fi
+
+%posttrans
+/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
\ No newline at end of file
index bab136e8a5ea1b3c4aaa0202dc3f2b64e6f1fe0d..ec32a735357d6485288f26110ee52e1d738a4ce6 100644 (file)
@@ -3,7 +3,7 @@ Encoding=UTF-8
 Version=1.0
 Type=Application
 Terminal=false
-Exec=@PREFIX@/bin/dcpomatic_batch
+Exec=@INSTALL_PREFIX@/bin/dcpomatic_batch
 Name=DCP-o-matic Batch Converter
 Icon=dcpomatic
 Comment=DCP generator
index 7b8215e8f9345ad74707dfac69383bb33abdcebc..c51c2778a67080cc06cd943142522ed48583bd4b 100644 (file)
@@ -3,7 +3,7 @@ Encoding=UTF-8
 Version=1.0
 Type=Application
 Terminal=false
-Exec=@PREFIX@/bin/dcpomatic_server
+Exec=@INSTALL_PREFIX@/bin/dcpomatic_server
 Name=DCP-o-matic Encode Server
 Icon=dcpomatic
 Comment=DCP generator
index 53a6efeac7ca687765c9504e57c8069449b50eac..fe6f4e2db10a9a77aa16e4bb3d95463479097790 100644 (file)
@@ -1,19 +1,25 @@
 def build(bld):
-    d = { 'PREFIX' : '${PREFIX' }
+    d = { 'INSTALL_PREFIX' : bld.env.INSTALL_PREFIX }
+    d = { 'VERSION' : bld.env.VERSION }
 
-    obj = bld(features = 'subst')
+    obj = bld(features='subst')
     obj.source = 'dcpomatic.desktop.in'
     obj.target = 'dcpomatic.desktop'
     obj.dict = d
 
-    obj = bld(features = 'subst')
+    obj = bld(features='subst')
     obj.source = 'dcpomatic_batch.desktop.in'
     obj.target = 'dcpomatic_batch.desktop'
     obj.dict = d
 
-    obj = bld(features = 'subst')
+    obj = bld(features='subst')
     obj.source = 'dcpomatic_server.desktop.in'
     obj.target = 'dcpomatic_server.desktop'
     obj.dict = d
 
+    obj = bld(features='subst')
+    obj.source = 'dcpomatic.spec.in'
+    obj.target = 'dcpomatic.spec'
+    obj.dict = d
+
     bld.install_files('${PREFIX}/share/applications', ['dcpomatic.desktop', 'dcpomatic_batch.desktop', 'dcpomatic_server.desktop'])
index 1488f89fcfdfb6f2ac32aaed158e36e1a9eb589d..98d092726c9487f8152a97b6965bd4ff3219df4e 100644 (file)
@@ -93,10 +93,21 @@ AudioAnalysis::AudioAnalysis (boost::filesystem::path filename)
        for (int i = 0; i < channels; ++i) {
                int points;
                fscanf (f, "%d", &points);
+               if (feof (f)) {
+                       fclose (f);
+                       return;
+               }
+               
                for (int j = 0; j < points; ++j) {
                        _data[i].push_back (AudioPoint (f));
+                       if (feof (f)) {
+                               fclose (f);
+                               return;
+                       }
                }
        }
+
+       fclose (f);
 }
 
 void
index 791e41e8f6f27a14b5626e492fc714c824da027f..d77969b3e9e14956f6e0a043576077ea2eba924d 100644 (file)
@@ -193,14 +193,6 @@ public:
                _server_port_base = p;
        }
 
-       void set_reference_scaler (Scaler const * s) {
-               _reference_scaler = s;
-       }
-       
-       void set_reference_filters (std::vector<Filter const *> const & f) {
-               _reference_filters = f;
-       }
-
        /** @param i IP address of a TMS that we can copy DCPs to */
        void set_tms_ip (std::string i) {
                _tms_ip = i;
@@ -326,10 +318,6 @@ private:
        bool _use_any_servers;
        /** J2K encoding servers that should definitely be used */
        std::vector<std::string> _servers;
-       /** Scaler to use for the "A" part of A/B comparisons */
-       Scaler const * _reference_scaler;
-       /** Filters to use for the "A" part of A/B comparisons */
-       std::vector<Filter const *> _reference_filters;
        /** The IP address of a TMS that we can copy DCPs to */
        std::string _tms_ip;
        /** The path on a TMS that we should write DCPs to */
index 4bf9415234e3d54b844e8881e56a75dd30558492..5fc33348923c85d584af16fb980c6f5f50ad2dd1 100644 (file)
@@ -26,6 +26,7 @@ extern "C" {
 #include "ffmpeg.h"
 #include "ffmpeg_content.h"
 #include "exceptions.h"
+#include "util.h"
 
 #include "i18n.h"
 
@@ -85,7 +86,7 @@ FFmpeg::setup_general ()
        av_register_all ();
 
        _file_group.set_paths (_ffmpeg_content->paths ());
-       _avio_buffer = static_cast<uint8_t*> (av_malloc (_avio_buffer_size));
+       _avio_buffer = static_cast<uint8_t*> (wrapped_av_malloc (_avio_buffer_size));
        _avio_context = avio_alloc_context (_avio_buffer, _avio_buffer_size, 0, this, avio_read_wrapper, 0, avio_seek_wrapper);
        _format_context = avformat_alloc_context ();
        _format_context->pb = _avio_context;
@@ -146,7 +147,8 @@ void
 FFmpeg::setup_video ()
 {
        boost::mutex::scoped_lock lm (_mutex);
-       
+
+       assert (_video_stream >= 0);
        AVCodecContext* context = _format_context->streams[_video_stream]->codec;
        AVCodec* codec = avcodec_find_decoder (context->codec_id);
 
index d9037b0d8ca2f70ee38ee3edc56e9c703c4dd874..e637faf47643be48b0f3353bad5d440cb5231b62 100644 (file)
@@ -86,6 +86,8 @@ private:
        /* Constructor for tests */
        FFmpegAudioStream ()
                : FFmpegStream ("", 0)
+               , frame_rate (0)
+               , channels (0)
                , mapping (1)
        {}
 };
index e5f626c24762bbb2e57be8e1bd06a1cada3b9efc..78e8bbb2a9cb6fbb48410cc873b9c72c0a60ad3e 100644 (file)
@@ -509,13 +509,13 @@ Image::Image (AVPixelFormat p, libdcp::Size s, bool aligned)
 void
 Image::allocate ()
 {
-       _data = (uint8_t **) av_malloc (4 * sizeof (uint8_t *));
+       _data = (uint8_t **) wrapped_av_malloc (4 * sizeof (uint8_t *));
        _data[0] = _data[1] = _data[2] = _data[3] = 0;
        
-       _line_size = (int *) av_malloc (4 * sizeof (int));
+       _line_size = (int *) wrapped_av_malloc (4 * sizeof (int));
        _line_size[0] = _line_size[1] = _line_size[2] = _line_size[3] = 0;
        
-       _stride = (int *) av_malloc (4 * sizeof (int));
+       _stride = (int *) wrapped_av_malloc (4 * sizeof (int));
        _stride[0] = _stride[1] = _stride[2] = _stride[3] = 0;
 
        for (int i = 0; i < components(); ++i) {
@@ -531,7 +531,7 @@ Image::allocate ()
                   seem to mind.  The nasty + 1 in this malloc makes sure there is always a byte
                   for that instruction to read safely.
                */
-               _data[i] = (uint8_t *) av_malloc (_stride[i] * lines (i) + 1);
+               _data[i] = (uint8_t *) wrapped_av_malloc (_stride[i] * lines (i) + 1);
        }
 }
 
index 05a90524c9818615112b77464da5a56bd154ec69..b543a043f0550cc176af9874834633dc678a9128 100644 (file)
@@ -68,9 +68,6 @@ Job::run_wrapper ()
 
        } catch (libdcp::FileError& e) {
                
-               set_progress (1);
-               set_state (FINISHED_ERROR);
-               
                string m = String::compose (_("An error occurred whilst handling the file %1."), boost::filesystem::path (e.filename()).leaf());
 
                try {
@@ -84,39 +81,48 @@ Job::run_wrapper ()
                }
 
                set_error (e.what(), m);
-
-       } catch (OpenFileError& e) {
-
                set_progress (1);
                set_state (FINISHED_ERROR);
+               
+       } catch (OpenFileError& e) {
 
                set_error (
                        String::compose (_("Could not open %1"), e.file().string()),
                        String::compose (_("DCP-o-matic could not open the file %1.  Perhaps it does not exist or is in an unexpected format."), e.file().string())
                        );
 
+               set_progress (1);
+               set_state (FINISHED_ERROR);
+
        } catch (boost::thread_interrupted &) {
 
                set_state (FINISHED_CANCELLED);
-               
-       } catch (std::exception& e) {
 
+       } catch (std::bad_alloc& e) {
+
+               set_error (_("Out of memory"), _("There was not enough memory to do this."));
                set_progress (1);
                set_state (FINISHED_ERROR);
+               
+       } catch (std::exception& e) {
+
                set_error (
                        e.what (),
                        _("It is not known what caused this error.  The best idea is to report the problem to the DCP-o-matic mailing list (carl@dcpomatic.com)")
                        );
 
-       } catch (...) {
-
                set_progress (1);
                set_state (FINISHED_ERROR);
+               
+       } catch (...) {
+
                set_error (
                        _("Unknown error"),
                        _("It is not known what caused this error.  The best idea is to report the problem to the DCP-o-matic mailing list (carl@dcpomatic.com)")
                        );
 
+               set_progress (1);
+               set_state (FINISHED_ERROR);
        }
 }
 
index 9ddf460d43ccc1c382270e607a7634a66be09049..a0b031589bf1836080c98c170c2fde1860df8dfe 100644 (file)
@@ -104,6 +104,11 @@ void
 FileLog::do_log (string m)
 {
        FILE* f = fopen_boost (_file, "a");
+       if (!f) {
+               cout << "(could not log to " << _file.string() << "): " << m << "\n";
+               return;
+       }
+
        fprintf (f, "%s\n", m.c_str ());
        fclose (f);
 }
index 3e6a1598d17e76559c64b7ca0cde2837ec905b64..48c75078e12a59c2bdfabab7f5a91bbf1ea085f0 100644 (file)
@@ -450,6 +450,10 @@ Player::setup_pieces ()
 
        for (ContentList::iterator i = content.begin(); i != content.end(); ++i) {
 
+               if (!(*i)->paths_valid ()) {
+                       continue;
+               }
+               
                shared_ptr<Decoder> decoder;
                optional<FrameRateChange> frc;
 
@@ -566,6 +570,7 @@ Player::content_changed (weak_ptr<Content> w, int property, bool frequent)
 
        } else if (property == ContentProperty::PATH) {
 
+               _have_valid_pieces = false;
                Changed (frequent);
        }
 }
index a9a4a60009c1c7e0862a2e946ddd734faaad1447..584baad6e8f0e8de24255b514a607ecd664be0e3 100644 (file)
@@ -8,14 +8,14 @@ msgstr ""
 "Project-Id-Version: IT VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-01-30 21:51+0000\n"
-"PO-Revision-Date: 2013-04-28 10:26+0100\n"
-"Last-Translator: Maci <macibro@gmail.com>\n"
+"PO-Revision-Date: 2014-02-03 10:48+0100\n"
+"Last-Translator: William Fanelli <william.f@impronte.com>\n"
 "Language-Team: \n"
-"Language: Italiano\n"
+"Language: it\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.5.5\n"
+"X-Generator: Poedit 1.6.3\n"
 
 #: src/lib/sndfile_content.cc:60
 msgid "%1 [audio]"
@@ -30,9 +30,8 @@ msgid "%1 channels, %2kHz, %3 samples"
 msgstr ""
 
 #: src/lib/ffmpeg_content.cc:237
-#, fuzzy
 msgid "%1 frames; %2 frames per second"
-msgstr "fotogrammi al secondo"
+msgstr "%1 fotogrammi; %2 fotogrammi al secondo"
 
 #: src/lib/video_content.cc:200
 msgid "%1x%2 pixels (%3:1)"
@@ -149,14 +148,14 @@ msgid "Content to be joined must have the same ratio."
 msgstr ""
 
 #: src/lib/subtitle_content.cc:74
-#, fuzzy
 msgid "Content to be joined must have the same subtitle X offset."
-msgstr "Il DCP e il sorgente hanno la stessa frequenza."
+msgstr ""
+"Il contenuto da unire deve avere lo stesso spostamento X dei sottotitoli."
 
 #: src/lib/subtitle_content.cc:78
-#, fuzzy
 msgid "Content to be joined must have the same subtitle Y offset."
-msgstr "Il DCP e il sorgente hanno la stessa frequenza."
+msgstr ""
+"Il contenuto da unire deve avere lo stesso spostamento Y dei sottotitoli."
 
 #: src/lib/subtitle_content.cc:82
 msgid "Content to be joined must have the same subtitle scale."
@@ -191,9 +190,8 @@ msgid "Could not create remote directory %1 (%2)"
 msgstr "Non posso creare la directory remota %1 (%2)"
 
 #: src/lib/job.cc:94
-#, fuzzy
 msgid "Could not open %1"
-msgstr "non riesco ad aprire %1"
+msgstr "Non riesco ad aprire %1"
 
 #: src/lib/scp_dcp_job.cc:176
 msgid "Could not open %1 to send"
@@ -230,6 +228,8 @@ msgid ""
 "DCP-o-matic could not open the file %1.  Perhaps it does not exist or is in "
 "an unexpected format."
 msgstr ""
+"DCP-o-matic non può aprire il file %1. Non esiste oppure Ã¨ in un formato non "
+"riconosciuto."
 
 #: 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
@@ -253,6 +253,14 @@ msgid ""
 "Best regards,\n"
 "DCP-o-matic"
 msgstr ""
+"Spett. Proiezionista\n"
+"\n"
+"troverà in allegato le KDMs per $CPL_NAME.\n"
+"\n"
+"Le KDM sono valide da $START_TIME fino a $END_TIME.\n"
+"\n"
+"Distinti saluti,\n"
+"DCP-o-matic"
 
 #: src/lib/filter.cc:74
 msgid "Deringing filter"
@@ -264,14 +272,12 @@ msgid "Dolby CP650 and CP750"
 msgstr "Dolby CP750"
 
 #: src/lib/util.cc:803
-#, fuzzy
 msgid "Each content frame will be doubled in the DCP.\n"
-msgstr "Ogni fotogramma del sorgente sarà raddoppiato nel DCP.\n"
+msgstr "Ogni fotogramma del sorgente sarà duplicato nel DCP.\n"
 
 #: src/lib/util.cc:805
-#, fuzzy
 msgid "Each content frame will be repeated %1 more times in the DCP.\n"
-msgstr "Ogni fotogramma del sorgente sarà raddoppiato nel DCP.\n"
+msgstr "Ogni fotogramma del sorgente sarà ripetuto %1 volte nel DCP.\n"
 
 #: src/lib/send_kdm_email_job.cc:50
 msgid "Email KDMs for %1"
@@ -291,11 +297,11 @@ msgstr "Esamino il contenuto"
 
 #: src/lib/filter.cc:72
 msgid "Experimental horizontal deblocking filter 1"
-msgstr "Filtro di sblocco sperimentale orizzontale 1"
+msgstr "Filtro deblocking orizzontale sperimentale 1"
 
 #: src/lib/filter.cc:73
 msgid "Experimental vertical deblocking filter 1"
-msgstr "Filtro di sblocco sperimentale verticale 1"
+msgstr "Filtro deblocking verticale sperimentale 1"
 
 #: src/lib/filter.cc:79
 msgid "FFMPEG deinterlacer"
@@ -327,7 +333,7 @@ msgstr "Forza quantizzatore"
 
 #: src/lib/ratio.cc:43
 msgid "Full frame"
-msgstr ""
+msgstr "Schermo intero"
 
 #: src/lib/scaler.cc:65
 msgid "Gaussian"
@@ -343,11 +349,11 @@ msgstr "Riduttore di rumore 3D di alta qualità"
 
 #: src/lib/filter.cc:68
 msgid "Horizontal deblocking filter"
-msgstr "Filtro sblocco orizzontale"
+msgstr "Filtro deblocking orizzontale"
 
 #: src/lib/filter.cc:70
 msgid "Horizontal deblocking filter A"
-msgstr "Filtro A sblocco orizzontale"
+msgstr "Filtro deblocking orizzontale A"
 
 #: src/lib/job.cc:108 src/lib/job.cc:117
 msgid ""
@@ -396,7 +402,7 @@ msgstr "Varie"
 
 #: src/lib/filter.cc:81
 msgid "Motion compensating deinterlacer"
-msgstr "Dinterlacciatore compensativo di movimento"
+msgstr "Dinterlacciatore con compensazione di movimento"
 
 #: src/lib/filter.cc:84 src/lib/filter.cc:88 src/lib/filter.cc:89
 #: src/lib/filter.cc:91
@@ -494,6 +500,10 @@ msgid ""
 "unfortunately it cannot be loaded into this version.  You will need to "
 "create a new Film, re-add your content and set it up again.  Sorry!"
 msgstr ""
+"Questo film Ã¨ stato creato con una vecchia versione di DCP-o-matic, e "
+"purtroppo non può essere caricato in questa versione. Sarà necessario creare "
+"un nuovo film, ri-aggiungere i tuoi contenuti e configurarlo di nuovo. Ci "
+"dispiace!"
 
 #: src/lib/dcp_content_type.cc:46
 msgid "Trailer"
@@ -521,7 +531,7 @@ msgstr "Maschera unsharp e sfocatura Gaussiana"
 
 #: src/lib/colour_conversion.cc:145
 msgid "Untitled"
-msgstr ""
+msgstr "Senza titolo"
 
 #: src/lib/filter.cc:69
 msgid "Vertical deblocking filter"
@@ -545,7 +555,7 @@ msgstr "Altro filtro di deinterlacciamento"
 
 #: src/lib/film.cc:289
 msgid "You must add some content to the DCP before creating it"
-msgstr ""
+msgstr "Devi aggiungere dei contenuti al DCP prima di crearlo"
 
 #: src/lib/image_content.cc:68
 msgid "[moving images]"
@@ -569,9 +579,8 @@ msgid "connecting"
 msgstr "mi sto connettendo"
 
 #: src/lib/film.cc:285
-#, fuzzy
 msgid "container"
-msgstr "contenuto"
+msgstr "contenitore"
 
 #: src/lib/film.cc:293
 msgid "content type"
@@ -606,9 +615,8 @@ msgid "could not move audio MXF into the DCP (%1)"
 msgstr ""
 
 #: src/lib/sndfile_decoder.cc:45
-#, fuzzy
 msgid "could not open audio file for reading"
-msgstr "non riesco ad aprire il file per leggerlo"
+msgstr "non riesco ad aprire il file in lettura"
 
 #: src/lib/exceptions.cc:29
 msgid "could not open file %1"
@@ -720,7 +728,7 @@ msgstr "sRGB"
 
 #: src/lib/config.cc:82
 msgid "sRGB non-linearised"
-msgstr ""
+msgstr "sRGB non linearizzato"
 
 #: src/lib/util.cc:160
 msgid "seconds"
index 310303c09c54d371dc5c6589c9eb85e755f5c89a..22715978a7040ba279843c8e2ab0488a8f98f7a3 100644 (file)
@@ -191,8 +191,10 @@ SCPDCPJob::run ()
                        }
                        to_do -= t;
                        bytes_transferred += t;
-                       
-                       set_progress ((double) bytes_transferred / bytes_to_transfer);
+
+                       if (bytes_to_transfer > 0) {
+                               set_progress ((double) bytes_transferred / bytes_to_transfer);
+                       }
                }
 
                fclose (f);
index 5b67d8048dc197a98d91213c4c0070de61f75d02..3d5825ad4d7f4a01aadbfd850a774bc2c7eb18fa 100644 (file)
@@ -65,8 +65,12 @@ try
        while (1) {
                if (Config::instance()->use_any_servers ()) {
                        /* Broadcast to look for servers */
-                       boost::asio::ip::udp::endpoint end_point (boost::asio::ip::address_v4::broadcast(), Config::instance()->server_port_base() + 1);
-                       socket.send_to (boost::asio::buffer (data.c_str(), data.size() + 1), end_point);
+                       try {
+                               boost::asio::ip::udp::endpoint end_point (boost::asio::ip::address_v4::broadcast(), Config::instance()->server_port_base() + 1);
+                               socket.send_to (boost::asio::buffer (data.c_str(), data.size() + 1), end_point);
+                       } catch (...) {
+
+                       }
                }
 
                /* Query our `definite' servers (if there are any) */
@@ -104,6 +108,7 @@ try
                try {
                        sock->accept (Config::instance()->server_port_base() + 1);
                } catch (std::exception& e) {
+                       dcpomatic_sleep (60);
                        continue;
                }
 
index 289259369d028652aa2fc684f7aabc4997c30971..46fc97fb31b74bdf14f6093dd0d973e34fa78709 100644 (file)
@@ -100,17 +100,20 @@ TranscodeJob::status () const
 int
 TranscodeJob::remaining_time () const
 {
-       if (!_transcoder) {
+       /* _transcoder might be destroyed by the job-runner thread */
+       shared_ptr<Transcoder> t = _transcoder;
+       
+       if (!t) {
                return 0;
        }
        
-       float fps = _transcoder->current_encoding_rate ();
+       float fps = t->current_encoding_rate ();
 
        if (fps == 0) {
                return 0;
        }
 
        /* Compute approximate proposed length here, as it's only here that we need it */
-       VideoFrame const left = _film->time_to_video_frames (_film->length ()) - _transcoder->video_frames_out();
+       VideoFrame const left = _film->time_to_video_frames (_film->length ()) - t->video_frames_out();
        return left / fps;
 }
index ef203c2bdc82fae52119f0acef4b4d4c2ba27764..418d7b3e0f6123810b2f482df524473d5abe2d55 100644 (file)
@@ -27,6 +27,7 @@
 #include <iostream>
 #include <fstream>
 #include <climits>
+#include <stdexcept>
 #ifdef DCPOMATIC_POSIX
 #include <execinfo.h>
 #include <cxxabi.h>
@@ -93,7 +94,9 @@ using std::istream;
 using std::numeric_limits;
 using std::pair;
 using std::cout;
+using std::bad_alloc;
 using std::streampos;
+using std::set_terminate;
 using boost::shared_ptr;
 using boost::thread;
 using boost::lexical_cast;
@@ -272,6 +275,33 @@ LONG WINAPI exception_handler(struct _EXCEPTION_POINTERS *)
 }
 #endif
 
+/* From http://stackoverflow.com/questions/2443135/how-do-i-find-where-an-exception-was-thrown-in-c */
+void
+terminate ()
+{
+       static bool tried_throw = false;
+
+       try {
+               // try once to re-throw currently active exception
+               if (!tried_throw++) {
+                       throw;
+               }
+       }
+       catch (const std::exception &e) {
+               std::cerr << __FUNCTION__ << " caught unhandled exception. what(): "
+                         << e.what() << std::endl;
+       }
+       catch (...) {
+               std::cerr << __FUNCTION__ << " caught unknown/unhandled exception." 
+                         << std::endl;
+       }
+
+#ifdef DCPOMATIC_POSIX
+       stacktrace (cout, 50);
+#endif
+       abort();
+}
+
 /** Call the required functions to set up DCP-o-matic's static arrays, etc.
  *  Must be called from the UI thread, if there is one.
  */
@@ -308,7 +338,9 @@ dcpomatic_setup ()
        boost::filesystem::path lib = app_contents ();
        lib /= "lib";
        setenv ("LTDL_LIBRARY_PATH", lib.c_str (), 1);
-#endif 
+#endif
+
+       set_terminate (terminate);
 
        Pango::init ();
        libdcp::init ();
@@ -926,3 +958,13 @@ time_round_up (DCPTime t, DCPTime nearest)
        DCPTime const a = t + nearest - 1;
        return a - (a % nearest);
 }
+
+void *
+wrapped_av_malloc (size_t s)
+{
+       void* p = av_malloc (s);
+       if (!p) {
+               throw bad_alloc ();
+       }
+       return p;
+}
index a84e7e4cf815522ae65ffa6cf52bebbf46849210..d3e6a67de9e1fd053783c65afd8effaef22ef001 100644 (file)
@@ -126,6 +126,7 @@ extern float get_required_float (std::multimap<std::string, std::string> const &
 extern std::string get_required_string (std::multimap<std::string, std::string> const & kv, std::string k);
 extern int get_optional_int (std::multimap<std::string, std::string> const & kv, std::string k);
 extern std::string get_optional_string (std::multimap<std::string, std::string> const & kv, std::string k);
+extern void* wrapped_av_malloc (size_t);
 
 /** @class Socket
  *  @brief A class to wrap a boost::asio::ip::tcp::socket with some things
index c2a6c981bc8f31a2629affe444df88c225ae7ddc..42187dc6e78616a24673057bb4e9eb87802381aa 100644 (file)
@@ -541,7 +541,9 @@ Writer::check_existing_picture_mxf ()
                shared_ptr<Job> job = _job.lock ();
                assert (job);
 
-               job->set_progress (float (_first_nonexistant_frame) / N);
+               if (N > 0) {
+                       job->set_progress (float (_first_nonexistant_frame) / N);
+               }
 
                if (_film->three_d ()) {
                        if (!check_existing_picture_mxf_frame (mxf, _first_nonexistant_frame, EYES_LEFT)) {
index 8a20618c0641c91e30b82bdce72047926478ba3c..a5b069184024ba981c09f8a2e4e65f26749af194 100644 (file)
@@ -69,7 +69,7 @@ sources = """
           """
 
 def build(bld):
-    if bld.env.STATIC:
+    if bld.env.BUILD_STATIC:
         obj = bld(features = 'cxx cxxstlib')
     else:
         obj = bld(features = 'cxx cxxshlib')
@@ -88,7 +88,7 @@ def build(bld):
     if bld.env.TARGET_WINDOWS:
         obj.uselib += ' WINSOCK2 BFD DBGHELP IBERTY SHLWAPI MSWSOCK BOOST_LOCALE'
         obj.source += ' stack.cpp'
-    if bld.env.STATIC:
+    if bld.env.BUILD_STATIC:
         obj.uselib += ' XML++'
 
     obj.target = 'dcpomatic'
index 1e60d96903d3569fe8182e3777c32fd08980f902..70e675e4099f52ea15bc2ff80b0370cb35b6e17b 100644 (file)
@@ -474,8 +474,10 @@ private:
                                        shared_ptr<Job> (new SendKDMEmailJob (film, d->screens (), d->dcp (), d->from (), d->until ()))
                                        );
                        }
-               } catch (KDMError& e) {
+               } catch (exception& e) {
                        error_dialog (this, e.what ());
+               } catch (...) {
+                       error_dialog (this, _("An unknown exeception occurred."));
                }
        
                d->Destroy ();
index 8be468b306332de52aa15511c606680201c7abc1..8dc4de50ef278dc66a02b9964a9fd146607086a9 100644 (file)
@@ -20,6 +20,7 @@
 #include <string>
 #include <iostream>
 #include <cstdlib>
+#include <stdexcept>
 #include <getopt.h>
 #include <boost/filesystem.hpp>
 #include "lib/version.h"
@@ -34,6 +35,7 @@ using std::string;
 using std::cout;
 using std::cerr;
 using std::list;
+using std::exception;
 using boost::shared_ptr;
 
 static void
@@ -98,31 +100,37 @@ main (int argc, char* argv[])
        dcpomatic_setup ();
        ui_signaller = new UISignaller ();
 
-       shared_ptr<Film> film (new Film (output));
-       if (!name.empty ()) {
-               film->set_name (name);
-       }
-
-       for (int i = optind; i < argc; ++i) {
-               film->examine_and_add_content (content_factory (film, argv[i]));
-       }
-
-       JobManager* jm = JobManager::instance ();
-       while (jm->work_to_do ()) {
-               ui_signaller->ui_idle ();
-       }
-
-       if (jm->errors ()) {
-               list<shared_ptr<Job> > jobs = jm->get ();
-               for (list<shared_ptr<Job> >::iterator i = jobs.begin(); i != jobs.end(); ++i) {
-                       if ((*i)->finished_in_error ()) {
-                               cerr << (*i)->error_summary () << "\n"
-                                    << (*i)->error_details () << "\n";
+       try {
+               shared_ptr<Film> film (new Film (output));
+               if (!name.empty ()) {
+                       film->set_name (name);
+               }
+               
+               for (int i = optind; i < argc; ++i) {
+                       film->examine_and_add_content (content_factory (film, argv[i]));
+               }
+               
+               JobManager* jm = JobManager::instance ();
+               while (jm->work_to_do ()) {
+                       ui_signaller->ui_idle ();
+               }
+               
+               if (jm->errors ()) {
+                       list<shared_ptr<Job> > jobs = jm->get ();
+                       for (list<shared_ptr<Job> >::iterator i = jobs.begin(); i != jobs.end(); ++i) {
+                               if ((*i)->finished_in_error ()) {
+                                       cerr << (*i)->error_summary () << "\n"
+                                            << (*i)->error_details () << "\n";
+                               }
                        }
+                       exit (EXIT_FAILURE);
                }
+               
+               film->write_metadata ();
+       } catch (exception& e) {
+               cerr << argv[0] << ": " << e.what() << "\n";
                exit (EXIT_FAILURE);
        }
-
-       film->write_metadata ();
+               
        return 0;
 }
index f63169721934ee150e18f0ad5b4c87c5a53df67b..15276515b729b7cbbf1ab56514a7f1f98b48083b 100644 (file)
@@ -8,18 +8,18 @@ msgstr ""
 "Project-Id-Version: IT VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-01-30 21:51+0000\n"
-"PO-Revision-Date: 2013-04-28 10:31+0100\n"
-"Last-Translator: Maci <macibro@gmail.com>\n"
+"PO-Revision-Date: 2014-02-03 09:36+0100\n"
+"Last-Translator: William Fanelli <william.f@impronte.com>\n"
 "Language-Team: \n"
-"Language: Italiano\n"
+"Language: it\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.5.5\n"
+"X-Generator: Poedit 1.6.3\n"
 
 #: src/tools/dcpomatic.cc:366
 msgid "%1 already exists as a file, so you cannot use it for a new film."
-msgstr ""
+msgstr "%1 esiste già il file, non Ã¨ possibile usarlo per un nuovo film"
 
 #: src/tools/dcpomatic.cc:241
 msgid "&Edit"
@@ -27,7 +27,7 @@ msgstr "&Modifica"
 
 #: src/tools/dcpomatic.cc:208
 msgid "&Exit"
-msgstr ""
+msgstr "&Esci"
 
 #: src/tools/dcpomatic.cc:239
 msgid "&File"
@@ -71,20 +71,19 @@ msgstr "&Invia DCP a TMS"
 
 #: src/tools/dcpomatic.cc:244
 msgid "&Tools"
-msgstr ""
+msgstr "&Strumenti"
 
 #: src/tools/dcpomatic.cc:236
 msgid "About"
 msgstr "Informazioni"
 
 #: src/tools/dcpomatic.cc:234
-#, fuzzy
 msgid "About DCP-o-matic"
-msgstr "DVD-o-matic"
+msgstr "Su DVD-o-matic"
 
 #: src/tools/dcpomatic.cc:230
 msgid "Check for updates"
-msgstr ""
+msgstr "Controlla aggiornamenti"
 
 #: src/tools/dcpomatic.cc:633
 msgid "Could not load film %1 (%2)"
@@ -105,9 +104,8 @@ msgstr ""
 
 #: src/tools/dcpomatic.cc:337 src/tools/dcpomatic.cc:591
 #: src/tools/dcpomatic.cc:644
-#, fuzzy
 msgid "DCP-o-matic"
-msgstr "DVD-o-matic"
+msgstr "DCP-o-matic"
 
 #: src/tools/dcpomatic.cc:229
 msgid "Encoding servers..."
@@ -119,7 +117,7 @@ msgstr "Film modificato"
 
 #: src/tools/dcpomatic.cc:228
 msgid "Hints..."
-msgstr ""
+msgstr "Suggerimenti..."
 
 #: src/tools/dcpomatic.cc:223
 msgid "Make &KDMs..."
@@ -148,34 +146,38 @@ msgid ""
 "The DCP for this film will take up about %.1f Gb, and the disk that you are "
 "using only has %.1f Gb available.  Do you want to continue anyway?"
 msgstr ""
+"Il DCP di questo film occupa %.1f Gb, ma il disco che stai usando dispone di "
+"%.1f Gb liberi.  Vuoi continuare ugualmente?"
 
 #: src/tools/dcpomatic.cc:728
 msgid "The DCP-o-matic download server could not be contacted."
-msgstr ""
+msgstr "Il download server di DCP-o-matic non può essere contattato."
 
 #: src/tools/dcpomatic.cc:356
 msgid ""
 "The directory %1 already exists and is not empty.  Are you sure you want to "
 "use it?"
-msgstr ""
+msgstr "La cartella %1 esiste già e non Ã¨ vuota.  Sei sicuro di volerla usare?"
 
 #: src/tools/dcpomatic.cc:723
 msgid "There are no new versions of DCP-o-matic available."
-msgstr ""
+msgstr "Non ci sono nuove versioni di DCP-o-matic disponibili."
 
 #: src/tools/dcpomatic.cc:553
 msgid "There are unfinished jobs; are you sure you want to quit?"
-msgstr ""
+msgstr "C'è un processo in corso: sei sicuro di voler uscire?"
 
 #: src/tools/dcpomatic.cc:554
 msgid "Unfinished jobs"
-msgstr ""
+msgstr "Processo in corso"
 
 #: src/tools/dcpomatic.cc:395
 msgid ""
 "You did not select a folder.  Make sure that you select a folder before "
 "clicking Open."
 msgstr ""
+"Non hai selezionato una cartella. Assicurati di selezionare una cartella "
+"prima di cliccare Apri."
 
 #~ msgid "&Analyse audio"
 #~ msgstr "&Analizza audio"
index 38e4704b751e8882437b8d605e5fbb1415151f21..9b725cb86df7f15fdb34d1449dbbe6a803ae056c 100644 (file)
@@ -142,14 +142,14 @@ main (int argc, char* argv[])
 
        dcpomatic_setup ();
 
-       server = new ServerDescription (server_host, 1);
-       film.reset (new Film (film_dir));
-       film->read_metadata ();
-
-       shared_ptr<Player> player = film->make_player ();
-       player->disable_audio ();
-
        try {
+               server = new ServerDescription (server_host, 1);
+               film.reset (new Film (film_dir));
+               film->read_metadata ();
+               
+               shared_ptr<Player> player = film->make_player ();
+               player->disable_audio ();
+
                player->Video.connect (boost::bind (process_video, _1, _2, _3, _5));
                bool done = false;
                while (!done) {
index 0fd336676f217bde28aa410b7da95d7404e7d655..131d02b8155e19b07c26ef730b3b4d23c74e5d31 100644 (file)
@@ -11,17 +11,19 @@ def configure(conf):
 def build(bld):
     for t in ['dcpomatic_cli', 'dcpomatic_server_cli', 'server_test', 'dcpomatic_kdm', 'dcpomatic_create']:
         obj = bld(features = 'cxx cxxprogram')
-        obj.uselib = 'BOOST_THREAD OPENJPEG DCP CXML AVFORMAT AVFILTER AVCODEC AVUTIL SWSCALE POSTPROC WXWIDGETS QUICKMAIL'
+        obj.uselib = 'BOOST_THREAD BOOST_DATETIME OPENJPEG DCP CXML AVFORMAT AVFILTER AVCODEC AVUTIL SWSCALE POSTPROC WXWIDGETS QUICKMAIL'
         obj.includes = ['..']
         obj.use    = ['libdcpomatic']
         obj.source = '%s.cc' % t
         obj.target = t
+        if t == 'server_test':
+            obj.install_path = None
 
     if not bld.env.DISABLE_GUI:
         for t in ['dcpomatic', 'dcpomatic_batch', 'dcpomatic_server']:
             obj = bld(features = 'cxx cxxprogram')
-            obj.uselib = 'DCP OPENJPEG AVFORMAT AVFILTER AVCODEC AVUTIL SWSCALE POSTPROC CXML WXWIDGETS QUICKMAIL'
-            if bld.env.STATIC:
+            obj.uselib = 'BOOST_THREAD BOOST_DATETIME OPENJPEG DCP CXML AVFORMAT AVFILTER AVCODEC AVUTIL SWSCALE POSTPROC CXML WXWIDGETS QUICKMAIL'
+            if bld.env.BUILD_STATIC:
                 obj.uselib += ' GTK'
             obj.includes = ['..']
             obj.use    = ['libdcpomatic', 'libdcpomatic-wx']
index 5f801bfe406b9c0ae1119d50d06c53bb370b070e..5fa5014f080a1e3723c58e11fcc1f40a05619ecd 100644 (file)
@@ -95,6 +95,7 @@ AboutDialog::AboutDialog (wxWindow* parent)
        translated_by.Add (wxT ("Lilian Lefranc"));
        translated_by.Add (wxT ("Thierry Journet"));
        translated_by.Add (wxT ("Massimiliano Broggi"));
+       translated_by.Add (wxT ("William Fanelli"));
        translated_by.Add (wxT ("Manuel AC"));
        translated_by.Add (wxT ("Adam Klotblixt"));
        translated_by.Add (wxT ("Markus Raab"));
index 96de34d406744960db60c4aa072a0673699c9c2d..0868d931a8be1d38dc7b95e0c154afce4e544a51 100644 (file)
@@ -259,7 +259,9 @@ AudioPlot::plot_rms (wxGraphicsPath& path, int channel) const
                        p += pow (*j, 2);
                }
 
-               p = sqrt (p / smoothing.size ());
+               if (smoothing.size() > 0) {
+                       p = sqrt (p / smoothing.size ());
+               }
 
                path.AddLineToPoint (_db_label_width + i * _x_scale, y_for_linear (p));
        }
index a4a293918df44cedec1b4c5ddc0a4f3ab5587d07..deee65a5fca4dc07f7d401f0234386d9937257cf 100644 (file)
@@ -46,6 +46,7 @@ using std::min;
 using std::max;
 using std::cout;
 using std::list;
+using std::bad_alloc;
 using std::make_pair;
 using boost::shared_ptr;
 using boost::dynamic_pointer_cast;
@@ -127,7 +128,14 @@ FilmViewer::set_film (shared_ptr<Film> f)
                return;
        }
 
-       _player = f->make_player ();
+       try {
+               _player = f->make_player ();
+       } catch (bad_alloc) {
+               error_dialog (this, _("There is not enough free memory to do that."));
+               _film.reset ();
+               return;
+       }
+       
        _player->disable_audio ();
        _player->set_approximate_size ();
        _player->Video.connect (boost::bind (&FilmViewer::process_video, this, _1, _2, _5));
index 08852b886d3b04d907953880480d5ff831c67165..00d1ac09ab16e1ea89c6a876e48c2e5ae3c04c68 100644 (file)
@@ -8,14 +8,14 @@ msgstr ""
 "Project-Id-Version: IT VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-01-30 21:51+0000\n"
-"PO-Revision-Date: 2013-04-28 10:27+0100\n"
-"Last-Translator: Maci <macibro@gmail.com>\n"
+"PO-Revision-Date: 2014-02-03 10:46+0100\n"
+"Last-Translator: William Fanelli <william.f@impronte.com>\n"
 "Language-Team: \n"
-"Language: Italiano\n"
+"Language: it\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.5.5\n"
+"X-Generator: Poedit 1.6.3\n"
 
 #: src/wx/subtitle_panel.cc:48 src/wx/subtitle_panel.cc:57
 #: src/wx/subtitle_panel.cc:66
@@ -73,32 +73,31 @@ msgstr ""
 
 #: src/wx/update_dialog.cc:34
 msgid "A new version of DCP-o-matic is available."
-msgstr ""
+msgstr "Una nuova versione di DCP-o-matic Ã¨ disponibile"
 
 #: src/wx/about_dialog.cc:30
-#, fuzzy
 msgid "About DCP-o-matic"
-msgstr "DCP-o-matic"
+msgstr "Su DCP-o-matic"
 
 #: src/wx/kdm_dialog.cc:66
 msgid "Add Cinema..."
-msgstr ""
+msgstr "Aggiungi Cinema"
 
 #: src/wx/kdm_dialog.cc:73
 msgid "Add Screen..."
-msgstr ""
+msgstr "Aggiungi Schermo"
 
 #: src/wx/film_editor.cc:272
 msgid "Add file(s)..."
-msgstr ""
+msgstr "Aggiungi File"
 
 #: src/wx/film_editor.cc:274
 msgid "Add folder..."
-msgstr ""
+msgstr "Aggiungi cartella"
 
 #: src/wx/editable_list.h:61
 msgid "Add..."
-msgstr ""
+msgstr "Aggiungi..."
 
 #: src/wx/audio_dialog.cc:33 src/wx/audio_panel.cc:40
 msgid "Audio"
@@ -117,20 +116,19 @@ msgid "Audio Language (e.g. EN)"
 msgstr "Lingua dell'audio (es. EN)"
 
 #: src/wx/audio_panel.cc:81
-#, fuzzy
 msgid "Audio Stream"
-msgstr "Ritardo dell'audio"
+msgstr "Traccia Audio"
 
 #: src/wx/film_editor.cc:161
-#, fuzzy
 msgid "Audio channels"
-msgstr "canali"
+msgstr "Canali audio"
 
 #: src/wx/audio_mapping_view.cc:325
 #, c-format
 msgid ""
 "Audio will be passed from content channel %d to DCP channel %d unaltered."
 msgstr ""
+"L' audio sarà trasferito dal canale %d sorgente al canale %d DCP inalterato."
 
 #: src/wx/audio_mapping_view.cc:328
 #, c-format
@@ -138,6 +136,8 @@ msgid ""
 "Audio will be passed from content channel %d to DCP channel %d with gain "
 "%.1fdB."
 msgstr ""
+"L' audio sarà trasferito dal canale %d sorgente al canale %d DCP con "
+"guadagno di %.1fdB."
 
 #: src/wx/job_wrapper.cc:38
 #, c-format
@@ -169,9 +169,8 @@ msgid "Cancel"
 msgstr "Annulla"
 
 #: src/wx/audio_gain_dialog.cc:26
-#, fuzzy
 msgid "Channel gain"
-msgstr "Canali"
+msgstr "Guadagno audio"
 
 #: src/wx/audio_dialog.cc:44
 msgid "Channels"
@@ -179,62 +178,57 @@ msgstr "Canali"
 
 #: src/wx/config_dialog.cc:143
 msgid "Check for testing updates as well as stable ones"
-msgstr ""
+msgstr "Controlla per aggiornamenti test o stabili"
 
 #: src/wx/config_dialog.cc:139
 msgid "Check for updates on startup"
-msgstr ""
+msgstr "Controlla gli aggiornamentio alla partenza"
 
 #: src/wx/content_menu.cc:182
-#, fuzzy
 msgid "Choose a file"
-msgstr "Crea nella cartella"
+msgstr "Scegli un file"
 
 #: src/wx/film_editor.cc:767
 msgid "Choose a file or files"
-msgstr ""
+msgstr "Scegli uno o più file"
 
 #: src/wx/content_menu.cc:175 src/wx/film_editor.cc:790
-#, fuzzy
 msgid "Choose a folder"
-msgstr "Crea nella cartella"
+msgstr "Scegli una cartella"
 
 #: src/wx/content_colour_conversion_dialog.cc:33
 #: src/wx/preset_colour_conversion_dialog.cc:30 src/wx/video_panel.cc:164
 msgid "Colour conversion"
-msgstr ""
+msgstr "Conversione colore"
 
 #: src/wx/config_dialog.cc:65
 msgid "Colour conversions"
-msgstr ""
+msgstr "Conversioni colore"
 
 #: src/wx/film_editor.cc:132
-#, fuzzy
 msgid "Container"
-msgstr "Contenuto"
+msgstr "Contenitore"
 
 #: src/wx/film_editor.cc:85
 msgid "Content"
-msgstr "Contenuto"
+msgstr "Sorgente"
 
 #: src/wx/film_editor.cc:137
 msgid "Content Type"
-msgstr "Tipo di contenuto"
+msgstr "Tipo di sorgente"
 
 #: src/wx/audio_mapping_view.cc:273
-#, fuzzy
 msgid "Content channel"
-msgstr "1 canale"
+msgstr "Canale Sorgente"
 
 #: src/wx/video_panel.cc:335
 #, c-format
 msgid "Content frame rate %.4f\n"
-msgstr ""
+msgstr "Freq. fotogrammi sorgente %.4f\n"
 
 #: src/wx/dci_metadata_dialog.cc:35
-#, fuzzy
 msgid "Content version"
-msgstr "Tipo di contenuto"
+msgstr "Tipo di sorgente"
 
 #: src/wx/video_panel.cc:293
 #, fuzzy, c-format
@@ -243,7 +237,7 @@ msgstr "Il video originale Ã¨ %dx%d (%.2f:1)\n"
 
 #: src/wx/audio_dialog.cc:136
 msgid "Could not analyse audio."
-msgstr ""
+msgstr "Non posso analizzare l'audio."
 
 #: src/wx/film_viewer.cc:332
 #, c-format
@@ -275,7 +269,7 @@ msgstr ""
 
 #: src/wx/dci_metadata_dialog.cc:30
 msgid "DCI name"
-msgstr "Nome del DCP"
+msgstr "Nome DCI"
 
 #: src/wx/film_editor.cc:87 src/wx/kdm_dialog.cc:102
 msgid "DCP"
@@ -300,7 +294,7 @@ msgstr "Audio DCP-o-matic - %s"
 
 #: src/wx/config_dialog.cc:216
 msgid "Default DCI name details"
-msgstr "Dettagli del nome di default DCI"
+msgstr "Dettagli del nome DCI predefinito"
 
 #: src/wx/config_dialog.cc:229
 #, fuzzy
@@ -308,32 +302,28 @@ msgid "Default JPEG2000 bandwidth"
 msgstr "Banda passante JPEG2000"
 
 #: src/wx/config_dialog.cc:238
-#, fuzzy
 msgid "Default audio delay"
-msgstr "Tipo di contenuto"
+msgstr "Ritardo audio predefinito"
 
 #: src/wx/config_dialog.cc:220
-#, fuzzy
 msgid "Default container"
-msgstr "Tipo di contenuto"
+msgstr "Contenitore predefinito"
 
 #: src/wx/config_dialog.cc:224
-#, fuzzy
 msgid "Default content type"
-msgstr "Tipo di contenuto"
+msgstr "Tipo sorgente predefinito"
 
 #: src/wx/config_dialog.cc:208
 msgid "Default directory for new films"
-msgstr "Directory di default per i nuovi films"
+msgstr "Cartella predefinita per i nuovi films"
 
 #: src/wx/config_dialog.cc:200
-#, fuzzy
 msgid "Default duration of still images"
-msgstr "Directory di default per i nuovi films"
+msgstr "Durata predefinita immagini statiche"
 
 #: src/wx/config_dialog.cc:61
 msgid "Defaults"
-msgstr ""
+msgstr "Predefiniti"
 
 #: src/wx/film_editor.cc:128 src/wx/job_manager_view.cc:78
 msgid "Details..."
@@ -348,14 +338,12 @@ msgid "Down"
 msgstr ""
 
 #: src/wx/kdm_dialog.cc:68
-#, fuzzy
 msgid "Edit Cinema..."
-msgstr "Modifica..."
+msgstr "Modifica Cinema..."
 
 #: src/wx/kdm_dialog.cc:75
-#, fuzzy
 msgid "Edit Screen..."
-msgstr "Modifica..."
+msgstr "Modifica Schermo..."
 
 #: src/wx/audio_mapping_view.cc:136 src/wx/config_dialog.cc:217
 #: src/wx/video_panel.cc:157 src/wx/video_panel.cc:174
@@ -365,7 +353,7 @@ msgstr "Modifica..."
 
 #: src/wx/cinema_dialog.cc:35
 msgid "Email address for KDM delivery"
-msgstr ""
+msgstr "Indirizzo email per consegna KDM"
 
 #: src/wx/servers_list_dialog.cc:30
 #, fuzzy
@@ -379,7 +367,7 @@ msgstr "Servers di codifica"
 
 #: src/wx/film_editor.cc:157
 msgid "Encrypted"
-msgstr ""
+msgstr "Criptato"
 
 #: src/wx/dci_metadata_dialog.cc:59
 msgid "Facility (e.g. DLA)"
@@ -399,12 +387,11 @@ msgstr "Filtri"
 
 #: src/wx/content_menu.cc:52
 msgid "Find missing..."
-msgstr ""
+msgstr "Trova mancante..."
 
 #: src/wx/film_editor.cc:143
-#, fuzzy
 msgid "Frame Rate"
-msgstr "Frequenza fotogrammi del DCP"
+msgstr "Frequenza fotogrammi"
 
 #: src/wx/properties_dialog.cc:41
 msgid "Frames"
@@ -420,7 +407,7 @@ msgstr ""
 
 #: src/wx/kdm_dialog.cc:85
 msgid "From"
-msgstr ""
+msgstr "Da"
 
 #: src/wx/config_dialog.cc:135
 msgid "From address for KDM emails"
@@ -441,7 +428,7 @@ msgstr "Calcolatore del guadagno audio"
 #: src/wx/audio_gain_dialog.cc:31
 #, c-format
 msgid "Gain for content channel %d in DCP channel %d"
-msgstr ""
+msgstr "Guadagno per il canale sorgente %d nel canale DCP %d"
 
 #: src/wx/properties_dialog.cc:57
 msgid "Gb"
@@ -449,7 +436,7 @@ msgstr "Gb"
 
 #: src/wx/hints_dialog.cc:26
 msgid "Hints"
-msgstr ""
+msgstr "Suggerimenti"
 
 #: src/wx/servers_list_dialog.cc:40
 msgid "Host"
@@ -502,7 +489,7 @@ msgstr ""
 
 #: src/wx/film_editor.cc:290
 msgid "Keep video in sequence"
-msgstr ""
+msgstr "Tieni i video in sequenza"
 
 #: src/wx/audio_mapping_view.cc:276
 msgid "L"
@@ -518,7 +505,7 @@ msgstr ""
 
 #: src/wx/colour_conversion_editor.cc:49
 msgid "Linearise input gamma curve for low values"
-msgstr ""
+msgstr "Linearizza la curva del gamma in ingresso per piccoli valori"
 
 #: src/wx/audio_mapping_view.cc:292
 #, fuzzy
@@ -527,7 +514,7 @@ msgstr "s"
 
 #: src/wx/film_editor.cc:741
 msgid "MISSING: "
-msgstr ""
+msgstr "MANCANTE:"
 
 #: src/wx/config_dialog.cc:127
 #, fuzzy
@@ -541,11 +528,11 @@ msgstr "Nome utente del TMS"
 
 #: src/wx/kdm_dialog.cc:47
 msgid "Make KDMs"
-msgstr ""
+msgstr "Crea KDM"
 
 #: src/wx/colour_conversion_editor.cc:67
 msgid "Matrix"
-msgstr ""
+msgstr "Matrice"
 
 #: src/wx/config_dialog.cc:233 src/wx/film_editor.cc:180
 msgid "Mbit/s"
@@ -560,9 +547,8 @@ msgid "Miscellaneous"
 msgstr ""
 
 #: src/wx/video_panel.cc:281
-#, fuzzy
 msgid "Multiple content selected"
-msgstr "Tipo di contenuto"
+msgstr "Molteplici sorgenti selezionate"
 
 #: src/wx/dir_picker_ctrl.cc:51
 msgid "My Documents"
@@ -579,16 +565,16 @@ msgstr "Nuovo Film"
 
 #: src/wx/update_dialog.cc:36
 msgid "New versions of DCP-o-matic are available."
-msgstr ""
+msgstr "Una nuova versione di DCP-o-matic Ã¨ disponibile."
 
 #: src/wx/audio_mapping_view.cc:323
 #, c-format
 msgid "No audio will be passed from content channel %d to DCP channel %d."
-msgstr ""
+msgstr "Nessun audio sarà passato dal canale %d sorgente al canale %d del DCP"
 
 #: src/wx/video_panel.cc:198
 msgid "No stretch"
-msgstr ""
+msgstr "Nessuna distorsione"
 
 #: src/wx/video_panel.cc:155 src/wx/video_panel.cc:249
 msgid "None"
@@ -599,13 +585,12 @@ msgid "Off"
 msgstr ""
 
 #: src/wx/config_dialog.cc:119
-#, fuzzy
 msgid "Outgoing mail server"
-msgstr "Servers di codifica"
+msgstr "Mail server posta in uscita"
 
 #: src/wx/colour_conversion_editor.cc:78
 msgid "Output gamma"
-msgstr ""
+msgstr "Gamma in uscita"
 
 #: src/wx/dci_metadata_dialog.cc:63
 msgid "Package Type (e.g. OV)"
@@ -623,7 +608,7 @@ msgstr "Password del TMS"
 
 #: src/wx/job_manager_view.cc:72 src/wx/job_manager_view.cc:164
 msgid "Pause"
-msgstr ""
+msgstr "Pausa"
 
 #: src/wx/audio_dialog.cc:60
 msgid "Peak"
@@ -643,7 +628,7 @@ msgstr "Attendere prego; sto analizzando l'audio..."
 
 #: src/wx/timing_panel.cc:39
 msgid "Position"
-msgstr ""
+msgstr "Posizione"
 
 #: src/wx/audio_mapping_view.cc:280
 msgid "R"
@@ -663,23 +648,20 @@ msgid "Remove"
 msgstr "Rimuovi"
 
 #: src/wx/kdm_dialog.cc:70
-#, fuzzy
 msgid "Remove Cinema"
-msgstr "Rimuovi"
+msgstr "Rimuovi Cinema"
 
 #: src/wx/kdm_dialog.cc:77
-#, fuzzy
 msgid "Remove Screen"
-msgstr "Rimuovi"
+msgstr "Rimuovi Schermo"
 
 #: src/wx/repeat_dialog.cc:33
 msgid "Repeat"
 msgstr ""
 
 #: src/wx/repeat_dialog.cc:24
-#, fuzzy
 msgid "Repeat Content"
-msgstr "Seleziona il file con il contenuto"
+msgstr "Ripeti il contenuto"
 
 #: src/wx/content_menu.cc:50
 msgid "Repeat..."
@@ -687,7 +669,7 @@ msgstr ""
 
 #: src/wx/film_editor.cc:170
 msgid "Resolution"
-msgstr ""
+msgstr "Risoluzione"
 
 #: src/wx/job_manager_view.cc:167
 msgid "Resume"
@@ -695,7 +677,7 @@ msgstr ""
 
 #: src/wx/audio_mapping_view.cc:331
 msgid "Right click to change gain."
-msgstr ""
+msgstr "Clicca il tasto destro per cambiare guadagno."
 
 #: src/wx/video_panel.cc:101
 msgid "Right crop"
@@ -711,9 +693,8 @@ msgid "SMPTE"
 msgstr ""
 
 #: src/wx/video_panel.cc:134
-#, fuzzy
 msgid "Scale to"
-msgstr "Scaler"
+msgstr "Scala a"
 
 #: src/wx/video_panel.cc:320
 #, c-format
@@ -725,13 +706,12 @@ msgid "Scaler"
 msgstr "Scaler"
 
 #: src/wx/screen_dialog.cc:88
-#, fuzzy
 msgid "Select Certificate File"
-msgstr "Seleziona il file con il contenuto"
+msgstr "Seleziona il file del Certificato"
 
 #: src/wx/kdm_dialog.cc:136
 msgid "Send by email"
-msgstr ""
+msgstr "Manda per email"
 
 #: src/wx/server_dialog.cc:28
 msgid "Server"
@@ -762,9 +742,8 @@ msgid "Snap"
 msgstr ""
 
 #: src/wx/update_dialog.cc:43
-#, fuzzy
 msgid "Stable version "
-msgstr "Tipo di contenuto"
+msgstr "Versione stabile"
 
 #: src/wx/film_editor.cc:185
 msgid "Standard"
@@ -783,19 +762,16 @@ msgid "Subtitle Scale"
 msgstr "Scala dei Sottotitoli"
 
 #: src/wx/subtitle_panel.cc:70
-#, fuzzy
 msgid "Subtitle Stream"
-msgstr "Scala dei Sottotitoli"
+msgstr "Traccia sottotitoli"
 
 #: src/wx/subtitle_panel.cc:44
-#, fuzzy
 msgid "Subtitle X Offset"
-msgstr "Sfalsamento dei Sottotitoli"
+msgstr "Spostamento X dei Sottotitoli"
 
 #: src/wx/subtitle_panel.cc:53
-#, fuzzy
 msgid "Subtitle Y Offset"
-msgstr "Sfalsamento dei Sottotitoli"
+msgstr "Spostamento Y dei Sottotitoli"
 
 #: src/wx/subtitle_panel.cc:34
 msgid "Subtitles"
@@ -806,9 +782,8 @@ msgid "Supported by"
 msgstr ""
 
 #: src/wx/config_dialog.cc:69
-#, fuzzy
 msgid "TMS"
-msgstr "RMS"
+msgstr "TMS"
 
 #: src/wx/config_dialog.cc:305
 #, fuzzy
@@ -820,9 +795,8 @@ msgid "Territory (e.g. UK)"
 msgstr "Nazione (es. UK)"
 
 #: src/wx/update_dialog.cc:48
-#, fuzzy
 msgid "Test version "
-msgstr "Tipo di contenuto"
+msgstr "Versione di test"
 
 #: src/wx/content_menu.cc:223
 msgid ""
@@ -830,10 +804,12 @@ msgid ""
 "missing.  Either try again with the correct content file or remove the "
 "missing content."
 msgstr ""
+"Il/i file sorgenteo che hai specificato sono diversi da quelli mancanti. "
+"Riprova oppure rimuovi la sorgente mancante."
 
 #: src/wx/hints_dialog.cc:97
 msgid "There are no hints: everything looks good!"
-msgstr ""
+msgstr "Non ci sono suggerimenti: sembra tutto a posto!"
 
 #: src/wx/servers_list_dialog.cc:48
 msgid "Threads"
@@ -848,9 +824,8 @@ msgid "Time"
 msgstr "Tempo"
 
 #: src/wx/timeline_dialog.cc:32
-#, fuzzy
 msgid "Timeline"
-msgstr "Tempo"
+msgstr "Timeline"
 
 #: src/wx/film_editor.cc:282
 msgid "Timeline..."
@@ -869,14 +844,12 @@ msgid "Translated by"
 msgstr ""
 
 #: src/wx/timing_panel.cc:48
-#, fuzzy
 msgid "Trim from end"
-msgstr "Taglia fotogrammi"
+msgstr "Taglia dalla fine"
 
 #: src/wx/timing_panel.cc:45
-#, fuzzy
 msgid "Trim from start"
-msgstr "Taglia fotogrammi"
+msgstr "Taglia dall'inizio"
 
 #: src/wx/audio_dialog.cc:55 src/wx/video_panel.cc:77
 msgid "Type"
@@ -884,15 +857,15 @@ msgstr "Tipo"
 
 #: src/wx/kdm_dialog.cc:91
 msgid "Until"
-msgstr ""
+msgstr "Fino a"
 
 #: src/wx/film_editor.cc:278
 msgid "Up"
-msgstr ""
+msgstr "Su"
 
 #: src/wx/update_dialog.cc:27
 msgid "Update"
-msgstr ""
+msgstr "Aggiorna"
 
 #: src/wx/film_editor.cc:126
 msgid "Use DCI name"
@@ -900,30 +873,27 @@ msgstr "Usa nome DCI"
 
 #: src/wx/config_dialog.cc:369
 msgid "Use all servers"
-msgstr ""
+msgstr "Usa tutti i server"
 
 #: src/wx/film_editor.cc:147
 msgid "Use best"
 msgstr "Usa la migliore"
 
 #: src/wx/content_colour_conversion_dialog.cc:41
-#, fuzzy
 msgid "Use preset"
-msgstr "Usa la migliore"
+msgstr "Usa predefinito"
 
 #: src/wx/config_dialog.cc:309
-#, fuzzy
 msgid "User name"
-msgstr "Usa nome DCI"
+msgstr "Nome utente"
 
 #: src/wx/video_panel.cc:70
 msgid "Video"
 msgstr "Video"
 
 #: src/wx/timing_panel.cc:56
-#, fuzzy
 msgid "Video frame rate"
-msgstr "Frequenza fotogrammi del DCP"
+msgstr "Frequenza fotogrammi video"
 
 #: src/wx/subtitle_panel.cc:39
 msgid "With Subtitles"
@@ -943,6 +913,8 @@ msgid ""
 "You have %d files that look like they are VOB files from DVD. You should "
 "join them to ensure smooth joins between the files."
 msgstr ""
+"Ci sono %d file che sembrano essere DVD VOB. Dovresti unirli per assicurare "
+"una giunta senza interruzioni tra i file."
 
 #: src/wx/hints_dialog.cc:76
 #, c-format
@@ -950,18 +922,25 @@ msgid ""
 "Your DCP frame rate (%d fps) may cause problems in a few (mostly older) "
 "projectors.  Use 24 or 48 frames per second to be on the safe side."
 msgstr ""
+"La frequenza fotogrammi scelta per questo DCP  (%d fps) potrebbe creare "
+"problemi in alcuni (per lo più vecchi) proiettori. Usa 24 o 48 frame al "
+"secondo se vuoi esssere sicuro."
 
 #: src/wx/hints_dialog.cc:66
 msgid ""
 "Your DCP has an odd number of audio channels.  This is very likely to cause "
 "problems on playback."
 msgstr ""
+"Il vostro DCP ha un numero dispari di canali audio. Questo può causare "
+"problemi durante la riproduzione."
 
 #: src/wx/hints_dialog.cc:70
 msgid ""
 "Your DCP has fewer than 6 audio channels.  This may cause problems on some "
 "projectors."
 msgstr ""
+"Il vostro DCP ha meno di 6 canali audio. Questo può causare problemi su "
+"alcuni proiettori."
 
 #: src/wx/timeline.cc:213
 #, fuzzy
index 2119e781322f2cedae4e3083ffd20b7ead4ffda2..ac26c77a9125d7ab31c2a34620831d980b5d6bc4 100644 (file)
@@ -474,7 +474,7 @@ void
 DCPTimeline::setup_pixels_per_time_unit ()
 {
        shared_ptr<const Film> film = _film.lock ();
-       if (!film) {
+       if (!film || film->length() == 0) {
                return;
        }
 
index 9de32d39ebdb1b769c074a1443d8977e174436f7..1ffaa6097fd276cc3e086c8e3171dc5249a2a041 100644 (file)
@@ -47,13 +47,13 @@ sources = """
 
 def configure(conf):
     args = '--cppflags --cxxflags'
-    if not conf.env.STATIC:
+    if not conf.env.BUILD_STATIC:
         args += ' --libs std,richtext'
 
     conf.check_cfg(msg='Checking for wxWidgets', package='', path=conf.options.wx_config, args=args,
                    uselib_store='WXWIDGETS', mandatory=True)
 
-    if conf.env.STATIC:
+    if conf.env.BUILD_STATIC:
        # wx-config returns its static libraries as full paths, without -l prefixes, which confuses
         # check_cfg(), so just hard-code it all.
         conf.env.STLIB_WXWIDGETS = ['wx_gtk2u_richtext-3.0', 'wx_gtk2u_xrc-3.0', 'wx_gtk2u_qa-3.0', 'wx_baseu_net-3.0', 'wx_gtk2u_html-3.0',
@@ -67,14 +67,14 @@ def configure(conf):
         conf.fatal('wxwidgets version 3.0.0 is required; %s found' % wx_version)
 
 def build(bld):
-    if bld.env.STATIC:
+    if bld.env.BUILD_STATIC:
         obj = bld(features = 'cxx cxxstlib')
     else:
         obj = bld(features = 'cxx cxxshlib')
 
     obj.name   = 'libdcpomatic-wx'
     obj.export_includes = ['..']
-    obj.uselib = 'WXWIDGETS'
+    obj.uselib = 'WXWIDGETS DCP'
     if bld.env.TARGET_LINUX:
         obj.uselib += ' GTK'
     obj.use = 'libdcpomatic'
index 5bee3603b2e8c71df95ab07cf5681a9dd8478a25..3be251b3a75129c0daa83f8182ab19f7df51dc42 100644 (file)
@@ -33,10 +33,9 @@ resampler_test_one (int from, int to)
        int total_out = 0;
 
        /* 3 hours */
-       int64_t const N = from * 60 * 60 * 3;
-
+       int64_t const N = int64_t (from) * 60 * 60 * 3;
+               
        /* XXX: no longer checks anything */
-       
        for (int64_t i = 0; i < N; i += 1000) {
                shared_ptr<AudioBuffers> a (new AudioBuffers (1, 1000));
                a->make_silent ();
index 24daa7762001dc3d0ee764d58030cd4f6625a180..ec8dfd42c7efb53780e591308f2dd5319ff3fbff 100644 (file)
@@ -12,7 +12,7 @@ def configure(conf):
 def build(bld):
     obj = bld(features='cxx cxxprogram')
     obj.name   = 'unit-tests'
-    obj.uselib = 'BOOST_TEST DCP OPENJPEG AVFORMAT AVFILTER AVCODEC AVUTIL SWSCALE POSTPROC CXML'
+    obj.uselib = 'BOOST_TEST BOOST_THREAD DCP OPENJPEG AVFORMAT AVFILTER AVCODEC AVUTIL SWSCALE POSTPROC CXML'
     obj.use    = 'libdcpomatic'
     obj.source = """
                  4k_test.cc
diff --git a/wscript b/wscript
index 6c97047fcdf763ef7fceb72e424928d692801159..86cddf7f2a39ff4d355d9ea8ebbe721566b12d78 100644 (file)
--- a/wscript
+++ b/wscript
@@ -3,37 +3,176 @@ import os
 import sys
 
 APPNAME = 'dcpomatic'
-VERSION = '1.64.0devel'
+VERSION = '1.64.11devel'
 
 def options(opt):
     opt.load('compiler_cxx')
     opt.load('winres')
 
-    opt.add_option('--enable-debug', action='store_true', default=False, help='build with debugging information and without optimisation')
-    opt.add_option('--disable-gui', action='store_true', default=False, help='disable building of GUI tools')
-    opt.add_option('--target-windows', action='store_true', default=False, help='set up to do a cross-compile to Windows')
-    opt.add_option('--static', action='store_true', default=False, help='build statically, and link statically to libdcp and FFmpeg')
-    opt.add_option('--magickpp-config', action='store', default='Magick++-config', help='path to Magick++-config')
-    opt.add_option('--wx-config', action='store', default='wx-config', help='path to wx-config')
+    opt.add_option('--enable-debug',      action='store_true', default=False, help='build with debugging information and without optimisation')
+    opt.add_option('--disable-gui',       action='store_true', default=False, help='disable building of GUI tools')
+    opt.add_option('--target-windows',    action='store_true', default=False, help='set up to do a cross-compile to make a Windows package')
+    opt.add_option('--target-debian',     action='store_true', default=False, help='set up to compile for a Debian/Ubuntu package')
+    opt.add_option('--target-centos',     action='store_true', default=False, help='set up to compile for a Centos package')
+    opt.add_option('--magickpp-config',   action='store',      default='Magick++-config', help='path to Magick++-config')
+    opt.add_option('--wx-config',         action='store',      default='wx-config', help='path to wx-config')
     opt.add_option('--address-sanitizer', action='store_true', default=False, help='build with address sanitizer')
+    opt.add_option('--install-prefix',                         default=None,  help='prefix of where DCP-o-matic will be installed')
+
+def static_ffmpeg(conf):
+    conf.check_cfg(package='libavformat', args='--cflags', uselib_store='AVFORMAT', mandatory=True)
+    conf.env.STLIB_AVFORMAT = ['avformat']
+    conf.check_cfg(package='libavfilter', args='--cflags', uselib_store='AVFILTER', mandatory=True)
+    conf.env.STLIB_AVFILTER = ['avfilter', 'swresample']
+    conf.check_cfg(package='libavcodec', args='--cflags', uselib_store='AVCODEC', mandatory=True)
+    conf.env.STLIB_AVCODEC = ['avcodec']
+    conf.env.LIB_AVCODEC = ['z']
+    conf.check_cfg(package='libavutil', args='--cflags', uselib_store='AVUTIL', mandatory=True)
+    conf.env.STLIB_AVUTIL = ['avutil']
+    conf.check_cfg(package='libswscale', args='--cflags', uselib_store='SWSCALE', mandatory=True)
+    conf.env.STLIB_SWSCALE = ['swscale']
+    conf.check_cfg(package='libswresample', args='--cflags', uselib_store='SWRESAMPLE', mandatory=True)
+    conf.env.STLIB_SWRESAMPLE = ['swresample']
+    conf.check_cfg(package='libpostproc', args='--cflags', uselib_store='POSTPROC', mandatory=True)
+    conf.env.STLIB_POSTPROC = ['postproc']
+
+def dynamic_ffmpeg(conf):
+    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=True)
+    conf.check_cfg(package='libpostproc', args='--cflags --libs', uselib_store='POSTPROC', mandatory=True)
+
+def static_openjpeg(conf):
+    conf.check_cfg(package='libopenjpeg', args='--cflags', atleast_version='1.5.0', uselib_store='OPENJPEG', mandatory=True)
+    conf.check_cfg(package='libopenjpeg', args='--cflags', max_version='1.5.1', mandatory=True)
+    conf.env.STLIB_OPENJPEG = ['openjpeg']
+
+def dynamic_openjpeg(conf):
+    conf.check_cfg(package='libopenjpeg', args='--cflags --libs', atleast_version='1.5.0', uselib_store='OPENJPEG', mandatory=True)
+    conf.check_cfg(package='libopenjpeg', args='--cflags --libs', max_version='1.5.1', mandatory=True)
+
+def static_dcp(conf, static_boost, static_xmlpp, static_xmlsec, static_ssh):
+    conf.check_cfg(package='libdcp', atleast_version='0.92', args='--cflags', uselib_store='DCP', mandatory=True)
+    conf.env.DEFINES_DCP = [f.replace('\\', '') for f in conf.env.DEFINES_DCP]
+    conf.env.STLIB_DCP = ['dcp', 'asdcp-libdcp', 'kumu-libdcp']
+    conf.env.LIB_DCP = ['glibmm-2.4', 'ssl', 'crypto', 'bz2', 'xslt']
+
+    if static_boost:
+        conf.env.STLIB_DCP.append('boost_system')
 
-def pkg_config_args(conf):
-    if conf.env.STATIC:
-        return '--cflags'
+    if static_xmlpp:
+        conf.env.STLIB_DCP.append('xml++-2.6')
     else:
-        return '--cflags --libs'
+        conf.env.LIB_DCP.append('xml++-2.6')
+
+    if static_xmlsec:
+        conf.env.STLIB_DCP.append('xmlsec1-openssl')
+        conf.env.STLIB_DCP.append('xmlsec1')
+    else:
+        conf.env.LIB_DCP.append('xmlsec1-openssl')
+        conf.env.LIB_DCP.append('xmlsec1')
+
+    if static_ssh:
+        conf.env.STLIB_DCP.append('ssh')
+    else:
+        conf.env.LIB_DCP.append('ssh')
+
+def dynamic_dcp(conf):
+    conf.check_cfg(package='libdcp', atleast_version='0.92', args='--cflags --libs', uselib_store='DCP', mandatory=True)
+    conf.env.DEFINES_DCP = [f.replace('\\', '') for f in conf.env.DEFINES_DCP]
+
+def dynamic_ssh(conf):
+    conf.check_cc(fragment="""
+                           #include <libssh/libssh.h>\n
+                           int main () {\n
+                           ssh_session s = ssh_new ();\n
+                           return 0;\n
+                           }
+                           """, msg='Checking for library libssh', mandatory=True, lib='ssh', uselib_store='SSH')
+
+def dynamic_boost(conf, lib_suffix, thread):
+    conf.check_cxx(fragment="""
+                            #include <boost/version.hpp>\n
+                            #if BOOST_VERSION < 104500\n
+                            #error boost too old\n
+                            #endif\n
+                            int main(void) { return 0; }\n
+                            """,
+                   mandatory=True,
+                   msg='Checking for boost library >= 1.45',
+                   okmsg='yes',
+                   errmsg='too old\nPlease install boost version 1.45 or higher.')
+
+    conf.check_cxx(fragment="""
+                           #include <boost/thread.hpp>\n
+                           int main() { boost::thread t (); }\n
+                           """, msg='Checking for boost threading library',
+                           libpath='/usr/local/lib',
+                            lib=[thread, 'boost_system%s' % lib_suffix],
+                            uselib_store='BOOST_THREAD')
+
+    conf.check_cxx(fragment="""
+                           #include <boost/filesystem.hpp>\n
+                           int main() { boost::filesystem::copy_file ("a", "b"); }\n
+                           """, msg='Checking for boost filesystem library',
+                            libpath='/usr/local/lib',
+                            lib=['boost_filesystem%s' % lib_suffix, 'boost_system%s' % lib_suffix],
+                            uselib_store='BOOST_FILESYSTEM')
+
+    conf.check_cxx(fragment="""
+                           #include <boost/date_time.hpp>\n
+                           int main() { boost::gregorian::day_clock::local_day(); }\n
+                           """, msg='Checking for boost datetime library',
+                            libpath='/usr/local/lib',
+                            lib=['boost_date_time%s' % lib_suffix, 'boost_system%s' % lib_suffix],
+                            uselib_store='BOOST_DATETIME')
+
+    conf.check_cxx(fragment="""
+                           #include <boost/signals2.hpp>\n
+                           int main() { boost::signals2::signal<void (int)> x; }\n
+                           """,
+                            msg='Checking for boost signals2 library',
+                            uselib_store='BOOST_SIGNALS2')
+
+def static_boost(conf, lib_suffix):
+    conf.env.STLIB_BOOST_THREAD = ['boost_thread']
+    conf.env.STLIB_BOOST_FILESYSTEM = ['boost_filesystem%s' % lib_suffix]
+    conf.env.STLIB_BOOST_DATETIME = ['boost_date_time%s' % lib_suffix, 'boost_system%s' % lib_suffix]
+    conf.env.STLIB_BOOST_SIGNALS2 = ['boost_signals2']
+
+def dynamic_quickmail(conf):
+    conf.check_cxx(fragment="""
+                            #include <quickmail.h>
+                            int main(void) { quickmail_initialize (); }
+                            """,
+                   mandatory=True,
+                   msg='Checking for libquickmail',
+                   libpath='/usr/local/lib',
+                   lib=['quickmail', 'curl'],
+                   uselib_store='QUICKMAIL')
 
 def configure(conf):
     conf.load('compiler_cxx')
     if conf.options.target_windows:
         conf.load('winres')
 
+    # conf.options -> conf.env
     conf.env.TARGET_WINDOWS = conf.options.target_windows
     conf.env.DISABLE_GUI = conf.options.disable_gui
-    conf.env.STATIC = conf.options.static
+    conf.env.TARGET_DEBIAN = conf.options.target_debian
+    conf.env.TARGET_CENTOS = conf.options.target_centos
     conf.env.VERSION = VERSION
     conf.env.TARGET_OSX = sys.platform == 'darwin'
     conf.env.TARGET_LINUX = not conf.env.TARGET_WINDOWS and not conf.env.TARGET_OSX
+    # true if we should build dcpomatic/libdcpomatic/libdcpomatic-wx statically
+    conf.env.BUILD_STATIC = conf.options.target_debian or conf.options.target_centos
+    if conf.options.install_prefix is None:
+        conf.env.INSTALL_PREFIX = conf.env.PREFIX
+    else:
+        conf.env.INSTALL_PREFIX = conf.options.install_prefix
 
     # Common CXXFLAGS
     conf.env.append_value('CXXFLAGS', ['-D__STDC_CONSTANT_MACROS', '-D__STDC_LIMIT_MACROS', '-msse', '-mfpmath=sse', '-ffast-math', '-fno-strict-aliasing',
@@ -48,7 +187,11 @@ def configure(conf):
         conf.env.append_value('CXXFLAGS', ['-fsanitize=address', '-fno-omit-frame-pointer'])
         conf.env.append_value('LINKFLAGS', ['-fsanitize=address'])
 
-    # Windows-specific
+    #
+    # Platform-specific CFLAGS hacks and other tinkering
+    #
+
+    # Windows
     if conf.env.TARGET_WINDOWS:
         conf.env.append_value('CXXFLAGS', ['-DDCPOMATIC_WINDOWS', '-DWIN32_LEAN_AND_MEAN', '-DBOOST_USE_WINDOWS_H', '-DUNICODE', '-DBOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN'])
         wxrc = os.popen('wx-config --rescomp').read().split()[1:]
@@ -65,7 +208,7 @@ def configure(conf):
         boost_lib_suffix = '-mt'
         boost_thread = 'boost_thread_win32-mt'
 
-    # POSIX-specific
+    # POSIX
     if conf.env.TARGET_LINUX or conf.env.TARGET_OSX:
         conf.env.append_value('CXXFLAGS', '-DDCPOMATIC_POSIX')
         conf.env.append_value('CXXFLAGS', '-DPOSIX_LOCALE_PREFIX="%s/share/locale"' % conf.env['PREFIX'])
@@ -74,127 +217,54 @@ def configure(conf):
         boost_thread = 'boost_thread'
         conf.env.append_value('LINKFLAGS', '-pthread')
 
-    # Linux-specific
+    # Linux
     if conf.env.TARGET_LINUX:
         conf.env.append_value('CXXFLAGS', '-DDCPOMATIC_LINUX')
+
+    if conf.env.TARGET_DEBIAN:
         # libxml2 seems to be linked against this on Ubuntu but it doesn't mention it in its .pc file
         conf.check_cfg(package='liblzma', args='--cflags --libs', uselib_store='LZMA', mandatory=True)
-        if not conf.env.DISABLE_GUI:
-            if conf.env.STATIC:
-                conf.check_cfg(package='gtk+-2.0', args='--cflags --libs', uselib_store='GTK', mandatory=True)
-            else:
-                # On Linux we need to be able to include <gtk/gtk.h> to check GTK's version
-                conf.check_cfg(package='gtk+-2.0', args='--cflags', uselib_store='GTK', mandatory=True)
-
-    # OSX-specific
+        
+    if not conf.env.DISABLE_GUI and conf.env.TARGET_LINUX:
+        conf.check_cfg(package='gtk+-2.0', args='--cflags --libs', uselib_store='GTK', mandatory=True)
+
+    # OSX
     if conf.env.TARGET_OSX:
         conf.env.append_value('CXXFLAGS', '-DDCPOMATIC_OSX')
         conf.env.append_value('LINKFLAGS', '-headerpad_max_install_names')
 
-    # Dependencies which are dynamically linked everywhere except --static
-    # Get libs only when we are dynamically linking
-    conf.check_cfg(package='libdcp',        atleast_version='0.92', args=pkg_config_args(conf), uselib_store='DCP',  mandatory=True)
-    # Remove erroneous escaping of quotes from xmlsec1 defines
-    conf.env.DEFINES_DCP = [f.replace('\\', '') for f in conf.env.DEFINES_DCP]
-    conf.check_cfg(package='libcxml',       atleast_version='0.08', args=pkg_config_args(conf), uselib_store='CXML', mandatory=True)
-    conf.check_cfg(package='libavformat',   args=pkg_config_args(conf), uselib_store='AVFORMAT',   mandatory=True)
-    conf.check_cfg(package='libavfilter',   args=pkg_config_args(conf), uselib_store='AVFILTER',   mandatory=True)
-    conf.check_cfg(package='libavcodec',    args=pkg_config_args(conf), uselib_store='AVCODEC',    mandatory=True)
-    conf.check_cfg(package='libavutil',     args=pkg_config_args(conf), uselib_store='AVUTIL',     mandatory=True)
-    conf.check_cfg(package='libswscale',    args=pkg_config_args(conf), uselib_store='SWSCALE',    mandatory=True)
-    conf.check_cfg(package='libswresample', args=pkg_config_args(conf), uselib_store='SWRESAMPLE', mandatory=True)
-    conf.check_cfg(package='libpostproc',   args=pkg_config_args(conf), uselib_store='POSTPROC',   mandatory=True)
-    conf.check_cfg(package='libopenjpeg',   args=pkg_config_args(conf), atleast_version='1.5.0', uselib_store='OPENJPEG', mandatory=True)
-    conf.check_cfg(package='libopenjpeg',   args=pkg_config_args(conf), max_version='1.5.1', mandatory=True)
-
-    if conf.env.STATIC:
-        # This is hackio grotesquio for static builds (ie for .deb packages).  We need to link some things
-        # statically and some dynamically, or things get horribly confused and the dynamic linker (I think)
-        # crashes.  These calls do what the check_cfg calls would have done, but specify the
-        # different bits as static or dynamic as required.  It'll break if you look at it funny, but
-        # I think anyone else who builds would do so dynamically.
-        conf.env.STLIB_CXML       = ['cxml']
-        conf.env.STLIB_DCP        = ['dcp', 'asdcp-libdcp', 'kumu-libdcp']
-        conf.env.LIB_DCP          = ['glibmm-2.4', 'xml++-2.6', 'ssl', 'crypto', 'bz2', 'xmlsec1', 'xmlsec1-openssl', 'xslt']
-        conf.env.STLIB_CXML       = ['cxml']
-        conf.env.STLIB_AVFORMAT   = ['avformat']
-        conf.env.STLIB_AVFILTER   = ['avfilter', 'swresample']
-        conf.env.STLIB_AVCODEC    = ['avcodec']
-        conf.env.LIB_AVCODEC      = ['z']
-        conf.env.STLIB_AVUTIL     = ['avutil']
-        conf.env.STLIB_SWSCALE    = ['swscale']
-        conf.env.STLIB_POSTPROC   = ['postproc']
-        conf.env.STLIB_SWRESAMPLE = ['swresample']
-        conf.env.STLIB_OPENJPEG   = ['openjpeg']
-        conf.env.STLIB_QUICKMAIL  = ['quickmail']
-    else:
-        conf.check_cxx(fragment="""
-                            #include <quickmail.h>
-                            int main(void) { quickmail_initialize (); }
-                            """,
-                       mandatory=True,
-                       msg='Checking for libquickmail',
-                       libpath='/usr/local/lib',
-                       lib=['quickmail', 'curl'],
-                       uselib_store='QUICKMAIL')
-
-    # Dependencies which are always dynamically linked
-    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)
-    conf.check_cfg(package= '', path=conf.options.magickpp_config, args='--cppflags --cxxflags --libs', uselib_store='MAGICK', mandatory=True)
-    conf.check_cfg(package='libxml++-2.6', args='--cflags --libs', uselib_store='XML++', mandatory=True)
-    conf.check_cfg(package='libcurl', args='--cflags --libs', uselib_store='CURL', mandatory=True)
-    conf.check_cfg(package='libzip', args='--cflags --libs', uselib_store='ZIP', mandatory=True)
-    conf.check_cfg(package='pangomm-1.4', args='--cflags --libs', uselib_store='PANGOMM', mandatory=True)
-    conf.check_cfg(package='cairomm-1.0', args='--cflags --libs', uselib_store='CAIROMM', mandatory=True)
-
-    conf.check_cxx(fragment="""
-                            #include <boost/version.hpp>\n
-                            #if BOOST_VERSION < 104500\n
-                            #error boost too old\n
-                            #endif\n
-                            int main(void) { return 0; }\n
-                            """,
-                   mandatory=True,
-                   msg='Checking for boost library >= 1.45',
-                   okmsg='yes',
-                   errmsg='too old\nPlease install boost version 1.45 or higher.')
+    #
+    # Dependencies.
+    # There's probably a neater way of expressing these, but I've gone for brute force for now.
+    #
+
+    if conf.env.TARGET_DEBIAN:
+        conf.check_cfg(package='libcxml', atleast_version='0.08', args='--cflags', uselib_store='CXML', mandatory=True)
+        conf.env.STLIB_CXML = ['cxml']
+        conf.check_cfg(package='libxml++-2.6', args='--cflags --libs', uselib_store='XML++', mandatory=True)
+        conf.check_cfg(package='libcurl', args='--cflags --libs', uselib_store='CURL', mandatory=True)
+        conf.env.STLIB_QUICKMAIL = ['quickmail']
+        static_ffmpeg(conf)
+        static_openjpeg(conf)
+        static_dcp(conf, False, False, False, False)
+        dynamic_boost(conf, boost_lib_suffix, boost_thread)
+
+    if conf.env.TARGET_CENTOS:
+        conf.check_cfg(package='libcxml', atleast_version='0.08', args='--cflags --libs-only-L', uselib_store='CXML', mandatory=True)
+        conf.env.STLIB_CXML = ['cxml', 'boost_filesystem']
+        conf.check_cfg(package='libcurl', args='--cflags --libs-only-L', uselib_store='CURL', mandatory=True)
+        conf.env.STLIB_CURL = ['curl']
+        conf.env.LIB_CURL = ['ssh2', 'idn']
+        conf.env.STLIB_QUICKMAIL = ['quickmail', 'curl']
+        conf.env.LIB_QUICKMAIL = ['ssh2', 'idn']
+        static_ffmpeg(conf)
+        static_openjpeg(conf)
+        static_dcp(conf, True, True, True, True)
+        static_boost(conf, boost_lib_suffix)
 
-    conf.check_cc(fragment="""
-                           #include <libssh/libssh.h>\n
-                           int main () {\n
-                           ssh_session s = ssh_new ();\n
-                           return 0;\n
-                           }
-                           """, msg='Checking for library libssh', mandatory=True, lib='ssh', uselib_store='SSH')
-
-    conf.check_cxx(fragment="""
-                           #include <boost/thread.hpp>\n
-                           int main() { boost::thread t (); }\n
-                           """, msg='Checking for boost threading library',
-                           libpath='/usr/local/lib',
-                            lib=[boost_thread, 'boost_system%s' % boost_lib_suffix],
-                            uselib_store='BOOST_THREAD')
-
-    conf.check_cxx(fragment="""
-                           #include <boost/filesystem.hpp>\n
-                           int main() { boost::filesystem::copy_file ("a", "b"); }\n
-                           """, msg='Checking for boost filesystem library',
-                            libpath='/usr/local/lib',
-                            lib=['boost_filesystem%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix],
-                            uselib_store='BOOST_FILESYSTEM')
-
-    conf.check_cxx(fragment="""
-                           #include <boost/date_time.hpp>\n
-                           int main() { boost::gregorian::day_clock::local_day(); }\n
-                           """, msg='Checking for boost datetime library',
-                            libpath='/usr/local/lib',
-                            lib=['boost_date_time%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix],
-                            uselib_store='BOOST_DATETIME')
-
-    # Only Windows versions require boost::locale, which is handy, as it was only introduced in
-    # boost 1.48 and so isn't (easily) available on old Ubuntus.
     if conf.env.TARGET_WINDOWS:
+        conf.check_cfg(package='libxml++-2.6', args='--cflags --libs', uselib_store='XML++', mandatory=True)
+        conf.check_cfg(package='libcurl', args='--cflags --libs', uselib_store='CURL', mandatory=True)
         conf.check_cxx(fragment="""
                                #include <boost/locale.hpp>\n
                                int main() { std::locale::global (boost::locale::generator().generate ("")); }\n
@@ -202,13 +272,32 @@ def configure(conf):
                                 libpath='/usr/local/lib',
                                 lib=['boost_locale%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix],
                                 uselib_store='BOOST_LOCALE')
+        dynamic_quickmail(conf)
+        dynamic_boost(conf, boost_lib_suffix, boost_thread)
+        dynamic_ffmpeg(conf)
+        dynamic_openjpeg(conf)
+        dynamic_dcp(conf)
+        dynamic_ssh(conf)
+
+    # Not packaging; just a straight build
+    if not conf.env.TARGET_WINDOWS and not conf.env.TARGET_DEBIAN and not conf.env.TARGET_CENTOS:
+        conf.check_cfg(package='libcxml', atleast_version='0.08', args='--cflags --libs', uselib_store='CXML', mandatory=True)
+        conf.check_cfg(package='libxml++-2.6', args='--cflags --libs', uselib_store='XML++', mandatory=True)
+        conf.check_cfg(package='libcurl', args='--cflags --libs', uselib_store='CURL', mandatory=True)
+        dynamic_quickmail(conf)
+        dynamic_boost(conf, boost_lib_suffix, boost_thread)
+        dynamic_ffmpeg(conf)
+        dynamic_dcp(conf)
+        dynamic_openjpeg(conf)
+        dynamic_ssh(conf)
 
-    conf.check_cxx(fragment="""
-                           #include <boost/signals2.hpp>\n
-                           int main() { boost::signals2::signal<void (int)> x; }\n
-                           """,
-                            msg='Checking for boost signals2 library',
-                            uselib_store='BOOST_SIGNALS2')
+    # Dependencies which are always dynamically linked
+    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)
+    conf.check_cfg(package= '', path=conf.options.magickpp_config, args='--cppflags --cxxflags --libs', uselib_store='MAGICK', mandatory=True)
+    conf.check_cfg(package='libzip', args='--cflags --libs', uselib_store='ZIP', mandatory=True)
+    conf.check_cfg(package='pangomm-1.4', args='--cflags --libs', uselib_store='PANGOMM', mandatory=True)
+    conf.check_cfg(package='cairomm-1.0', args='--cflags --libs', uselib_store='CAIROMM', mandatory=True)
 
     conf.check_cc(fragment="""
                            #include <glib.h>