Merge master.
authorCarl Hetherington <cth@carlh.net>
Thu, 26 Jun 2014 22:36:24 +0000 (23:36 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 26 Jun 2014 22:36:24 +0000 (23:36 +0100)
57 files changed:
ChangeLog
cscript
debian/changelog
debian/rules
doc/manual/Makefile
doc/manual/dcpomatic.xml
doc/manual/diagrams/pipeline1.svg [new file with mode: 0644]
doc/manual/diagrams/pipeline2.svg [new file with mode: 0644]
doc/manual/diagrams/pipeline3.svg [new file with mode: 0644]
doc/manual/diagrams/pipeline4.svg [new file with mode: 0644]
src/lib/encoder.cc
src/lib/encoder.h
src/lib/film.cc
src/lib/film.h
src/lib/image.cc
src/lib/kdm.cc
src/lib/kdm.h
src/lib/playlist.cc
src/lib/playlist.h
src/lib/po/de_DE.po
src/lib/po/es_ES.po
src/lib/po/fr_FR.po
src/lib/po/it_IT.po
src/lib/po/nl_NL.po
src/lib/po/sv_SE.po
src/lib/send_kdm_email_job.cc
src/lib/send_kdm_email_job.h
src/lib/server.cc
src/lib/server.h
src/lib/util.h
src/lib/video_content.cc
src/lib/video_content.h
src/lib/writer.cc
src/tools/dcpomatic.cc
src/tools/dcpomatic_kdm.cc
src/tools/po/de_DE.po
src/tools/po/es_ES.po
src/tools/po/fr_FR.po
src/tools/po/it_IT.po
src/tools/po/nl_NL.po
src/tools/po/sv_SE.po
src/wx/about_dialog.cc
src/wx/kdm_dialog.cc
src/wx/kdm_dialog.h
src/wx/po/de_DE.po
src/wx/po/es_ES.po
src/wx/po/fr_FR.po
src/wx/po/it_IT.po
src/wx/po/nl_NL.po
src/wx/po/sv_SE.po
src/wx/timeline.cc
src/wx/timeline.h
src/wx/timing_panel.cc
src/wx/wscript
test/isdcf_name_test.cc
test/make_black_test.cc
wscript

index e8978daec22e180af55e5241064a234c25ee5c15..cb4d1c3c7d74511b0e682af494b31f1dfc8bb1c6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,8 +2,43 @@
 
        * Add subtitle view.
 
+2014-06-26  Carl Hetherington  <cth@carlh.net>
+
+       * Version 1.70.1 released.
+
+2014-06-26  Carl Hetherington  <cth@carlh.net>
+
+       * Support different KDM formulations.
+
+       * Allow override of detected video frame rates.
+
+       * Optimisation of uncertain effect to encoder and server
+       thread handling.
+
+       * Version 1.70.0 released.
+
+2014-06-25  Carl Hetherington  <cth@carlh.net>
+
+       * Version 1.69.37 released.
+
+2014-06-25  Carl Hetherington  <cth@carlh.net>
+
+       * Version 1.69.36 released.
+
+2014-06-25  Carl Hetherington  <cth@carlh.net>
+
+       * Support pixel format 46 in make_black().
+
+2014-06-24  Carl Hetherington  <cth@carlh.net>
+
+       * Re-assign timeline tracks when things are
+       moved about.
+
 2014-06-23  Carl Hetherington  <cth@carlh.net>
 
+       * Try harder to cope with DCP names specified
+       already in CamelCase.
+
        * Add option to CC a KDM email, and add
        $SCREENS and $CINEMA_NAME as variables
        in the email.
diff --git a/cscript b/cscript
index f3757fa4ad750f2fa0740bb1bd7040ac04c818a3..0c27e59fedae3b70601061eca359d0f7d499acb0 100644 (file)
--- a/cscript
+++ b/cscript
@@ -97,6 +97,21 @@ deb_depends['7'] = {'libc6': '2.13',
                     'libcurl3': '7.26.0',
                     'libzip2': '0.10.1'}
 
+deb_depends['unstable'] = {'libc6': '2.13',
+                    'libssh-4': '0.5.4',
+                    'libboost-filesystem1.55.0': '1.55.0',
+                    'libboost-thread1.55.0': '1.55.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.55.0': '1.55.0',
+                    'libxmlsec1-openssl': '1.2.18',
+                    'libcurl3': '7.26.0',
+                    'libzip2': '0.10.1'}
+
+
 def packages(name, packages, f):
     s = '%s: ' % name
     for p in packages:
@@ -151,6 +166,8 @@ def build(target, options):
     elif target.platform == 'linux':
         if target.distro == 'debian' or target.distro == 'ubuntu':
             cmd += ' --target-debian'
+            if target.version == 'unstable':
+                cmd += ' --debian-unstable'
         elif target.distro == 'centos':
             cmd += ' --target-centos'
 
@@ -186,6 +203,8 @@ def package_debian(target, cpu, 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'))
+    if target.version == 'unstable':
+        target.set('CDIST_EXTRA_CONFIGURE', '--debian-unstable')
     target.command('dpkg-buildpackage')
     
     debs = []
index 0470cab2b695216e39bc948f7321e36dc9378108..7a38ec535fbcd49f43f487d721a886bbc7b91c6f 100644 (file)
@@ -1,4 +1,4 @@
-dcpomatic (1.69.35-1) UNRELEASED; urgency=low
+dcpomatic (1.70.1-1) UNRELEASED; urgency=low
 
   * New upstream release.
   * New upstream release.
@@ -159,8 +159,12 @@ dcpomatic (1.69.35-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.
 
- -- Carl Hetherington <carl@d1stkfactory>  Sun, 22 Jun 2014 21:49:09 +0100
+ -- Carl Hetherington <carl@d1stkfactory>  Thu, 26 Jun 2014 19:30:39 +0100
 
 dcpomatic (0.87-1) UNRELEASED; urgency=low
 
index aed2292a2d1d7268615c6795826f5c9634e2e778..619dfff5ea6d4afce35cebadf39e0993cd9901d1 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 --target-debian --enable-debug
+                ./waf --nocache configure --prefix=/usr --target-debian --enable-debug $(CDIST_EXTRA_CONFIGURE)
 
 override_dh_auto_build:
        ./waf --nocache build
index 2e37c96be947144dacb3b218b8dd0215c556dbb8..408f874f67dc68c2099022f2b9b4e429b80afb7b 100644 (file)
@@ -2,7 +2,8 @@
 
 all:   html pdf
 
-DIAGRAMS := file-structure.svg 3d-left-right.svg 3d-top-bottom.svg timecode.svg
+DIAGRAMS := file-structure.svg 3d-left-right.svg 3d-top-bottom.svg timecode.svg pipeline1.svg pipeline2.svg \
+            pipeline3.svg pipeline4.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 dd0d3bf0cd2b858d038f28b8f40ef137e65b723d..dee7fe052893b1c023eb383063e96609fdcee725 100644 (file)
@@ -953,6 +953,127 @@ any changes to the corresponding timecode.
 
 </section>
 
+<section>
+<title>Video processing pipeline</title>
+
+<para>
+This section gives a little more detail about how DCP-o-matic process
+video as it takes it from a source and puts it into a DCP.
+</para>
+
+<para>
+Consider, as a somewhat over-the-top example, that we have a 720 x 576
+image which is letterboxed with 36 black pixels each at the top and
+bottom, and the video content within the letterbox should be presented
+in the DCP at ratio of 2.39:1 within a 1.85:1 frame (such as might
+happen with a trailer).  The source image is shown in <xref
+linkend="fig-pipeline1"/>.
+</para>
+
+<figure id="fig-pipeline1"> 
+  <title>Example image to demonstrate video processing</title>
+  <mediaobject>
+    <imageobject> 
+       <imagedata scale="100" fileref="diagrams/pipeline1&dia;"/>
+    </imageobject> 
+  </mediaobject>
+</figure>
+
+<para>
+DCP-o-matic runs through the following steps when preparing an image for a DCP:
+</para>
+
+<itemizedlist>
+<listitem>Crop</listitem>
+<listitem>Scale</listitem>
+<listitem>Place in container</listitem>
+</itemizedlist>
+
+<para>
+First, some amount of the image can be cropped.  This is almost always
+used to remove black borders (letterboxing and/or pillarboxing) around
+images.
+</para>
+
+<para>
+In our example image, we would use 36 pixels of crop from the top and
+bottom.  This would give the new image shown in <xref
+linkend="fig-pipeline2"/>.
+</para>
+
+<figure id="fig-pipeline2"> 
+  <title>Example image after cropping</title>
+  <mediaobject>
+    <imageobject> 
+       <imagedata scale="100" fileref="diagrams/pipeline2&dia;"/>
+    </imageobject> 
+  </mediaobject>
+</figure>
+
+<para>
+The next step is to scale the image.  Since this content should be
+presented in a 2.39:1 aspect ratio inside a 1.85:1 DCP we would select
+<guilabel>Scope</guilabel> from the <guilabel>Scale to</guilabel>
+option in the <guilabel>Video</guilabel> tab and
+<guilabel>Flat</guilabel> from the <guilabel>Container</guilabel>
+option in the <guilabel>DCP</guilabel> tab.
+</para>
+
+<para>The <guilabel>Scale to</guilabel> option should always be set to
+the aspect ratio at which the content should be seen.  The
+<guilabel>Container</guilabel> option should be set to the preset that
+you want to use on the projector.  Of course, these two settings will
+often be the same.
+</para>
+
+<para>
+Given the scaling and container information, DCP-o-matic will look at
+the DCP's container size, and then scale the source image up until one
+or both of its dimensions (width, height or both) fits the size of the
+container, all the while preserving the desired aspect ratio.
+</para>
+
+<para>
+In our example here, the DCP's container is specified as 1.85:1 (so
+that the DCP will play back correctly using the projector's
+&lsquo;Flat&rsquo; preset).  At 2K, 1.85:1 is 1998 pixels by 1080.
+Scaling the source up whilst preserving its 1.85:1 aspect ratio will
+result in the image hitting the sides of the container first, at a
+size of 1998 x 836.  This gives us a new version of the image as shown
+in <xref linkend="fig-pipeline3"/>.
+</para>
+
+<figure id="fig-pipeline3"> 
+  <title>Example image after cropping and scaling</title>
+  <mediaobject>
+    <imageobject> 
+       <imagedata scale="100" fileref="diagrams/pipeline3&dia;"/>
+    </imageobject> 
+  </mediaobject>
+</figure>
+
+<para>
+The final step is to place the image into the DCP.  In this case,
+since we have a 2.39:1 image that should be presented as a 1.85:1 DCP,
+we have set the <guilabel>container</guilabel> in the
+<guilabel>DCP</guilabel> tab to be Scope.  Since the content has been
+scaled to 1998 x 836, and a Flat container is 1998 x 1080, there will
+be some black bars at the top and bottom of the image.  DCP-o-matic
+shares out this black equally, as shown in <xref
+linkend="fig-pipeline3"/>.
+</para>
+
+<figure id="fig-pipeline4"> 
+  <title>Example image in the DCP</title>
+  <mediaobject>
+    <imageobject> 
+       <imagedata scale="100" fileref="diagrams/pipeline4&dia;"/>
+    </imageobject> 
+  </mediaobject>
+</figure>
+
+</section>
+
 </chapter>
 
 <chapter xml:id="ch-dcp" xmlns="http://docbook.org/ns/docbook" version="5.0" xml:lang="en">
diff --git a/doc/manual/diagrams/pipeline1.svg b/doc/manual/diagrams/pipeline1.svg
new file mode 100644 (file)
index 0000000..a38babe
--- /dev/null
@@ -0,0 +1,403 @@
+<?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="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="pipeline1.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Mend"
+       style="overflow:visible;">
+      <path
+         id="path3804"
+         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="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-6"
+         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-6"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-68"
+         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-27"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-3"
+         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-63"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-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="marker4324"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4326"
+         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="marker4328"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4330"
+         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="marker4332"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4334"
+         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-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-37"
+         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="path3804-69"
+         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-62"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-8"
+         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-8"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-7"
+         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="marker4517"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4519"
+         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-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-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>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4564"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4566"
+         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="0.68026787"
+     inkscape:cx="68.529071"
+     inkscape:cy="731.88908"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1366"
+     inkscape:window-height="714"
+     inkscape:window-x="1024"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <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></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       id="g2997"
+       transform="matrix(0.5,0,0,0.5,42.040939,-158.30444)">
+      <rect
+         y="373.03476"
+         x="59.186138"
+         height="576"
+         width="720"
+         id="rect2993"
+         style="color:#000000;fill:#000000;stroke:#000000;stroke-width:2px;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" />
+      <rect
+         y="409.03476"
+         x="59.186138"
+         height="504"
+         width="720"
+         id="rect2995"
+         style="color:#000000;fill:#ffffff;stroke:#ff0000;stroke-width:2px;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" />
+    </g>
+    <rect
+       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:4;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="rect3001-5"
+       width="356.93597"
+       height="248.66312"
+       x="73.139694"
+       y="47.699894" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="M 119.40168,123.4643 75.898647,50.852713"
+       id="path3003-3"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="M 119.6764,220.30008 76.173359,292.91167"
+       id="path3003-2-1"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="m 383.11031,220.01077 43.50304,72.61159"
+       id="path3003-2-6-6"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="M 383.67493,123.63022 427.17796,51.018628"
+       id="path3003-2-6-1-2"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:31.10634041px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Latin Modern Sans;-inkscape-font-specification:Latin Modern Sans"
+       x="218.78021"
+       y="72.278893"
+       id="text4289-2"
+       sodipodi:linespacing="125%"
+       transform="scale(0.77402823,1.2919425)"><tspan
+         sodipodi:role="line"
+         x="218.78021"
+         y="72.278893"
+         id="tspan4293-6">My scope image</tspan></text>
+    <path
+       sodipodi:type="arc"
+       style="color:#000000;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0;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="path4297-6"
+       sodipodi:cx="66.00634"
+       sodipodi:cy="392.02936"
+       sodipodi:rx="19.128368"
+       sodipodi:ry="19.128368"
+       d="m 85.134708,392.02936 a 19.128368,19.128368 0 1 1 -38.256736,0 19.128368,19.128368 0 1 1 38.256736,0 z"
+       transform="matrix(1.5048241,0,0,2.5117253,96.288613,-775.54059)" />
+    <path
+       sodipodi:type="star"
+       style="color:#000000;fill:#808000;fill-opacity:1;fill-rule:nonzero;stroke:#808000;stroke-width:0;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="path4299-6"
+       sodipodi:sides="5"
+       sodipodi:cx="76.513474"
+       sodipodi:cy="378.82809"
+       sodipodi:r1="37.006886"
+       sodipodi:r2="18.503443"
+       sodipodi:arg1="2.861293"
+       sodipodi:arg2="3.4896115"
+       inkscape:flatsided="false"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m 40.950871,389.06581 18.168437,-16.54806 -3.331932,-24.34807 21.352497,12.16558 22.12677,-10.69283 -4.971868,24.0668 17.007025,17.73955 -24.425277,2.70852 -11.615849,21.65647 -10.123785,-22.39284 z"
+       inkscape:transform-center-x="3.2284995"
+       inkscape:transform-center-y="-3.7074407"
+       transform="matrix(1.0899007,0,0,1.8191701,221.12185,-485.77846)" />
+    <g
+       id="g4546">
+      <text
+         sodipodi:linespacing="125%"
+         id="text4415"
+         y="39.445469"
+         x="-21.738394"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch: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"
+         xml:space="preserve"><tspan
+           y="39.445469"
+           x="-21.738394"
+           id="tspan4417"
+           sodipodi:role="line">36 pixels</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path4419-3"
+         d="m 60.126683,65.320801 0,-18.125005"
+         style="color:#000000;fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend);visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path4419-3-2"
+         d="m 60.107467,7.7999961 0,18.1250059"
+         style="color:#000000;fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend);visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    </g>
+    <g
+       transform="translate(0,271.37284)"
+       id="g4546-3">
+      <text
+         sodipodi:linespacing="125%"
+         id="text4415-0"
+         y="39.445469"
+         x="-21.738394"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch: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"
+         xml:space="preserve"><tspan
+           y="39.445469"
+           x="-21.738394"
+           id="tspan4417-4"
+           sodipodi:role="line">36 pixels</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path4419-3-6"
+         d="m 60.126683,65.320801 0,-18.125005"
+         style="color:#000000;fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend);visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path4419-3-2-6"
+         d="m 60.107467,7.7999961 0,18.1250059"
+         style="color:#000000;fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend);visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    </g>
+  </g>
+</svg>
diff --git a/doc/manual/diagrams/pipeline2.svg b/doc/manual/diagrams/pipeline2.svg
new file mode 100644 (file)
index 0000000..eac77b4
--- /dev/null
@@ -0,0 +1,332 @@
+<?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="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="pipeline2.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Mend"
+       style="overflow:visible;">
+      <path
+         id="path3804"
+         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="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-6"
+         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-6"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-68"
+         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-27"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-3"
+         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-63"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-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="marker4324"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4326"
+         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="marker4328"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4330"
+         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="marker4332"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4334"
+         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-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-37"
+         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="path3804-69"
+         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-62"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-8"
+         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-8"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-7"
+         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="marker4517"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4519"
+         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-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-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>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4564"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4566"
+         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="0.68026787"
+     inkscape:cx="68.529071"
+     inkscape:cy="731.88908"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1366"
+     inkscape:window-height="714"
+     inkscape:window-x="1024"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <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></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:4;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="rect3001-5"
+       width="356.93597"
+       height="248.66312"
+       x="73.139694"
+       y="47.699894" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="M 119.40168,123.4643 75.898647,50.852713"
+       id="path3003-3"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="M 119.6764,220.30008 76.173359,292.91167"
+       id="path3003-2-1"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="m 383.11031,220.01077 43.50304,72.61159"
+       id="path3003-2-6-6"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="M 383.67493,123.63022 427.17796,51.018628"
+       id="path3003-2-6-1-2"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:31.10634041px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Latin Modern Sans;-inkscape-font-specification:Latin Modern Sans"
+       x="218.78021"
+       y="72.278893"
+       id="text4289-2"
+       sodipodi:linespacing="125%"
+       transform="scale(0.77402823,1.2919425)"><tspan
+         sodipodi:role="line"
+         x="218.78021"
+         y="72.278893"
+         id="tspan4293-6">My scope image</tspan></text>
+    <path
+       sodipodi:type="arc"
+       style="color:#000000;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0;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="path4297-6"
+       sodipodi:cx="66.00634"
+       sodipodi:cy="392.02936"
+       sodipodi:rx="19.128368"
+       sodipodi:ry="19.128368"
+       d="m 85.134708,392.02936 a 19.128368,19.128368 0 1 1 -38.256736,0 19.128368,19.128368 0 1 1 38.256736,0 z"
+       transform="matrix(1.5048241,0,0,2.5117253,96.288613,-775.54059)" />
+    <path
+       sodipodi:type="star"
+       style="color:#000000;fill:#808000;fill-opacity:1;fill-rule:nonzero;stroke:#808000;stroke-width:0;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="path4299-6"
+       sodipodi:sides="5"
+       sodipodi:cx="76.513474"
+       sodipodi:cy="378.82809"
+       sodipodi:r1="37.006886"
+       sodipodi:r2="18.503443"
+       sodipodi:arg1="2.861293"
+       sodipodi:arg2="3.4896115"
+       inkscape:flatsided="false"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m 40.950871,389.06581 18.168437,-16.54806 -3.331932,-24.34807 21.352497,12.16558 22.12677,-10.69283 -4.971868,24.0668 17.007025,17.73955 -24.425277,2.70852 -11.615849,21.65647 -10.123785,-22.39284 z"
+       inkscape:transform-center-x="3.2284995"
+       inkscape:transform-center-y="-3.7074407"
+       transform="matrix(1.0899007,0,0,1.8191701,221.12185,-485.77846)" />
+  </g>
+</svg>
diff --git a/doc/manual/diagrams/pipeline3.svg b/doc/manual/diagrams/pipeline3.svg
new file mode 100644 (file)
index 0000000..976418b
--- /dev/null
@@ -0,0 +1,336 @@
+<?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="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="pipeline3.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Mend"
+       style="overflow:visible;">
+      <path
+         id="path3804"
+         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="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-6"
+         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-6"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-68"
+         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-27"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-3"
+         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-63"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-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="marker4324"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4326"
+         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="marker4328"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4330"
+         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="marker4332"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4334"
+         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-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-37"
+         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="path3804-69"
+         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-62"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-8"
+         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-8"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-7"
+         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="marker4517"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4519"
+         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-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-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>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4564"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4566"
+         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="0.68026787"
+     inkscape:cx="-16.846029"
+     inkscape:cy="731.88908"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1366"
+     inkscape:window-height="714"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <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">
+    <g
+       id="g4634"
+       transform="matrix(1.3949981,0,0,0.80970039,-33.234153,29.7975)">
+      <rect
+         y="47.699894"
+         x="73.139694"
+         height="248.66312"
+         width="356.93597"
+         id="rect3001-5"
+         style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:3.76366544;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" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3003-3"
+         d="M 119.40168,123.4643 75.898647,50.852713"
+         style="fill:none;stroke:#000000;stroke-width:0.94091618px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3003-2-1"
+         d="M 119.6764,220.30008 76.173359,292.91167"
+         style="fill:none;stroke:#000000;stroke-width:0.94091618px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3003-2-6-6"
+         d="m 383.11031,220.01077 43.50304,72.61159"
+         style="fill:none;stroke:#000000;stroke-width:0.94091618px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3003-2-6-1-2"
+         d="M 383.67493,123.63022 427.17796,51.018628"
+         style="fill:none;stroke:#000000;stroke-width:0.94091618px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)" />
+      <text
+         transform="scale(0.77402823,1.2919425)"
+         sodipodi:linespacing="125%"
+         id="text4289-2"
+         y="72.278893"
+         x="218.78021"
+         style="font-size:31.10634041px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Latin Modern Sans;-inkscape-font-specification:Latin Modern Sans"
+         xml:space="preserve"><tspan
+           id="tspan4293-6"
+           y="72.278893"
+           x="218.78021"
+           sodipodi:role="line">My scope image</tspan></text>
+      <path
+         transform="matrix(1.5048241,0,0,2.5117253,96.288613,-775.54059)"
+         d="m 85.134708,392.02936 c 0,10.5643 -8.564062,19.12837 -19.128368,19.12837 -10.564306,0 -19.128368,-8.56407 -19.128368,-19.12837 0,-10.56431 8.564062,-19.12837 19.128368,-19.12837 10.564306,0 19.128368,8.56406 19.128368,19.12837 z"
+         sodipodi:ry="19.128368"
+         sodipodi:rx="19.128368"
+         sodipodi:cy="392.02936"
+         sodipodi:cx="66.00634"
+         id="path4297-6"
+         style="color:#000000;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0;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"
+         sodipodi:type="arc" />
+      <path
+         transform="matrix(1.0899007,0,0,1.8191701,221.12185,-485.77846)"
+         inkscape:transform-center-y="-3.7074407"
+         inkscape:transform-center-x="3.2284995"
+         d="m 40.950871,389.06581 18.168437,-16.54806 -3.331932,-24.34807 21.352497,12.16558 22.12677,-10.69283 -4.971868,24.0668 17.007025,17.73955 -24.425277,2.70852 -11.615849,21.65647 -10.123785,-22.39284 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="3.4896115"
+         sodipodi:arg1="2.861293"
+         sodipodi:r2="18.503443"
+         sodipodi:r1="37.006886"
+         sodipodi:cy="378.82809"
+         sodipodi:cx="76.513474"
+         sodipodi:sides="5"
+         id="path4299-6"
+         style="color:#000000;fill:#808000;fill-opacity:1;fill-rule:nonzero;stroke:#808000;stroke-width:0;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"
+         sodipodi:type="star" />
+    </g>
+  </g>
+</svg>
diff --git a/doc/manual/diagrams/pipeline4.svg b/doc/manual/diagrams/pipeline4.svg
new file mode 100644 (file)
index 0000000..b369b32
--- /dev/null
@@ -0,0 +1,343 @@
+<?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="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="pipeline4.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Mend"
+       style="overflow:visible;">
+      <path
+         id="path3804"
+         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="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-6"
+         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-6"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-68"
+         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-27"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-3"
+         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-63"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-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="marker4324"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4326"
+         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="marker4328"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4330"
+         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="marker4332"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4334"
+         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-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-37"
+         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="path3804-69"
+         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-62"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-8"
+         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-8"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-7"
+         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="marker4517"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4519"
+         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-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3804-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>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4564"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4566"
+         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.2898269"
+     inkscape:cx="292.85461"
+     inkscape:cy="838.64023"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1366"
+     inkscape:window-height="714"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <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></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="color:#000000;fill:#000000;stroke:#000000;stroke-width:0.99999987999999995px;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="rect4773"
+       width="499.5"
+       height="270"
+       x="68.635796"
+       y="35.863335" />
+    <g
+       id="g4634"
+       transform="matrix(1.3905207,0,0,0.8071016,-32.107615,30.244575)">
+      <rect
+         y="47.699894"
+         x="73.139694"
+         height="248.66312"
+         width="356.93597"
+         id="rect3001-5"
+         style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:3.77578402;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" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3003-3"
+         d="M 119.40168,123.4643 75.898647,50.852713"
+         style="fill:none;stroke:#000000;stroke-width:0.94394588px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3003-2-1"
+         d="M 119.6764,220.30008 76.173359,292.91167"
+         style="fill:none;stroke:#000000;stroke-width:0.94394588px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3003-2-6-6"
+         d="m 383.11031,220.01077 43.50304,72.61159"
+         style="fill:none;stroke:#000000;stroke-width:0.94394588px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3003-2-6-1-2"
+         d="M 383.67493,123.63022 427.17796,51.018628"
+         style="fill:none;stroke:#000000;stroke-width:0.94394588px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)" />
+      <text
+         transform="scale(0.77402823,1.2919425)"
+         sodipodi:linespacing="125%"
+         id="text4289-2"
+         y="72.278893"
+         x="218.78021"
+         style="font-size:31.10634041px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Latin Modern Sans;-inkscape-font-specification:Latin Modern Sans"
+         xml:space="preserve"><tspan
+           id="tspan4293-6"
+           y="72.278893"
+           x="218.78021"
+           sodipodi:role="line">My scope image</tspan></text>
+      <path
+         transform="matrix(1.5048241,0,0,2.5117253,96.288613,-775.54059)"
+         d="m 85.134708,392.02936 c 0,10.5643 -8.564062,19.12837 -19.128368,19.12837 -10.564306,0 -19.128368,-8.56407 -19.128368,-19.12837 0,-10.56431 8.564062,-19.12837 19.128368,-19.12837 10.564306,0 19.128368,8.56406 19.128368,19.12837 z"
+         sodipodi:ry="19.128368"
+         sodipodi:rx="19.128368"
+         sodipodi:cy="392.02936"
+         sodipodi:cx="66.00634"
+         id="path4297-6"
+         style="color:#000000;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0;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"
+         sodipodi:type="arc" />
+      <path
+         transform="matrix(1.0899007,0,0,1.8191701,221.12185,-485.77846)"
+         inkscape:transform-center-y="-3.7074407"
+         inkscape:transform-center-x="3.2284995"
+         d="m 40.950871,389.06581 18.168437,-16.54806 -3.331932,-24.34807 21.352497,12.16558 22.12677,-10.69283 -4.971868,24.0668 17.007025,17.73955 -24.425277,2.70852 -11.615849,21.65647 -10.123785,-22.39284 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="3.4896115"
+         sodipodi:arg1="2.861293"
+         sodipodi:r2="18.503443"
+         sodipodi:r1="37.006886"
+         sodipodi:cy="378.82809"
+         sodipodi:cx="76.513474"
+         sodipodi:sides="5"
+         id="path4299-6"
+         style="color:#000000;fill:#808000;fill-opacity:1;fill-rule:nonzero;stroke:#808000;stroke-width:0;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"
+         sodipodi:type="star" />
+    </g>
+  </g>
+</svg>
index 5dc9e47c772cb7ec0e7c13a91b332c54bce63307..0756586a91d54101ce89ba61d41f4cca2f3790f6 100644 (file)
@@ -106,8 +106,8 @@ Encoder::process_end ()
 
        /* Keep waking workers until the queue is empty */
        while (!_queue.empty ()) {
-               _condition.notify_all ();
-               _condition.wait (lock);
+               _empty_condition.notify_all ();
+               _full_condition.wait (lock);
        }
 
        lock.unlock ();
@@ -192,7 +192,7 @@ Encoder::process_video (shared_ptr<PlayerVideoFrame> pvf)
        /* Wait until the queue has gone down a bit */
        while (_queue.size() >= _threads.size() * 2 && !_terminate) {
                LOG_TIMING ("decoder sleeps with queue of %1", _queue.size());
-               _condition.wait (lock);
+               _full_condition.wait (lock);
                LOG_TIMING ("decoder wakes with queue of %1", _queue.size());
        }
 
@@ -223,8 +223,11 @@ Encoder::process_video (shared_ptr<PlayerVideoFrame> pvf)
                                                  _film->log()
                                                  )
                                          ));
