+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.
-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.
--- /dev/null
+DCP-o-matic is a program to generate DCPs (digital content packages) for digital cinema.
+
+Please see [dcpomatic.com](http://dcpomatic.com/) for details.
+++ /dev/null
-things to put back
- frame rate description
- trust content header?
- overall length?
- trim method (trim in general)
- A/B
-
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
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,''
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'
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])
-dcpomatic (1.64.0-1) UNRELEASED; urgency=low
+dcpomatic (1.64.11-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.
+ * 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
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
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 \
<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.
<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>
The first option on this tab is the ‘type’ 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>
</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>
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>
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
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"
--- /dev/null
+<?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>
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
--- /dev/null
+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
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
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
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'])
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
_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;
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 */
#include "ffmpeg.h"
#include "ffmpeg_content.h"
#include "exceptions.h"
+#include "util.h"
#include "i18n.h"
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;
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);
/* Constructor for tests */
FFmpegAudioStream ()
: FFmpegStream ("", 0)
+ , frame_rate (0)
+ , channels (0)
, mapping (1)
{}
};
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) {
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);
}
}
} 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 {
}
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);
}
}
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);
}
for (ContentList::iterator i = content.begin(); i != content.end(); ++i) {
+ if (!(*i)->paths_valid ()) {
+ continue;
+ }
+
shared_ptr<Decoder> decoder;
optional<FrameRateChange> frc;
} else if (property == ContentProperty::PATH) {
+ _have_valid_pieces = false;
Changed (frequent);
}
}
"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]"
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)"
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."
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"
"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
"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"
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"
#: 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"
#: src/lib/ratio.cc:43
msgid "Full frame"
-msgstr ""
+msgstr "Schermo intero"
#: src/lib/scaler.cc:65
msgid "Gaussian"
#: 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 ""
#: 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
"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"
#: src/lib/colour_conversion.cc:145
msgid "Untitled"
-msgstr ""
+msgstr "Senza titolo"
#: src/lib/filter.cc:69
msgid "Vertical deblocking filter"
#: 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]"
msgstr "mi sto connettendo"
#: src/lib/film.cc:285
-#, fuzzy
msgid "container"
-msgstr "contenuto"
+msgstr "contenitore"
#: src/lib/film.cc:293
msgid "content type"
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"
#: src/lib/config.cc:82
msgid "sRGB non-linearised"
-msgstr ""
+msgstr "sRGB non linearizzato"
#: src/lib/util.cc:160
msgid "seconds"
}
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);
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) */
try {
sock->accept (Config::instance()->server_port_base() + 1);
} catch (std::exception& e) {
+ dcpomatic_sleep (60);
continue;
}
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;
}
#include <iostream>
#include <fstream>
#include <climits>
+#include <stdexcept>
#ifdef DCPOMATIC_POSIX
#include <execinfo.h>
#include <cxxabi.h>
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;
}
#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.
*/
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 ();
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;
+}
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
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)) {
"""
def build(bld):
- if bld.env.STATIC:
+ if bld.env.BUILD_STATIC:
obj = bld(features = 'cxx cxxstlib')
else:
obj = bld(features = 'cxx cxxshlib')
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'
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 ();
#include <string>
#include <iostream>
#include <cstdlib>
+#include <stdexcept>
#include <getopt.h>
#include <boost/filesystem.hpp>
#include "lib/version.h"
using std::cout;
using std::cerr;
using std::list;
+using std::exception;
using boost::shared_ptr;
static void
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;
}
"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"
#: src/tools/dcpomatic.cc:208
msgid "&Exit"
-msgstr ""
+msgstr "&Esci"
#: src/tools/dcpomatic.cc:239
msgid "&File"
#: 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)"
#: 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..."
#: src/tools/dcpomatic.cc:228
msgid "Hints..."
-msgstr ""
+msgstr "Suggerimenti..."
#: src/tools/dcpomatic.cc:223
msgid "Make &KDMs..."
"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"
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) {
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']
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"));
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));
}
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;
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));
"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
#: 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"
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
"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
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"
#: 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
#: 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
#: 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"
#: 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
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..."
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
#: 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
#: src/wx/film_editor.cc:157
msgid "Encrypted"
-msgstr ""
+msgstr "Criptato"
#: src/wx/dci_metadata_dialog.cc:59
msgid "Facility (e.g. DLA)"
#: 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"
#: src/wx/kdm_dialog.cc:85
msgid "From"
-msgstr ""
+msgstr "Da"
#: src/wx/config_dialog.cc:135
msgid "From address for KDM emails"
#: 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"
#: src/wx/hints_dialog.cc:26
msgid "Hints"
-msgstr ""
+msgstr "Suggerimenti"
#: src/wx/servers_list_dialog.cc:40
msgid "Host"
#: 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"
#: 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
#: src/wx/film_editor.cc:741
msgid "MISSING: "
-msgstr ""
+msgstr "MANCANTE:"
#: src/wx/config_dialog.cc:127
#, fuzzy
#: 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"
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"
#: 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"
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)"
#: 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"
#: src/wx/timing_panel.cc:39
msgid "Position"
-msgstr ""
+msgstr "Posizione"
#: src/wx/audio_mapping_view.cc:280
msgid "R"
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..."
#: src/wx/film_editor.cc:170
msgid "Resolution"
-msgstr ""
+msgstr "Risoluzione"
#: src/wx/job_manager_view.cc:167
msgid "Resume"
#: 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"
msgstr ""
#: src/wx/video_panel.cc:134
-#, fuzzy
msgid "Scale to"
-msgstr "Scaler"
+msgstr "Scala a"
#: src/wx/video_panel.cc:320
#, c-format
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"
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"
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"
msgstr ""
#: src/wx/config_dialog.cc:69
-#, fuzzy
msgid "TMS"
-msgstr "RMS"
+msgstr "TMS"
#: src/wx/config_dialog.cc:305
#, fuzzy
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 ""
"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"
msgstr "Tempo"
#: src/wx/timeline_dialog.cc:32
-#, fuzzy
msgid "Timeline"
-msgstr "Tempo"
+msgstr "Timeline"
#: src/wx/film_editor.cc:282
msgid "Timeline..."
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"
#: 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"
#: 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"
"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
"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
DCPTimeline::setup_pixels_per_time_unit ()
{
shared_ptr<const Film> film = _film.lock ();
- if (!film) {
+ if (!film || film->length() == 0) {
return;
}
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',
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'
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 ();
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
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',
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:]
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'])
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
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>