-               
-               _condition.notify_all ();
+
+               /* The queue might not be empty any more, so notify anything which is
+                  waiting on that.
+               */
+               _empty_condition.notify_all ();
        }
 
        if (pvf->eyes() != EYES_LEFT) {
@@ -244,7 +247,8 @@ Encoder::terminate_threads ()
        {
                boost::mutex::scoped_lock lock (_mutex);
                _terminate = true;
-               _condition.notify_all ();
+               _full_condition.notify_all ();
+               _empty_condition.notify_all ();
        }
 
        for (list<boost::thread *>::iterator i = _threads.begin(); i != _threads.end(); ++i) {
@@ -267,12 +271,12 @@ try
        */
        int remote_backoff = 0;
        
-       while (1) {
+       while (true) {
 
                LOG_TIMING ("[%1] encoder thread sleeps", boost::this_thread::get_id());
                boost::mutex::scoped_lock lock (_mutex);
                while (_queue.empty () && !_terminate) {
-                       _condition.wait (lock);
+                       _empty_condition.wait (lock);
                }
 
                if (_terminate) {
@@ -334,8 +338,9 @@ try
                        dcpomatic_sleep (remote_backoff);
                }
 
+               /* The queue might not be full any more, so notify anything that is waiting on that */
                lock.lock ();
-               _condition.notify_all ();
+               _full_condition.notify_all ();
        }
 }
 catch (...)
index 678cdf04eae219bbcd8218765ff0d11facab3725..6bb97012abaebfceedf57f30960aaa3fb3bfbf30 100644 (file)
@@ -110,7 +110,10 @@ private:
        std::list<boost::shared_ptr<DCPVideoFrame> > _queue;
        std::list<boost::thread *> _threads;
        mutable boost::mutex _mutex;
-       boost::condition _condition;
+       /** condition to manage thread wakeups when we have nothing to do */
+       boost::condition _empty_condition;
+       /** condition to manage thread wakeups when we have too much to do */
+       boost::condition _full_condition;
 
        boost::shared_ptr<Writer> _writer;
        Waker _waker;
index b01a70b7277789958ea2452687d7411ac82d254a..1456314bebb58a700181947a3260283ff80e7017 100644 (file)
@@ -77,9 +77,11 @@ using boost::to_upper_copy;
 using boost::ends_with;
 using boost::starts_with;
 using boost::optional;
+using boost::is_any_of;
 using dcp::Size;
 using dcp::Signer;
 using dcp::raw_convert;
+using dcp::raw_convert;
 
 #define LOG_GENERAL(...) log()->log (String::compose (__VA_ARGS__), Log::TYPE_GENERAL);
 #define LOG_GENERAL_NC(...) log()->log (__VA_ARGS__, Log::TYPE_GENERAL);
@@ -491,16 +493,39 @@ Film::isdcf_name (bool if_created_now) const
        stringstream d;
 
        string raw_name = name ();
+
+       /* Split the raw name up into words */
+       vector<string> words;
+       split (words, raw_name, is_any_of (" "));
+
        string fixed_name;
-       bool cap_next = true;
-       for (size_t i = 0; i < raw_name.length(); ++i) {
-               if (raw_name[i] == ' ') {
-                       cap_next = true;
-               } else if (cap_next) {
-                       fixed_name += toupper (raw_name[i]);
-                       cap_next = false;
-               } else {
-                       fixed_name += tolower (raw_name[i]);
+       
+       /* Add each word to fixed_name */
+       for (vector<string>::const_iterator i = words.begin(); i != words.end(); ++i) {
+               string w = *i;
+
+               /* First letter is always capitalised */
+               w[0] = toupper (w[0]);
+
+               /* Count caps in w */
+               size_t caps = 0;
+               for (size_t i = 0; i < w.size(); ++i) {
+                       if (isupper (w[i])) {
+                               ++caps;
+                       }
+               }
+               
+               /* If w is all caps make the rest of it lower case, otherwise
+                  leave it alone.
+               */
+               if (caps == w.size ()) {
+                       for (size_t i = 1; i < w.size(); ++i) {
+                               w[i] = tolower (w[i]);
+                       }
+               }
+
+               for (size_t i = 0; i < w.size(); ++i) {
+                       fixed_name += w[i];
                }
        }
 
@@ -829,7 +854,7 @@ Film::j2c_path (int f, Eyes e, bool t) const
        return file (p);
 }
 
-/** Find all the DCPs in our directory that can be libdcp::DCP::read() and return details of their CPLs */
+/** Find all the DCPs in our directory that can be dcp::DCP::read() and return details of their CPLs */
 vector<CPLSummary>
 Film::cpls () const
 {
@@ -1027,13 +1052,14 @@ Film::make_kdm (
        shared_ptr<dcp::Certificate> target,
        boost::filesystem::path cpl_file,
        dcp::LocalTime from,
-       dcp::LocalTime until
+       dcp::LocalTime until,
+       dcp::Formulation formulation
        ) const
 {
        shared_ptr<const dcp::CPL> cpl (new dcp::CPL (cpl_file));
        return dcp::DecryptedKDM (
                cpl, from, until, "DCP-o-matic", cpl->content_title_text(), dcp::LocalTime().as_string()
-               ).encrypt (make_signer(), target);
+               ).encrypt (make_signer(), target, formulation);
 }
 
 list<dcp::EncryptedKDM>
@@ -1041,13 +1067,14 @@ Film::make_kdms (
        list<shared_ptr<Screen> > screens,
        boost::filesystem::path dcp,
        dcp::LocalTime from,
-       dcp::LocalTime until
+       dcp::LocalTime until,
+       dcp::Formulation formulation
        ) const
 {
        list<dcp::EncryptedKDM> kdms;
 
        for (list<shared_ptr<Screen> >::iterator i = screens.begin(); i != screens.end(); ++i) {
-               kdms.push_back (make_kdm ((*i)->certificate, dcp, from, until));
+               kdms.push_back (make_kdm ((*i)->certificate, dcp, from, until, formulation));
        }
 
        return kdms;
index a44c606d680af9b60eb0f4b3e5bc642f6b8d013c..178fd9002d18cff8b586790d5d14c473e796374b 100644 (file)
@@ -123,14 +123,16 @@ public:
                boost::shared_ptr<dcp::Certificate> target,
                boost::filesystem::path cpl_file,
                dcp::LocalTime from,
-               dcp::LocalTime until
+               dcp::LocalTime until,
+               dcp::Formulation formulation
                ) const;
        
        std::list<dcp::EncryptedKDM> make_kdms (
                std::list<boost::shared_ptr<Screen> >,
                boost::filesystem::path cpl_file,
                dcp::LocalTime from,
-               dcp::LocalTime until
+               dcp::LocalTime until,
+               dcp::Formulation formulation
                ) const;
 
        dcp::Key key () const {
@@ -148,7 +150,7 @@ public:
                NONE,
                NAME,
                USE_ISDCF_NAME,
-               /** The playlist's content list has changed (i.e. content has been added, moved around or removed) */
+               /** The playlist's content list has changed (i.e. content has been added or removed) */
                CONTENT,
                DCP_CONTENT_TYPE,
                CONTAINER,
index 2ce3738b9c5ac0af98b6bde390ecfe2caed8add8..680c063f1a4d30ca9e364bbdbed615e7fafc9376 100644 (file)
@@ -322,6 +322,7 @@ Image::make_black ()
        case PIX_FMT_RGBA:
        case PIX_FMT_ABGR:
        case PIX_FMT_BGRA:
+       case PIX_FMT_RGB555LE:
                memset (data()[0], 0, lines(0) * stride()[0]);
                break;
 
index 5754fd469f3be91f44a00590932ef36a98280d7d..dd2b756c19e79184b25cec9b95bed3e4a6540adc 100644 (file)
@@ -22,6 +22,7 @@
 #include <quickmail.h>
 #include <zip.h>
 #include <dcp/encrypted_kdm.h>
+#include <dcp/types.h>
 #include "kdm.h"
 #include "cinema.h"
 #include "exceptions.h"
@@ -105,10 +106,11 @@ make_screen_kdms (
        list<shared_ptr<Screen> > screens,
        boost::filesystem::path cpl,
        dcp::LocalTime from,
-       dcp::LocalTime to
+       dcp::LocalTime to,
+       dcp::Formulation formulation
        )
 {
-       list<dcp::EncryptedKDM> kdms = film->make_kdms (screens, cpl, from, to);
+       list<dcp::EncryptedKDM> kdms = film->make_kdms (screens, cpl, from, to, formulation);
           
        list<ScreenKDM> screen_kdms;
        
@@ -129,10 +131,11 @@ make_cinema_kdms (
        list<shared_ptr<Screen> > screens,
        boost::filesystem::path cpl,
        dcp::LocalTime from,
-       dcp::LocalTime to
+       dcp::LocalTime to,
+       dcp::Formulation formulation
        )
 {
-       list<ScreenKDM> screen_kdms = make_screen_kdms (film, screens, cpl, from, to);
+       list<ScreenKDM> screen_kdms = make_screen_kdms (film, screens, cpl, from, to, formulation);
        list<CinemaKDMs> cinema_kdms;
 
        while (!screen_kdms.empty ()) {
@@ -175,10 +178,11 @@ write_kdm_files (
        boost::filesystem::path cpl,
        dcp::LocalTime from,
        dcp::LocalTime to,
+       dcp::Formulation formulation,
        boost::filesystem::path directory
        )
 {
-       list<ScreenKDM> screen_kdms = make_screen_kdms (film, screens, cpl, from, to);
+       list<ScreenKDM> screen_kdms = make_screen_kdms (film, screens, cpl, from, to, formulation);
 
        /* Write KDMs to the specified directory */
        for (list<ScreenKDM>::iterator i = screen_kdms.begin(); i != screen_kdms.end(); ++i) {
@@ -195,10 +199,11 @@ write_kdm_zip_files (
        boost::filesystem::path cpl,
        dcp::LocalTime from,
        dcp::LocalTime to,
+       dcp::Formulation formulation,
        boost::filesystem::path directory
        )
 {
-       list<CinemaKDMs> cinema_kdms = make_cinema_kdms (film, screens, cpl, from, to);
+       list<CinemaKDMs> cinema_kdms = make_cinema_kdms (film, screens, cpl, from, to, formulation);
 
        for (list<CinemaKDMs>::const_iterator i = cinema_kdms.begin(); i != cinema_kdms.end(); ++i) {
                boost::filesystem::path path = directory;
@@ -213,10 +218,11 @@ email_kdms (
        list<shared_ptr<Screen> > screens,
        boost::filesystem::path cpl,
        dcp::LocalTime from,
-       dcp::LocalTime to
+       dcp::LocalTime to,
+       dcp::Formulation formulation
        )
 {
-       list<CinemaKDMs> cinema_kdms = make_cinema_kdms (film, screens, cpl, from, to);
+       list<CinemaKDMs> cinema_kdms = make_cinema_kdms (film, screens, cpl, from, to, formulation);
 
        for (list<CinemaKDMs>::const_iterator i = cinema_kdms.begin(); i != cinema_kdms.end(); ++i) {
                
index 023107a826875f169c4e1c780ee9666ba366eefc..b80ef454f2ddc2b3092b19bb55783f5f63aa5c01 100644 (file)
@@ -29,6 +29,7 @@ extern void write_kdm_files (
        boost::filesystem::path cpl,
        dcp::LocalTime from,
        dcp::LocalTime to,
+       dcp::Formulation formulation,
        boost::filesystem::path directory
        );
 
@@ -38,6 +39,7 @@ extern void write_kdm_zip_files (
        boost::filesystem::path cpl,
        dcp::LocalTime from,
        dcp::LocalTime to,
+       dcp::Formulation formulation,
        boost::filesystem::path directory
        );
 
@@ -46,6 +48,7 @@ extern void email_kdms (
        std::list<boost::shared_ptr<Screen> > screens,
        boost::filesystem::path cpl,
        dcp::LocalTime from,
-       dcp::LocalTime to
+       dcp::LocalTime to,
+       dcp::Formulation formulation
        );
 
index 1c268ca110a90a42f7997e94d46ffd1a13ff4483..710b9cc099ea5a9e96f6118f836c9ff1ab8c1cc9 100644 (file)
@@ -371,8 +371,6 @@ Playlist::move_earlier (shared_ptr<Content> c)
        (*previous)->set_position (p + c->length_after_trim ());
        c->set_position (p);
        sort (_content.begin(), _content.end(), ContentSorter ());
-       
-       Changed ();
 }
 
 void
@@ -398,6 +396,4 @@ Playlist::move_later (shared_ptr<Content> c)
        (*next)->set_position (c->position ());
        c->set_position (p + c->length_after_trim ());
        sort (_content.begin(), _content.end(), ContentSorter ());
-       
-       Changed ();
 }
index 3e5093aca2494071e5564516dee59a5522e8d07b..9e3dbb6dfbf39ccf2f6f6864d1ee2920983ff447 100644 (file)
@@ -78,8 +78,12 @@ public:
 
        void repeat (ContentList, int);
 
+       /** Emitted when content has been added to or removed from the playlist */
        mutable boost::signals2::signal<void ()> Changed;
-       /** Third parameter is true if signals are currently being emitted frequently */
+       /** Emitted when something about a piece of our content has changed;
+        *  these emissions include when the position of the content changes.
+        *  Third parameter is true if signals are currently being emitted frequently.
+        */
        mutable boost::signals2::signal<void (boost::weak_ptr<Content>, int, bool)> ContentChanged;
        
 private:
index 9f6380c366891d68c5d7710b13a2a47fc03262a6..6b73bea1747c4aed37b202087037f7a364dadad1 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-06-21 03:55+0100\n"
 "Last-Translator: Carsten Kurz\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -106,7 +106,7 @@ msgstr "Center"
 msgid "Checking existing image data"
 msgstr "Überprüfe bestehende Bilddateien"
 
-#: src/lib/writer.cc:464
+#: src/lib/writer.cc:471
 msgid "Computing audio digest"
 msgstr "Tonübersicht berechnen"
 
@@ -114,7 +114,7 @@ msgstr "Tonübersicht berechnen"
 msgid "Computing digest"
 msgstr "Zusammenfassung berechnen"
 
-#: src/lib/writer.cc:460
+#: src/lib/writer.cc:467
 msgid "Computing image digest"
 msgstr "Bildübersicht berechnen"
 
@@ -493,7 +493,7 @@ msgstr ""
 msgid "There was not enough memory to do this."
 msgstr "Zu wenig Speicher für diese Operation."
 
-#: src/lib/film.cc:412
+#: src/lib/film.cc:413
 msgid ""
 "This film was created with a newer version of DCP-o-matic, and it cannot be "
 "loaded into this version.  Sorry!"
@@ -502,7 +502,7 @@ msgstr ""
 "kann leider nicht mit dieser älteren Version geladen werden. Sie müssen den "
 "Film neu erstellen. Sorry!"
 
-#: src/lib/film.cc:404
+#: src/lib/film.cc:405
 msgid ""
 "This film was created with an older version of DCP-o-matic, and "
 "unfortunately it cannot be loaded into this version.  You will need to "
@@ -564,7 +564,7 @@ msgstr "X"
 msgid "Yet Another Deinterlacing Filter"
 msgstr "Und ein weiterer De-Interlacer..."
 
-#: src/lib/film.cc:309
+#: src/lib/film.cc:310
 msgid "You must add some content to the DCP before creating it"
 msgstr "Sie müssen erst Inhalte hinzufügen bevor Sie ein DCP erstellen können!"
 
@@ -576,7 +576,7 @@ msgstr "[Bewegte Bilder]"
 msgid "[still]"
 msgstr "[Standbild]"
 
-#: src/lib/film.cc:257
+#: src/lib/film.cc:258
 msgid "cannot contain slashes"
 msgstr "Darf keine Schrägstriche enthalten"
 
@@ -588,11 +588,11 @@ msgstr "Zeit zur Verbindung abgelaufen"
 msgid "connecting"
 msgstr "verbinde..."
 
-#: src/lib/film.cc:305
+#: src/lib/film.cc:306
 msgid "container"
 msgstr "Containerformat"
 
-#: src/lib/film.cc:313
+#: src/lib/film.cc:314
 msgid "content type"
 msgstr "Inhaltsbeschreibung"
 
@@ -616,7 +616,7 @@ msgstr "Keine Spur-Information gefunden"
 msgid "could not find video decoder"
 msgstr "Bild-Dekoder nicht gefunden"
 
-#: src/lib/writer.cc:428
+#: src/lib/writer.cc:435
 msgid "could not move audio MXF into the DCP (%1)"
 msgstr "Ton MXF kann nicht in das DCP verschoben werden (%1)"
 
@@ -712,7 +712,7 @@ msgstr "wird verschoben"
 msgid "multi-part subtitles not yet supported"
 msgstr "Mehr-Segment Untertitel werden noch nicht unterstützt"
 
-#: src/lib/film.cc:257 src/lib/film.cc:317
+#: src/lib/film.cc:258 src/lib/film.cc:318
 msgid "name"
 msgstr "Name"
 
index d243f0b9a9c8f2c647db66d5027a7d8bc852112f..813600fe5a21a302c9c6ca11f451557485967258 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: LIBDCPOMATIC\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-04-20 10:12-0500\n"
 "Last-Translator: Manuel AC <manuel.acevedo@civantos.>\n"
 "Language-Team: Manuel AC <manuel.acevedo@civantos.com>\n"
@@ -105,7 +105,7 @@ msgstr "Centro"
 msgid "Checking existing image data"
 msgstr "Comprobando las imágenes existentes"
 
-#: src/lib/writer.cc:464
+#: src/lib/writer.cc:471
 msgid "Computing audio digest"
 msgstr "Calculando la firma resumen del audio"
 
@@ -113,7 +113,7 @@ msgstr "Calculando la firma resumen del audio"
 msgid "Computing digest"
 msgstr "Calculando la firma resumen"
 
-#: src/lib/writer.cc:460
+#: src/lib/writer.cc:467
 msgid "Computing image digest"
 msgstr "Calculando la firma resumen de imagen"
 
@@ -487,7 +487,7 @@ msgstr ""
 msgid "There was not enough memory to do this."
 msgstr "No hubo suficiente memoria para hacer esto."
 
-#: src/lib/film.cc:412
+#: src/lib/film.cc:413
 msgid ""
 "This film was created with a newer version of DCP-o-matic, and it cannot be "
 "loaded into this version.  Sorry!"
@@ -496,7 +496,7 @@ msgstr ""
 "desgraciadamente no s puede cargar. Necesitas crear una nueva película, "
 "volver a añadir y configurar ton contenido. ¡Lo siento!"
 
-#: src/lib/film.cc:404
+#: src/lib/film.cc:405
 msgid ""
 "This film was created with an older version of DCP-o-matic, and "
 "unfortunately it cannot be loaded into this version.  You will need to "
@@ -558,7 +558,7 @@ msgstr "X"
 msgid "Yet Another Deinterlacing Filter"
 msgstr "Yet Another Deinterlacing Filter"
 
-#: src/lib/film.cc:309
+#: src/lib/film.cc:310
 msgid "You must add some content to the DCP before creating it"
 msgstr "Tienes que añadir contenido al DCP antes de crearlo."
 
@@ -570,7 +570,7 @@ msgstr "[imágenes en movimiento]"
 msgid "[still]"
 msgstr "[imagen fija]"
 
-#: src/lib/film.cc:257
+#: src/lib/film.cc:258
 msgid "cannot contain slashes"
 msgstr "no puede contener barras"
 
@@ -582,11 +582,11 @@ msgstr "tiempo de conexión agotado"
 msgid "connecting"
 msgstr "conectando"
 
-#: src/lib/film.cc:305
+#: src/lib/film.cc:306
 msgid "container"
 msgstr "continente"
 
-#: src/lib/film.cc:313
+#: src/lib/film.cc:314
 msgid "content type"
 msgstr "tipo de contenido"
 
@@ -610,7 +610,7 @@ msgstr "no se pudo encontrar información del flujo"
 msgid "could not find video decoder"
 msgstr "no se pudo encontrar decodificador de vídeo"
 
-#: src/lib/writer.cc:428
+#: src/lib/writer.cc:435
 msgid "could not move audio MXF into the DCP (%1)"
 msgstr "no s puedo mover el audio MXF en el DCP (%1)"
 
@@ -706,7 +706,7 @@ msgstr "moviendo"
 msgid "multi-part subtitles not yet supported"
 msgstr "todavía no se soportan subtítulos en múltiples partes"
 
-#: src/lib/film.cc:257 src/lib/film.cc:317
+#: src/lib/film.cc:258 src/lib/film.cc:318
 msgid "name"
 msgstr "nombre"
 
index 117565dce320995e7908ffc58b8f1fce60776e1d..6cef1b3dc9044d8b45e0d3445afb2dd6846d6769 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: DCP-o-matic FRENCH\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-06-20 15:53+0100\n"
 "Last-Translator: \n"
 "Language-Team: \n"
@@ -105,7 +105,7 @@ msgstr "Centre"
 msgid "Checking existing image data"
 msgstr "Recherche de données images existantes"
 
-#: src/lib/writer.cc:464
+#: src/lib/writer.cc:471
 msgid "Computing audio digest"
 msgstr "Fabrication rendu audio"
 
@@ -113,7 +113,7 @@ msgstr "Fabrication rendu audio"
 msgid "Computing digest"
 msgstr "fabrication rendu"
 
-#: src/lib/writer.cc:460
+#: src/lib/writer.cc:467
 msgid "Computing image digest"
 msgstr "Fabrication rendu image"
 
@@ -479,7 +479,7 @@ msgstr ""
 msgid "There was not enough memory to do this."
 msgstr "Il n'y avait pas assez de mémoire pour faire cela."
 
-#: src/lib/film.cc:412
+#: src/lib/film.cc:413
 msgid ""
 "This film was created with a newer version of DCP-o-matic, and it cannot be "
 "loaded into this version.  Sorry!"
@@ -487,7 +487,7 @@ msgstr ""
 "Ce film a été créé avec une nouvelle version de DCP-o-matic et il ne peut "
 "être ouvert dans cette version du programme. Désolé!"
 
-#: src/lib/film.cc:404
+#: src/lib/film.cc:405
 msgid ""
 "This film was created with an older version of DCP-o-matic, and "
 "unfortunately it cannot be loaded into this version.  You will need to "
@@ -549,7 +549,7 @@ msgstr "X"
 msgid "Yet Another Deinterlacing Filter"
 msgstr "Un autre filtre de désentrelacement"
 
-#: src/lib/film.cc:309
+#: src/lib/film.cc:310
 msgid "You must add some content to the DCP before creating it"
 msgstr "Ajoutez un contenu pour créer le DCP"
 
@@ -561,7 +561,7 @@ msgstr "[Déplacement d'images]"
 msgid "[still]"
 msgstr "[restant]"
 
-#: src/lib/film.cc:257
+#: src/lib/film.cc:258
 msgid "cannot contain slashes"
 msgstr "slash interdit"
 
@@ -573,11 +573,11 @@ msgstr "temps de connexion expiré"
 msgid "connecting"
 msgstr "connexion"
 
-#: src/lib/film.cc:305
+#: src/lib/film.cc:306
 msgid "container"
 msgstr "conteneur"
 
-#: src/lib/film.cc:313
+#: src/lib/film.cc:314
 msgid "content type"
 msgstr "type de contenu"
 
@@ -601,7 +601,7 @@ msgstr "information du flux introuvable"
 msgid "could not find video decoder"
 msgstr "décodeur vidéo introuvable"
 
-#: src/lib/writer.cc:428
+#: src/lib/writer.cc:435
 msgid "could not move audio MXF into the DCP (%1)"
 msgstr "ne peut déplacer un MXF son dans le DCP (%1)"
 
@@ -699,7 +699,7 @@ msgstr "déplacement"
 msgid "multi-part subtitles not yet supported"
 msgstr "sous-titres en plusieurs parties non supportés"
 
-#: src/lib/film.cc:257 src/lib/film.cc:317
+#: src/lib/film.cc:258 src/lib/film.cc:318
 msgid "name"
 msgstr "nom"
 
index fb73fa1d005301a60371f90ca60fe94cbc21c077..e2bce6f87b7cba5fe7adf678f3241a1056c3a364 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: IT VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-02-03 10:48+0100\n"
 "Last-Translator: William Fanelli <william.f@impronte.com>\n"
 "Language-Team: \n"
@@ -106,7 +106,7 @@ msgstr "Centro"
 msgid "Checking existing image data"
 msgstr ""
 
-#: src/lib/writer.cc:464
+#: src/lib/writer.cc:471
 msgid "Computing audio digest"
 msgstr ""
 
@@ -114,7 +114,7 @@ msgstr ""
 msgid "Computing digest"
 msgstr ""
 
-#: src/lib/writer.cc:460
+#: src/lib/writer.cc:467
 msgid "Computing image digest"
 msgstr ""
 
@@ -498,7 +498,7 @@ msgstr ""
 msgid "There was not enough memory to do this."
 msgstr ""
 
-#: src/lib/film.cc:412
+#: src/lib/film.cc:413
 #, fuzzy
 msgid ""
 "This film was created with a newer version of DCP-o-matic, and it cannot be "
@@ -509,7 +509,7 @@ msgstr ""
 "un nuovo film, ri-aggiungere i tuoi contenuti e configurarlo di nuovo. Ci "
 "dispiace!"
 
-#: src/lib/film.cc:404
+#: src/lib/film.cc:405
 msgid ""
 "This film was created with an older version of DCP-o-matic, and "
 "unfortunately it cannot be loaded into this version.  You will need to "
@@ -572,7 +572,7 @@ msgstr "X"
 msgid "Yet Another Deinterlacing Filter"
 msgstr "Altro filtro di deinterlacciamento"
 
-#: src/lib/film.cc:309
+#: src/lib/film.cc:310
 msgid "You must add some content to the DCP before creating it"
 msgstr "Devi aggiungere dei contenuti al DCP prima di crearlo"
 
@@ -585,7 +585,7 @@ msgstr ""
 msgid "[still]"
 msgstr "ancora"
 
-#: src/lib/film.cc:257
+#: src/lib/film.cc:258
 msgid "cannot contain slashes"
 msgstr "non può contenere barre"
 
@@ -597,11 +597,11 @@ msgstr "connessione scaduta"
 msgid "connecting"
 msgstr "mi sto connettendo"
 
-#: src/lib/film.cc:305
+#: src/lib/film.cc:306
 msgid "container"
 msgstr "contenitore"
 
-#: src/lib/film.cc:313
+#: src/lib/film.cc:314
 msgid "content type"
 msgstr "tipo di contenuto"
 
@@ -625,7 +625,7 @@ msgstr "non riesco a trovare informazioni sullo streaming"
 msgid "could not find video decoder"
 msgstr "non riesco a trovare il decoder video"
 
-#: src/lib/writer.cc:428
+#: src/lib/writer.cc:435
 msgid "could not move audio MXF into the DCP (%1)"
 msgstr ""
 
@@ -723,7 +723,7 @@ msgstr ""
 msgid "multi-part subtitles not yet supported"
 msgstr "sottotitoli multi-part non ancora supportati"
 
-#: src/lib/film.cc:257 src/lib/film.cc:317
+#: src/lib/film.cc:258 src/lib/film.cc:318
 msgid "name"
 msgstr "nome"
 
index 98f5c918c969257e2ceb0e483c546276821d6861..f471ce8af1268ea85e1e787c84d0e7ad288d97de 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: DCP-o-matic\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-03-30 19:39+0100\n"
 "Last-Translator: Theo Kooijmans <tkooijmans@universaldv.nl>\n"
 "Language-Team: UniversalDV <Tkooijmans@universaldv.nl>\n"
@@ -106,7 +106,7 @@ msgstr "Midden"
 msgid "Checking existing image data"
 msgstr "Controleer bestaande videodata"
 
-#: src/lib/writer.cc:464
+#: src/lib/writer.cc:471
 msgid "Computing audio digest"
 msgstr "Verwerk audio data"
 
@@ -114,7 +114,7 @@ msgstr "Verwerk audio data"
 msgid "Computing digest"
 msgstr "Verwerken..."
 
-#: src/lib/writer.cc:460
+#: src/lib/writer.cc:467
 msgid "Computing image digest"
 msgstr "Verwerk video data"
 
@@ -491,7 +491,7 @@ msgstr ""
 msgid "There was not enough memory to do this."
 msgstr "Er was niet genoeg geheugen om dit uit te voeren."
 
-#: src/lib/film.cc:412
+#: src/lib/film.cc:413
 msgid ""
 "This film was created with a newer version of DCP-o-matic, and it cannot be "
 "loaded into this version.  Sorry!"
@@ -499,7 +499,7 @@ msgstr ""
 "Deze film is gemaakt met een nieuwere versie van DCP-o-matic en kan niet "
 "geopend worden. Sorry!"
 
-#: src/lib/film.cc:404
+#: src/lib/film.cc:405
 msgid ""
 "This film was created with an older version of DCP-o-matic, and "
 "unfortunately it cannot be loaded into this version.  You will need to "
@@ -561,7 +561,7 @@ msgstr "X"
 msgid "Yet Another Deinterlacing Filter"
 msgstr "Yet Another Deinterlacing Filter"
 
-#: src/lib/film.cc:309
+#: src/lib/film.cc:310
 msgid "You must add some content to the DCP before creating it"
 msgstr "U moet wat content toevoegen voor het maken van de DCP"
 
@@ -573,7 +573,7 @@ msgstr "[bewegend beeld]"
 msgid "[still]"
 msgstr "[still]"
 
-#: src/lib/film.cc:257
+#: src/lib/film.cc:258
 msgid "cannot contain slashes"
 msgstr "er mag geen '\" gebruikt worden"
 
@@ -585,11 +585,11 @@ msgstr "verbinding timeout"
 msgid "connecting"
 msgstr "verbinden"
 
-#: src/lib/film.cc:305
+#: src/lib/film.cc:306
 msgid "container"
 msgstr "container"
 
-#: src/lib/film.cc:313
+#: src/lib/film.cc:314
 msgid "content type"
 msgstr "content type"
 
@@ -613,7 +613,7 @@ msgstr "kan geen stream informatie vinden"
 msgid "could not find video decoder"
 msgstr "kan geen videodecoder vinden"
 
-#: src/lib/writer.cc:428
+#: src/lib/writer.cc:435
 msgid "could not move audio MXF into the DCP (%1)"
 msgstr "kan MXF audio niet plaatsen in DCP (%1)"
 
@@ -709,7 +709,7 @@ msgstr "bewegend"
 msgid "multi-part subtitles not yet supported"
 msgstr "ondertitels met meerdere delen worden nog niet ondersteund."
 
-#: src/lib/film.cc:257 src/lib/film.cc:317
+#: src/lib/film.cc:258 src/lib/film.cc:318
 msgid "name"
 msgstr "naam"
 
index f3c0ba9d2f03d4e9c27c7b9cbcdd9b2599e08132..98d76e3bd88f7bf6cc4fa353342d37291a754da3 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: DCP-o-matic\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-01-19 08:59+0100\n"
 "Last-Translator: Adam Klotblixt <adam.klotblixt@gmail.com>\n"
 "Language-Team: \n"
@@ -105,7 +105,7 @@ msgstr "Center"
 msgid "Checking existing image data"
 msgstr "Kontrollerar befintligt bilddata"
 
-#: src/lib/writer.cc:464
+#: src/lib/writer.cc:471
 msgid "Computing audio digest"
 msgstr "Beräknar audiosammanfattning"
 
@@ -113,7 +113,7 @@ msgstr "Beräknar audiosammanfattning"
 msgid "Computing digest"
 msgstr "Beräknar sammanfattning"
 
-#: src/lib/writer.cc:460
+#: src/lib/writer.cc:467
 msgid "Computing image digest"
 msgstr "Beräknar bildsammanfattning"
 
@@ -494,7 +494,7 @@ msgstr ""
 msgid "There was not enough memory to do this."
 msgstr ""
 
-#: src/lib/film.cc:412
+#: src/lib/film.cc:413
 #, fuzzy
 msgid ""
 "This film was created with a newer version of DCP-o-matic, and it cannot be "
@@ -504,7 +504,7 @@ msgstr ""
 "inte öppnas i denna version. Du måste skapa en ny Film, lägga till ditt "
 "innehåll och konfigurera allt igen. Ursäkta!"
 
-#: src/lib/film.cc:404
+#: src/lib/film.cc:405
 msgid ""
 "This film was created with an older version of DCP-o-matic, and "
 "unfortunately it cannot be loaded into this version.  You will need to "
@@ -568,7 +568,7 @@ msgstr "X"
 msgid "Yet Another Deinterlacing Filter"
 msgstr "Yet Another Deinterlacing Filter"
 
-#: src/lib/film.cc:309
+#: src/lib/film.cc:310
 msgid "You must add some content to the DCP before creating it"
 msgstr "Du måste lägga till något innehåll till DCP:n innan du skapar den"
 
@@ -580,7 +580,7 @@ msgstr "[rörliga bilder]"
 msgid "[still]"
 msgstr "[stillbild]"
 
-#: src/lib/film.cc:257
+#: src/lib/film.cc:258
 msgid "cannot contain slashes"
 msgstr "får inte innehålla snedstreck"
 
@@ -593,11 +593,11 @@ msgstr "uppkopplingen tajmade ur"
 msgid "connecting"
 msgstr "kopplar upp"
 
-#: src/lib/film.cc:305
+#: src/lib/film.cc:306
 msgid "container"
 msgstr "behållare"
 
-#: src/lib/film.cc:313
+#: src/lib/film.cc:314
 msgid "content type"
 msgstr "innehållstyp"
 
@@ -621,7 +621,7 @@ msgstr "kunde inte hitta information om strömmen"
 msgid "could not find video decoder"
 msgstr "kunde inte hitta video-avkodare"
 
-#: src/lib/writer.cc:428
+#: src/lib/writer.cc:435
 msgid "could not move audio MXF into the DCP (%1)"
 msgstr "kunde inte flytta audio-MXF in i DCP:n (%1)"
 
@@ -719,7 +719,7 @@ msgstr "rörlig"
 msgid "multi-part subtitles not yet supported"
 msgstr "undertexter i flera delar stöds inte ännu"
 
-#: src/lib/film.cc:257 src/lib/film.cc:317
+#: src/lib/film.cc:258 src/lib/film.cc:318
 msgid "name"
 msgstr "namn"
 
index 8af0b556a13e7f1a5ceffcc066e9c02d0038c04d..de03222725074b9a6a9fdfa670a463de0f88f396 100644 (file)
@@ -33,13 +33,15 @@ SendKDMEmailJob::SendKDMEmailJob (
        list<shared_ptr<Screen> > screens,
        boost::filesystem::path dcp,
        boost::posix_time::ptime from,
-       boost::posix_time::ptime to
+       boost::posix_time::ptime to,
+       dcp::Formulation formulation
        )
        : Job (f)
        , _screens (screens)
        , _dcp (dcp)
        , _from (from)
        , _to (to)
+       , _formulation (formulation)
 {
 
 }
@@ -62,7 +64,7 @@ SendKDMEmailJob::run ()
        try {
                
                set_progress_unknown ();
-               email_kdms (_film, _screens, _dcp, _from, _to);
+               email_kdms (_film, _screens, _dcp, _from, _to, _formulation);
                set_progress (1);
                set_state (FINISHED_OK);
                
index f4d154a9183b227dc897c97c5660f9f04aef3114..084836715f865fe6a62b52eae1e7ac1536bd202f 100644 (file)
@@ -18,6 +18,7 @@
 */
 
 #include <boost/filesystem.hpp>
+#include <dcp/types.h>
 #include "job.h"
 
 class Screen;
@@ -30,7 +31,8 @@ public:
                std::list<boost::shared_ptr<Screen> >,
                boost::filesystem::path,
                boost::posix_time::ptime,
-               boost::posix_time::ptime
+               boost::posix_time::ptime,
+               dcp::Formulation
                );
 
        std::string name () const;
@@ -42,4 +44,5 @@ private:
        boost::filesystem::path _dcp;
        boost::posix_time::ptime _from;
        boost::posix_time::ptime _to;
+       dcp::Formulation _formulation;
 };
index 66ee2b0e3cf2ca93eeb7512a03763c2598836dcc..fe792e307424501b2c8a6df845c4b202f01d1504 100644 (file)
@@ -79,7 +79,7 @@ Server::~Server ()
        {
                boost::mutex::scoped_lock lm (_worker_mutex);
                _terminate = true;
-               _worker_condition.notify_all ();
+               _empty_condition.notify_all ();
        }
 
        for (vector<boost::thread*>::iterator i = _worker_threads.begin(); i != _worker_threads.end(); ++i) {
@@ -139,7 +139,7 @@ Server::worker_thread ()
        while (1) {
                boost::mutex::scoped_lock lock (_worker_mutex);
                while (_queue.empty () && !_terminate) {
-                       _worker_condition.wait (lock);
+                       _empty_condition.wait (lock);
                }
 
                if (_terminate) {
@@ -194,7 +194,7 @@ Server::worker_thread ()
                        LOG_GENERAL_NC (message.str ());
                }
                
-               _worker_condition.notify_all ();
+               _full_condition.notify_all ();
        }
 }
 
@@ -291,11 +291,11 @@ Server::handle_accept (shared_ptr<Socket> socket, boost::system::error_code cons
        
        /* Wait until the queue has gone down a bit */
        while (_queue.size() >= _worker_threads.size() * 2 && !_terminate) {
-               _worker_condition.wait (lock);
+               _full_condition.wait (lock);
        }
        
        _queue.push_back (socket);
-       _worker_condition.notify_all ();
+       _empty_condition.notify_all ();
 
        start_accept ();
 }
index 9f3e99f9cbe577c20c7c07bedccbe0d7298f8c07..b340bba077953c7320c0fb9f1820e3ca2cf2a556 100644 (file)
@@ -107,8 +107,8 @@ private:
        std::vector<boost::thread *> _worker_threads;
        std::list<boost::shared_ptr<Socket> > _queue;
        boost::mutex _worker_mutex;
-       boost::condition _worker_condition;
-       
+       boost::condition _full_condition;
+       boost::condition _empty_condition;
        boost::shared_ptr<Log> _log;
        bool _verbose;
 
index 7d3afb022856e963ee870b9b323b82c8ff235c5c..094d57f40ee21ab741e5b6afdf9d6dfeae92d424 100644 (file)
@@ -48,7 +48,7 @@ extern "C" {
 
 #define DCPOMATIC_HELLO "Boys, you gotta learn not to talk to nuns that way"
 
-namespace libdcp {
+namespace dcp {
        class Signer;
 }
 
index 05f5c538eee2a81c6344f603ab2bfa3e60dfd2cb..f52a75e706c5105067117c66cf6921556afe5a55 100644 (file)
@@ -408,6 +408,21 @@ VideoContent::scale_and_crop_to_fit_height ()
        set_right_crop (crop / 2);
 }
 
+void
+VideoContent::set_video_frame_rate (float r)
+{
+       {
+               boost::mutex::scoped_lock lm (_mutex);
+               if (_video_frame_rate == r) {
+                       return;
+               }
+               
+               _video_frame_rate = r;
+       }
+       
+       signal_changed (VideoContentProperty::VIDEO_FRAME_RATE);
+}
+
 VideoContentScale::VideoContentScale (Ratio const * r)
        : _ratio (r)
        , _scale (true)
index 4206efc2c487d047a744d6634271f810d6d447e2..7d9cb4f8f0298eccb5a307b37612b5ab8e6e95be 100644 (file)
@@ -116,6 +116,7 @@ public:
        }
 
        void set_video_frame_type (VideoFrameType);
+       void set_video_frame_rate (float);
 
        void set_left_crop (int);
        void set_right_crop (int);
index 580dfe4f21d19e0bfb452a37d32e413ad247d6b5..33817ca6eb8b6479b6eedec4539bae54c2faed91 100644 (file)
@@ -139,6 +139,7 @@ Writer::write (shared_ptr<const EncodedData> encoded, int frame, Eyes eyes)
        boost::mutex::scoped_lock lock (_mutex);
 
        while (_queued_full_in_memory > _maximum_frames_in_memory) {
+               /* The queue is too big; wait until that is sorted out */
                _full_condition.wait (lock);
        }
 
@@ -160,7 +161,8 @@ Writer::write (shared_ptr<const EncodedData> encoded, int frame, Eyes eyes)
                _queue.push_back (qi);
                ++_queued_full_in_memory;
        }
-       
+
+       /* Now there's something to do: wake anything wait()ing on _empty_condition */
        _empty_condition.notify_all ();
 }
 
@@ -170,6 +172,7 @@ Writer::fake_write (int frame, Eyes eyes)
        boost::mutex::scoped_lock lock (_mutex);
 
        while (_queued_full_in_memory > _maximum_frames_in_memory) {
+               /* The queue is too big; wait until that is sorted out */
                _full_condition.wait (lock);
        }
        
@@ -191,6 +194,7 @@ Writer::fake_write (int frame, Eyes eyes)
                _queue.push_back (qi);
        }
 
+       /* Now there's something to do: wake anything wait()ing on _empty_condition */
        _empty_condition.notify_all ();
 }
 
@@ -244,9 +248,11 @@ try
                while (1) {
                        
                        if (_finish || _queued_full_in_memory > _maximum_frames_in_memory || have_sequenced_image_at_queue_head ()) {
+                               /* We've got something to do: go and do it */
                                break;
                        }
 
+                       /* Nothing to do: wait until something happens which may indicate that we do */
                        LOG_TIMING (N_("writer sleeps with a queue of %1"), _queue.size());
                        _empty_condition.wait (lock);
                        LOG_TIMING (N_("writer wakes with a queue of %1"), _queue.size());
@@ -336,6 +342,7 @@ try
                        --_queued_full_in_memory;
                }
 
+               /* The queue has probably just gone down a bit; notify anything wait()ing on _full_condition */
                _full_condition.notify_all ();
        }
 }
index 237fa4e58ee311f1882d4bbe46ade60b707ceac4..1fb7feb7de2a8da436650af4f78de93be7101c57 100644 (file)
@@ -470,10 +470,10 @@ private:
 
                try {
                        if (d->write_to ()) {
-                               write_kdm_files (film, d->screens (), d->cpl (), d->from (), d->until (), d->directory ());
+                               write_kdm_files (film, d->screens (), d->cpl (), d->from (), d->until (), d->formulation (), d->directory ());
                        } else {
                                JobManager::instance()->add (
-                                       shared_ptr<Job> (new SendKDMEmailJob (film, d->screens (), d->cpl (), d->from (), d->until ()))
+                                       shared_ptr<Job> (new SendKDMEmailJob (film, d->screens (), d->cpl (), d->from (), d->until (), d->formulation ()))
                                        );
                        }
                } catch (dcp::NotEncryptedError& e) {
index 0f2d5b8a31ad5e6c757a27d8702a1fe0d396726e..fa14dd141ad03f210380e76fa1245b534e6d5b96 100644 (file)
@@ -44,6 +44,7 @@ help ()
                "  -f, --valid-from       valid from time (in local time zone) (e.g. \"2013-09-28 01:41:51\") or \"now\"\n"
                "  -t, --valid-to         valid to time (in local time zone) (e.g. \"2014-09-28 01:41:51\")\n"
                "  -d, --valid-duration   valid duration (e.g. \"1 day\", \"4 hours\", \"2 weeks\")\n"
+               "      --formulation      modified-transitional-1, dci-any or dci-specific [default modified-transitional-1]\n"
                "  -z, --zip              ZIP each cinema's KDMs into its own file\n"
                "  -v, --verbose          be verbose\n"
                "  -c, --cinema           specify a cinema, either by name or email address\n"
@@ -110,6 +111,7 @@ int main (int argc, char* argv[])
        bool cinemas = false;
        string duration_string;
        bool verbose = false;
+       dcp::Formulation formulation = dcp::MODIFIED_TRANSITIONAL_1;
 
        program_name = argv[0];
        
@@ -126,10 +128,11 @@ int main (int argc, char* argv[])
                        { "zip", no_argument, 0, 'z' },
                        { "duration", required_argument, 0, 'd' },
                        { "verbose", no_argument, 0, 'v' },
+                       { "formulation", required_argument, 0, 'C' },
                        { 0, 0, 0, 0 }
                };
 
-               int c = getopt_long (argc, argv, "ho:f:t:c:A:Bzd:v", long_options, &option_index);
+               int c = getopt_long (argc, argv, "ho:f:t:c:A:Bzd:vC:", long_options, &option_index);
 
                if (c == -1) {
                        break;
@@ -166,6 +169,16 @@ int main (int argc, char* argv[])
                case 'v':
                        verbose = true;
                        break;
+               case 'C':
+                       if (string (optarg) == "modified-transitional-1") {
+                               formulation = dcp::MODIFIED_TRANSITIONAL_1;
+                       } else if (string (optarg) == "dci-any") {
+                               formulation = dcp::DCI_ANY;
+                       } else if (string (optarg) == "dci-specific") {
+                               formulation = dcp::DCI_SPECIFIC;
+                       } else {
+                               error ("unrecognised KDM formulation " + formulation);
+                       }
                }
        }
 
@@ -236,7 +249,7 @@ int main (int argc, char* argv[])
                }
                
                shared_ptr<dcp::Certificate> certificate (new dcp::Certificate (boost::filesystem::path (certificate_file)));
-               dcp::EncryptedKDM kdm = film->make_kdm (certificate, cpl, valid_from.get(), valid_to.get());
+               dcp::EncryptedKDM kdm = film->make_kdm (certificate, cpl, valid_from.get(), valid_to.get(), formulation);
                kdm.as_xml (output);
                if (verbose) {
                        cout << "Generated KDM " << output << " for certificate.\n";
@@ -260,13 +273,18 @@ int main (int argc, char* argv[])
 
                try {
                        if (zip) {
-                               write_kdm_zip_files (film, (*i)->screens(), cpl, dcp::LocalTime (valid_from.get()), dcp::LocalTime (valid_to.get()), output);
-
+                               write_kdm_zip_files (
+                                       film, (*i)->screens(), cpl, dcp::LocalTime (valid_from.get()), dcp::LocalTime (valid_to.get()), formulation, output
+                                       );
+                               
                                if (verbose) {
                                        cout << "Wrote ZIP files to " << output << "\n";
                                }
                        } else {
-                               write_kdm_files (film, (*i)->screens(), cpl, dcp::LocalTime (valid_from.get()), dcp::LocalTime (valid_to.get()), output);
+                               write_kdm_files (
+                                       film, (*i)->screens(), cpl, dcp::LocalTime (valid_from.get()), dcp::LocalTime (valid_to.get()), formulation, output
+                                       );
+                               
                                if (verbose) {
                                        cout << "Wrote KDM files to " << output << "\n";
                                }
index 8d4a51bac303bdea4a94622667b9aa72b3f09c47..209458f23f2fda036af810669ef993ffa4ce6f58 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-06-21 02:38+0100\n"
 "Last-Translator: Carsten Kurz\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
index 1fb15f5a0d3c962e540e6f77f79aba2c7fceaa2a..374877caf1479e6363016df0d4be681ca357315b 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: DCPOMATIC\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-04-20 10:21-0500\n"
 "Last-Translator: Manuel AC <manuel.acevedo@civantos.>\n"
 "Language-Team: Manuel AC <manuel.acevedo@civantos.com>\n"
index cb81a49958881a97f5511b69d1eff2780c35f570..fca31b0b5d3ec64c9b9275d28fdd5e7515945a4f 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: DCP-o-matic FRENCH\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-06-20 15:57+0100\n"
 "Last-Translator: \n"
 "Language-Team: \n"
index 0d49d139653b6da591ab74a9da4fd58264541326..c3baa96d199aeb0b0d76d91ee3453680fc2d03c4 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: IT VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-02-03 09:36+0100\n"
 "Last-Translator: William Fanelli <william.f@impronte.com>\n"
 "Language-Team: \n"
index 7a6bd060209a82acc255b04b50bb03faad062855..fe0bf7ef8dfbcba958943ac97767e6b1d9e23811 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: DCP-o-matic\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-03-30 19:38+0100\n"
 "Last-Translator: Theo Kooijmans <tkooijmans@universaldv.nl>\n"
 "Language-Team: UniversalDV <Tkooijmans@universaldv.nl>\n"
index fb114885e41643821b2b9e33bce394ac10fded52..be2a243c5c6276737de9421998b85ea9665fdb41 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: DCP-o-matic\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-01-19 08:59+0100\n"
 "Last-Translator: Adam Klotblixt <adam.klotblixt@gmail.com>\n"
 "Language-Team: \n"
index 21274cda21211335c9e8e06943a8399318f4f67e..b8eecc90a59d889d4e375c3d896a4f1537097b57 100644 (file)
@@ -116,6 +116,7 @@ AboutDialog::AboutDialog (wxWindow* parent)
        supported_by.Add (wxT ("Manual AC"));
        supported_by.Add (wxT ("Kambiz Afshar"));
        supported_by.Add (wxT ("Louis Belloisy"));
+       supported_by.Add (wxT ("Mike Blakesley"));
        supported_by.Add (wxT ("Jeff Boot"));
        supported_by.Add (wxT ("Kieran Carroll"));
        supported_by.Add (wxT ("Frank Cianciolo"));
index 6750e0e98cb5606fa154c15e7f1cbc0a861759b1..0fdb1fe5051eda24adf941bde7eeafbc287ddddf 100644 (file)
@@ -159,6 +159,14 @@ KDMDialog::KDMDialog (wxWindow* parent, boost::shared_ptr<const Film> film)
        
        table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, 0);
 
+       add_label_to_sizer (table, this, _("KDM type"), true);
+       _type = new wxChoice (this, wxID_ANY);
+       _type->Append ("Modified Transitional 1");
+       _type->Append ("DCI Any");
+       _type->Append ("DCI Specific");
+       table->Add (_type, 1, wxEXPAND);
+       _type->SetSelection (0);
+
        _write_to = new wxRadioButton (this, wxID_ANY, _("Write to"));
        table->Add (_write_to, 1, wxEXPAND);
 
@@ -480,6 +488,21 @@ KDMDialog::write_to () const
        return _write_to->GetValue ();
 }
 
+dcp::Formulation
+KDMDialog::formulation () const
+{
+       switch (_type->GetSelection()) {
+       case 0:
+               return dcp::MODIFIED_TRANSITIONAL_1;
+       case 1:
+               return dcp::DCI_ANY;
+       case 2:
+               return dcp::DCI_SPECIFIC;
+       default:
+               assert (false);
+       }
+}
+
 void
 KDMDialog::update_cpl_choice ()
 {
index 6327b29e8d1b84db982a3529b499da97150b31b3..0fc95db8443dee447023e7170b3ee964c0daef85 100644 (file)
@@ -48,6 +48,7 @@ public:
        boost::filesystem::path cpl () const;
        boost::filesystem::path directory () const;
        bool write_to () const;
+       dcp::Formulation formulation () const;
 
 private:
        void add_cinema (boost::shared_ptr<Cinema>);
@@ -83,6 +84,7 @@ private:
        wxStaticText* _dcp_directory;
        wxStaticText* _cpl_id;
        wxStaticText* _cpl_annotation_text;
+       wxChoice* _type;
        wxRadioButton* _write_to;
 #ifdef DCPOMATIC_USE_OWN_DIR_PICKER
        DirPickerCtrl* _folder;
index 017383c03dc1996dc778e07a52a6dcd96b8e1f87..d0dcccb756008fd9d99de5684f261871ae1d1818 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-06-21 04:06+0100\n"
 "Last-Translator: Carsten Kurz\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -941,7 +941,7 @@ msgstr "Untertitel Sprache (z.B. EN)"
 msgid "Subtitles"
 msgstr "Untertitel"
 
-#: src/wx/about_dialog.cc:152
+#: src/wx/about_dialog.cc:153
 msgid "Supported by"
 msgstr "Unterstützt durch"
 
@@ -965,7 +965,7 @@ msgstr "Gebiet (z.B. UK)"
 msgid "Test version "
 msgstr "Test Version"
 
-#: src/wx/about_dialog.cc:197
+#: src/wx/about_dialog.cc:198
 msgid "Tested by"
 msgstr "Getestet von"
 
@@ -1148,7 +1148,7 @@ msgstr ""
 "Ihr DCP hat weniger als 6 Audiokanäle. Das kann auf manchen Projektoren zu "
 "Problemen führen."
 
-#: src/wx/timeline.cc:216
+#: src/wx/timeline.cc:220
 msgid "audio"
 msgstr "Ton"
 
@@ -1173,7 +1173,7 @@ msgstr "ms"
 msgid "s"
 msgstr "s"
 
-#: src/wx/timeline.cc:239
+#: src/wx/timeline.cc:243
 msgid "still"
 msgstr "Standbild"
 
@@ -1181,7 +1181,7 @@ msgstr "Standbild"
 msgid "times"
 msgstr "Zeiten"
 
-#: src/wx/timeline.cc:237
+#: src/wx/timeline.cc:241
 msgid "video"
 msgstr "Bild"
 
index d7e48c04574b26bcb09986acf3581ead1f3388fc..d84e5355c09821e12e57c37366de44c21c6107bd 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: libdcpomatic-wx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-04-20 12:06-0500\n"
 "Last-Translator: Manuel AC <manuel.acevedo@civantos.>\n"
 "Language-Team: Manuel AC <manuel.acevedo@civantos.com>\n"
@@ -947,7 +947,7 @@ msgstr "Idioma del subtítulo (ej. EN)"
 msgid "Subtitles"
 msgstr "Subtítulos"
 
-#: src/wx/about_dialog.cc:152
+#: src/wx/about_dialog.cc:153
 msgid "Supported by"
 msgstr "Soportado por"
 
@@ -972,7 +972,7 @@ msgstr "Territorio (ej. ES)"
 msgid "Test version "
 msgstr "Versión en prueba"
 
-#: src/wx/about_dialog.cc:197
+#: src/wx/about_dialog.cc:198
 msgid "Tested by"
 msgstr "Comprobado por"
 
@@ -1156,7 +1156,7 @@ msgstr ""
 "Tu DCP tiene menos de 6 canales de audio. Esto puede causar problemas con "
 "algunos proyectores."
 
-#: src/wx/timeline.cc:216
+#: src/wx/timeline.cc:220
 msgid "audio"
 msgstr "audio"
 
@@ -1181,7 +1181,7 @@ msgstr "ms"
 msgid "s"
 msgstr "s"
 
-#: src/wx/timeline.cc:239
+#: src/wx/timeline.cc:243
 msgid "still"
 msgstr "fijo"
 
@@ -1189,7 +1189,7 @@ msgstr "fijo"
 msgid "times"
 msgstr "veces"
 
-#: src/wx/timeline.cc:237
+#: src/wx/timeline.cc:241
 msgid "video"
 msgstr "vídeo"
 
index 9801710ebfabb3d7629d829ea0bdfd6fcb0ab0e8..766bd3ad3f56cef828d66bc1db7553e26ac464da 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: DCP-o-matic FRENCH\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-06-20 16:08+0100\n"
 "Last-Translator: \n"
 "Language-Team: \n"
@@ -939,7 +939,7 @@ msgstr "Langue de sous-titres (ex. FR)"
 msgid "Subtitles"
 msgstr "Sous-titres"
 
-#: src/wx/about_dialog.cc:152
+#: src/wx/about_dialog.cc:153
 msgid "Supported by"
 msgstr "Soutenu par"
 
@@ -963,7 +963,7 @@ msgstr "Territoire (ex. FR)"
 msgid "Test version "
 msgstr "Version Test"
 
-#: src/wx/about_dialog.cc:197
+#: src/wx/about_dialog.cc:198
 msgid "Tested by"
 msgstr "Testé par"
 
@@ -1145,7 +1145,7 @@ msgstr ""
 "Votre DCP a moins de 6 canaux audio.  Cela peut créer des problèmes de "
 "lecture sur certains projecteurs."
 
-#: src/wx/timeline.cc:216
+#: src/wx/timeline.cc:220
 msgid "audio"
 msgstr "audio"
 
@@ -1170,7 +1170,7 @@ msgstr "ms"
 msgid "s"
 msgstr "s"
 
-#: src/wx/timeline.cc:239
+#: src/wx/timeline.cc:243
 msgid "still"
 msgstr "fixe"
 
@@ -1178,7 +1178,7 @@ msgstr "fixe"
 msgid "times"
 msgstr "fois"
 
-#: src/wx/timeline.cc:237
+#: src/wx/timeline.cc:241
 msgid "video"
 msgstr "vidéo"
 
index 79febb5abc3415c9ad008c3109a2cb299d6a0461..7789601a76912011814177cd107798e6a547d507 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: IT VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-02-03 10:46+0100\n"
 "Last-Translator: William Fanelli <william.f@impronte.com>\n"
 "Language-Team: \n"
@@ -958,7 +958,7 @@ msgstr "Lingua dei Sottotitoli (es. FR)"
 msgid "Subtitles"
 msgstr "Sottotitoli"
 
-#: src/wx/about_dialog.cc:152
+#: src/wx/about_dialog.cc:153
 msgid "Supported by"
 msgstr ""
 
@@ -984,7 +984,7 @@ msgstr "Nazione (es. UK)"
 msgid "Test version "
 msgstr "Versione di test"
 
-#: src/wx/about_dialog.cc:197
+#: src/wx/about_dialog.cc:198
 msgid "Tested by"
 msgstr ""
 
@@ -1167,7 +1167,7 @@ msgstr ""
 "Il vostro DCP ha meno di 6 canali audio. Questo può causare problemi su "
 "alcuni proiettori."
 
-#: src/wx/timeline.cc:216
+#: src/wx/timeline.cc:220
 #, fuzzy
 msgid "audio"
 msgstr "Audio"
@@ -1193,7 +1193,7 @@ msgstr "ms"
 msgid "s"
 msgstr "s"
 
-#: src/wx/timeline.cc:239
+#: src/wx/timeline.cc:243
 msgid "still"
 msgstr ""
 
@@ -1201,7 +1201,7 @@ msgstr ""
 msgid "times"
 msgstr ""
 
-#: src/wx/timeline.cc:237
+#: src/wx/timeline.cc:241
 #, fuzzy
 msgid "video"
 msgstr "Video"
index 514ec466560f1c8960a562ff74738c877523ad25..b33e4a748695c389399fc7c04be32d6cc74d6b33 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: DCP-o-matic\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-03-30 19:40+0100\n"
 "Last-Translator: Theo Kooijmans <tkooijmans@universaldv.nl>\n"
 "Language-Team: UniversalDV <TKooijmans@universaldv.nl>\n"
@@ -953,7 +953,7 @@ msgstr "Ondertitel Taal (vb  NL)"
 msgid "Subtitles"
 msgstr "Ondertitels"
 
-#: src/wx/about_dialog.cc:152
+#: src/wx/about_dialog.cc:153
 msgid "Supported by"
 msgstr "Ondersteund door"
 
@@ -978,7 +978,7 @@ msgstr "Grondgebied (vb NL)"
 msgid "Test version "
 msgstr "Test Versie"
 
-#: src/wx/about_dialog.cc:197
+#: src/wx/about_dialog.cc:198
 msgid "Tested by"
 msgstr "Getest door"
 
@@ -1160,7 +1160,7 @@ msgstr ""
 "Uw DCP heeft minder dan 6 audio kanalen. This kan problemen geven op sommige "
 "projectors."
 
-#: src/wx/timeline.cc:216
+#: src/wx/timeline.cc:220
 msgid "audio"
 msgstr "audio"
 
@@ -1185,7 +1185,7 @@ msgstr "ms"
 msgid "s"
 msgstr "s"
 
-#: src/wx/timeline.cc:239
+#: src/wx/timeline.cc:243
 msgid "still"
 msgstr "still"
 
@@ -1193,7 +1193,7 @@ msgstr "still"
 msgid "times"
 msgstr "tijden"
 
-#: src/wx/timeline.cc:237
+#: src/wx/timeline.cc:241
 msgid "video"
 msgstr "video"
 
index dd62b1e2987d1ff33594f2c73a145efc87570a72..657fe847ad6b23da34dda51f31ff2c9d6467f27c 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: DCP-o-matic\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 00:25+0100\n"
+"POT-Creation-Date: 2014-06-24 14:53+0100\n"
 "PO-Revision-Date: 2014-01-19 09:14+0100\n"
 "Last-Translator: Adam Klotblixt <adam.klotblixt@gmail.com>\n"
 "Language-Team: \n"
@@ -970,7 +970,7 @@ msgstr "Undertextspråk (ex. SV)"
 msgid "Subtitles"
 msgstr "Undertexter"
 
-#: src/wx/about_dialog.cc:152
+#: src/wx/about_dialog.cc:153
 msgid "Supported by"
 msgstr "Stöd från"
 
@@ -995,7 +995,7 @@ msgstr "Område (ex. SV)"
 msgid "Test version "
 msgstr "Testversion"
 
-#: src/wx/about_dialog.cc:197
+#: src/wx/about_dialog.cc:198
 #, fuzzy
 msgid "Tested by"
 msgstr "Översatt av"
@@ -1183,7 +1183,7 @@ msgstr ""
 "Din DCP har mindre än 6 audiokanaler. Detta kan medföra problem på vissa "
 "projektorer."
 
-#: src/wx/timeline.cc:216
+#: src/wx/timeline.cc:220
 msgid "audio"
 msgstr "audio"
 
@@ -1208,7 +1208,7 @@ msgstr "ms"
 msgid "s"
 msgstr "s"
 
-#: src/wx/timeline.cc:239
+#: src/wx/timeline.cc:243
 msgid "still"
 msgstr "stillbild"
 
@@ -1217,7 +1217,7 @@ msgstr "stillbild"
 msgid "times"
 msgstr "tider"
 
-#: src/wx/timeline.cc:237
+#: src/wx/timeline.cc:241
 msgid "video"
 msgstr "video"
 
index 4b56168a1d0636be5d56642d212b8050e19b61ce..534f4eda752ad4078c9d6afbc982a138de4586d9 100644 (file)
@@ -127,6 +127,10 @@ public:
                _track = t;
        }
 
+       void unset_track () {
+               _track = boost::optional<int> ();
+       }
+
        optional<int> track () const {
                return _track;
        }
@@ -386,7 +390,8 @@ Timeline::Timeline (wxWindow* parent, FilmEditor* ed, shared_ptr<Film> film)
 
        SetMinSize (wxSize (640, tracks() * track_height() + 96));
 
-       _playlist_connection = film->playlist()->Changed.connect (bind (&Timeline::playlist_changed, this));
+       _playlist_changed_connection = film->playlist()->Changed.connect (bind (&Timeline::playlist_changed, this));
+       _playlist_content_changed_connection = film->playlist()->ContentChanged.connect (bind (&Timeline::playlist_content_changed, this, _2));
 }
 
 void
@@ -440,9 +445,28 @@ Timeline::playlist_changed ()
        Refresh ();
 }
 
+void
+Timeline::playlist_content_changed (int property)
+{
+       ensure_ui_thread ();
+
+       if (property == ContentProperty::POSITION) {
+               assign_tracks ();
+               setup_pixels_per_second ();
+               Refresh ();
+       }
+}
+
 void
 Timeline::assign_tracks ()
 {
+       for (ViewList::iterator i = _views.begin(); i != _views.end(); ++i) {
+               shared_ptr<ContentView> c = dynamic_pointer_cast<ContentView> (*i);
+               if (c) {
+                       c->unset_track ();
+               }
+       }
+
        for (ViewList::iterator i = _views.begin(); i != _views.end(); ++i) {
                shared_ptr<ContentView> cv = dynamic_pointer_cast<ContentView> (*i);
                if (!cv) {
@@ -680,7 +704,7 @@ Timeline::set_position_from_event (wxMouseEvent& ev)
        if (new_position < DCPTime ()) {
                new_position = DCPTime ();
        }
-       
+
        _down_view->content()->set_position (new_position);
        
        shared_ptr<Film> film = _film.lock ();
index 4ba1cc425f022b6fe11d634052f7915a5c012ee8..8f23f68941e6428a834910ac7dd988d813f6adb5 100644 (file)
@@ -79,6 +79,7 @@ private:
        void right_down (wxMouseEvent &);
        void mouse_moved (wxMouseEvent &);
        void playlist_changed ();
+       void playlist_content_changed (int);
        void resized ();
        void assign_tracks ();
        void set_position_from_event (wxMouseEvent &);
@@ -105,5 +106,6 @@ private:
        ContentMenu _menu;
        bool _snap;
 
-       boost::signals2::scoped_connection _playlist_connection;
+       boost::signals2::scoped_connection _playlist_changed_connection;
+       boost::signals2::scoped_connection _playlist_content_changed_connection;
 };
index 9a4551193e9672dfe2ed4468fe01678f5af556c5..df77a2ef1a5b38006fae2c31e60c0a5341e7dbd9 100644 (file)
@@ -17,6 +17,7 @@
 
 */
 
+#include <dcp/raw_convert.h>
 #include "lib/content.h"
 #include "lib/image_content.h"
 #include "timing_panel.h"
@@ -28,7 +29,7 @@ using std::cout;
 using std::string;
 using boost::shared_ptr;
 using boost::dynamic_pointer_cast;
-using boost::lexical_cast;
+using dcp::raw_convert;
 
 TimingPanel::TimingPanel (FilmEditor* e)
        /* horrid hack for apparent lack of context support with wxWidgets i18n code */
@@ -124,7 +125,7 @@ TimingPanel::film_content_changed (int property)
                if (content) {
                        shared_ptr<VideoContent> vc = dynamic_pointer_cast<VideoContent> (content);
                        if (vc) {
-                               _video_frame_rate->SetValue (std_to_wx (lexical_cast<string> (vc->video_frame_rate ())));
+                               _video_frame_rate->SetValue (std_to_wx (raw_convert<string> (vc->video_frame_rate (), 5)));
                        } else {
                                _video_frame_rate->SetValue ("24");
                        }
@@ -133,10 +134,11 @@ TimingPanel::film_content_changed (int property)
                }
        }
 
+       shared_ptr<VideoContent> vc = dynamic_pointer_cast<VideoContent> (content);
        shared_ptr<ImageContent> ic = dynamic_pointer_cast<ImageContent> (content);
        _full_length->set_editable (ic && ic->still ());
        _play_length->set_editable (!ic || !ic->still ());
-       _video_frame_rate->Enable (ic && !ic->still ());
+       _video_frame_rate->Enable (vc);
        _set_video_frame_rate->Enable (false);
 }
 
@@ -201,9 +203,9 @@ TimingPanel::set_video_frame_rate ()
 {
        ContentList c = _editor->selected_content ();
        if (c.size() == 1) {
-               shared_ptr<ImageContent> ic = dynamic_pointer_cast<ImageContent> (c.front ());
-               if (ic) {
-                       ic->set_video_frame_rate (lexical_cast<float> (wx_to_std (_video_frame_rate->GetValue ())));
+               shared_ptr<VideoContent> vc = dynamic_pointer_cast<VideoContent> (c.front ());
+               if (vc) {
+                       vc->set_video_frame_rate (raw_convert<float> (wx_to_std (_video_frame_rate->GetValue ())));
                }
                _set_video_frame_rate->Enable (false);
        }
index 0c87c09be0d9ac321fac36ed57d9c31b39c969f0..bc21f9d81b22277723133598f748ad13ed05b08f 100644 (file)
@@ -64,6 +64,10 @@ def configure(conf):
         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',
                                     'wx_gtk2u_adv-3.0', 'wx_gtk2u_core-3.0', 'wx_baseu_xml-3.0', 'wx_baseu-3.0']
         conf.env.LIB_WXWIDGETS = ['tiff', 'SM', 'dl', 'jpeg', 'png', 'X11', 'expat']
+        if conf.env.TARGET_DEBIAN and conf.env.DEBIAN_UNSTABLE:
+            conf.env.LIB_WXWIDGETS.append('Xxf86vm')
+            conf.env.LIB_WXWIDGETS.append('Xext')
+            conf.env.LIB_WXWIDGETS.append('X11')
  
     conf.in_msg = 1
     wx_version = conf.check_cfg(package='', path=conf.options.wx_config, args='--version').strip()
index dd1b64162a7051f564513a17f362e39e2398b7f9..c2ea833bd859c13e7f6cf7136d1f89f1f12de314 100644 (file)
@@ -101,5 +101,25 @@ BOOST_AUTO_TEST_CASE (isdcf_name_test)
        film->set_isdcf_metadata (m);
        film->set_video_frame_rate (48);
        BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilmWith_XSN-2-Temp-Pre-RedBand-MyChain-2D-4fl-48_F-133_DE-FR_US-R_10_4K_DI_20140704_PP_SMPTE_VF");
+
+       /* Test a name which is already in camelCase */
+
+       film->set_three_d (false);
+       m.temp_version = false;
+       m.pre_release = false;
+       m.red_band = false;
+       m.chain = "";
+       m.two_d_version_of_three_d = false;
+       m.mastered_luminance = "";
+       film->set_isdcf_metadata (m);
+       film->set_video_frame_rate (24);
+       film->set_name ("IKnowCamels");
+       BOOST_CHECK_EQUAL (film->isdcf_name(false), "IKnowCamels_XSN-2_F-133_DE-FR_US-R_10_4K_DI_20140704_PP_SMPTE_VF");
+
+       /* And one in capitals */
+
+       film->set_name ("LIKE SHOUTING");
+       BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-FR_US-R_10_4K_DI_20140704_PP_SMPTE_VF");
 }
 
+
index 0ae2fd13713f3bb45d25fbd8c34dbf6f5e688735..f6c3a4bb2bbc87616ffc3cfbeb84a3ffacc07704 100644 (file)
@@ -40,12 +40,12 @@ BOOST_AUTO_TEST_CASE (make_black_test)
        dcp::Size out_size (1024, 1024);
 
        list<AVPixelFormat> pix_fmts;
-       pix_fmts.push_back (AV_PIX_FMT_RGB24);
+       pix_fmts.push_back (AV_PIX_FMT_RGB24); // 2
        pix_fmts.push_back (AV_PIX_FMT_ARGB);
        pix_fmts.push_back (AV_PIX_FMT_RGBA);
        pix_fmts.push_back (AV_PIX_FMT_ABGR);
        pix_fmts.push_back (AV_PIX_FMT_BGRA);
-       pix_fmts.push_back (AV_PIX_FMT_YUV420P);
+       pix_fmts.push_back (AV_PIX_FMT_YUV420P); // 0
        pix_fmts.push_back (AV_PIX_FMT_YUV411P);
        pix_fmts.push_back (AV_PIX_FMT_YUV422P10LE);
        pix_fmts.push_back (AV_PIX_FMT_YUV422P16LE);
@@ -75,7 +75,8 @@ BOOST_AUTO_TEST_CASE (make_black_test)
        pix_fmts.push_back (AV_PIX_FMT_YUVA420P16LE);
        pix_fmts.push_back (AV_PIX_FMT_YUVA422P16LE);
        pix_fmts.push_back (AV_PIX_FMT_YUVA444P16LE);
-
+       pix_fmts.push_back (AV_PIX_FMT_RGB555LE); // 46
+       
        int N = 0;
        for (list<AVPixelFormat>::const_iterator i = pix_fmts.begin(); i != pix_fmts.end(); ++i) {
                boost::shared_ptr<Image> foo (new Image (*i, in_size, true));
diff --git a/wscript b/wscript
index 57f8a1bb693a3ee9b7cbf3c99108ec8676631859..df839a96befcd1087d2ad00c445ac71fb077d9b4 100644 (file)
--- a/wscript
+++ b/wscript
@@ -13,6 +13,7 @@ def options(opt):
     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('--debian-unstable',   action='store_true', default=False, help='add extra libraries to static-build correctly on Debian unstable')
     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')
@@ -55,7 +56,7 @@ def dynamic_openjpeg(conf):
     conf.check_cfg(package='libopenjpeg', args='--cflags --libs', max_version='1.5.2', mandatory=True)
 
 def static_dcp(conf, static_boost, static_xmlpp, static_xmlsec, static_ssh):
-    conf.check_cfg(package='libdcp-1.0', atleast_version='0.92', args='--cflags', uselib_store='DCP', mandatory=True)
+    conf.check_cfg(package='libdcp-1.0', atleast_version='0.95', 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-1.0', 'asdcp-libdcp-1.0', 'kumu-libdcp-1.0']
     conf.env.LIB_DCP = ['glibmm-2.4', 'ssl', 'crypto', 'bz2', 'xslt']
@@ -163,6 +164,7 @@ def configure(conf):
     conf.env.TARGET_WINDOWS = conf.options.target_windows
     conf.env.DISABLE_GUI = conf.options.disable_gui
     conf.env.TARGET_DEBIAN = conf.options.target_debian
+    conf.env.DEBIAN_UNSTABLE = conf.options.debian_unstable
     conf.env.TARGET_CENTOS = conf.options.target_centos
     conf.env.VERSION = VERSION
     conf.env.TARGET_OSX = sys.platform == 'darwin'