Work around deadlock when destroying J2KEncoder with a full writer queue (#2784). main v2.16.83
authorCarl Hetherington <cth@carlh.net>
Sun, 5 May 2024 19:34:29 +0000 (21:34 +0200)
committerCarl Hetherington <cth@carlh.net>
Tue, 7 May 2024 23:33:41 +0000 (01:33 +0200)
This feels like a hack, but I can't think of a nicer way to do it.

The interruption disable makes sense because when we destroy encoder threads
during a DCP encode (because a remote server goes away, for example) we don't
want any frames to be lost due to the encode thread being interrupted between
taking the frame off the queue and sending it to the writer.

When we're destroying the encoder we don't care about this, but I can't see
how you'd differentiate.

Maybe the encoder queue could have two lists: to-do and in-progress;
the encoder thread atomically moves a frame from to-do to in-progress,
but then how do you know when the in-progress ones are orphaned and need
to be re-added to the main queue.

You could make the writer return saying "no" if the queue is full (rather
than blocking and waiting for the queue to empty) but that seems wasteful
as then the frame would be re-encoded.

26 files changed:
cscript
run/environment
run/tests
src/lib/ffmpeg_content.cc
src/lib/ffmpeg_decoder.cc
src/lib/ffmpeg_encoder.cc
src/lib/ffmpeg_examiner.cc
src/lib/j2k_encoder.cc
src/lib/po/cs_CZ.po
src/lib/video_content.cc
src/lib/video_content.h
src/lib/writer.cc
src/lib/writer.h
src/lib/wscript
src/tools/dcpomatic.cc
src/tools/po/cs_CZ.po
src/wx/po/cs_CZ.po
src/wx/send_i18n_dialog.cc [deleted file]
src/wx/send_i18n_dialog.h [deleted file]
src/wx/supporters.cc
src/wx/verify_dcp_dialog.cc
src/wx/wscript
test/j2k_encoder_test.cc [new file with mode: 0644]
test/subtitle_timing_test.cc
test/wscript
wscript

diff --git a/cscript b/cscript
index 53d2beb7b40bc1901102b270b55cb641b6f50b6e..f7a61b4406d29bdc6fadbc88e57dd0b9ab7c7a1e 100644 (file)
--- a/cscript
+++ b/cscript
@@ -535,7 +535,7 @@ def dependencies(target, options):
         # Use distro-provided FFmpeg on Arch
         deps = []
 
         # Use distro-provided FFmpeg on Arch
         deps = []
 
-    deps.append(('libdcp', 'v1.8.98'))
+    deps.append(('libdcp', 'v1.8.99'))
     deps.append(('libsub', 'v1.6.47'))
     deps.append(('leqm-nrt', '30dcaea1373ac62fba050e02ce5b0c1085797a23'))
     deps.append(('rtaudio', 'f619b76'))
     deps.append(('libsub', 'v1.6.47'))
     deps.append(('leqm-nrt', '30dcaea1373ac62fba050e02ce5b0c1085797a23'))
     deps.append(('rtaudio', 'f619b76'))
@@ -589,7 +589,7 @@ def configure_options(target, options, for_package=False):
         opt += ' --enable-disk'
 
     if target.platform == 'osx' and target.arch == 'arm64':
         opt += ' --enable-disk'
 
     if target.platform == 'osx' and target.arch == 'arm64':
-        opt += ' --target-macos-arm64 --wx-config=%s/wx-config' % target.bin
+        opt += ' --wx-config=%s/wx-config' % target.bin
 
     return opt
 
 
     return opt
 
@@ -788,6 +788,8 @@ def package_rpm(target, cpu, version, options):
 
     make_spec('dcpomatic2.spec', version, target, options, requires)
     cmd = 'rpmbuild --define "_topdir %s" -bb dcpomatic2.spec' % topdir
 
     make_spec('dcpomatic2.spec', version, target, options, requires)
     cmd = 'rpmbuild --define "_topdir %s" -bb dcpomatic2.spec' % topdir
+    # On Centos 7 we build and install boost ourselves, so we must look for it in the right place
+    target.set('LINKFLAGS', '-L/usr/local/lib')
     target.command(cmd)
     rpms = []
 
     target.command(cmd)
     rpms = []
 
index aabb463f366274de186c8e582fbeca08db4849ba..aa4f77187b63c7b96edabeeb37f74aaf39c41bcc 100644 (file)
@@ -1,6 +1,9 @@
 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 build=$DIR/../build
 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 build=$DIR/../build
-export LD_LIBRARY_PATH=$build/src/lib:$build/src/wx:$build/src/asdcplib/src:/usr/local/lib64:/usr/local/lib:$LD_LIBRARY_PATH
+export LD_LIBRARY_PATH=$build/src/lib:$build/src/wx:/usr/local/lib64:/usr/local/lib:$LD_LIBRARY_PATH
+if [[ $(readlink -f $DIR/..) =~ (.*build/[^/]*) ]]; then
+  export LD_LIBRARY_PATH=${BASH_REMATCH[1]}/lib:$LD_LIBRARY_PATH
+fi
 export DYLD_LIBRARY_PATH=$build/src/lib:$build/src/wx:$build/src/asdcplib/src:/Users/ci/osx-environment/x86_64/10.10/lib:/Users/ci/workspace/lib
 export DCPOMATIC_GRAPHICS=$DIR/../graphics
 
 export DYLD_LIBRARY_PATH=$build/src/lib:$build/src/wx:$build/src/asdcplib/src:/Users/ci/osx-environment/x86_64/10.10/lib:/Users/ci/workspace/lib
 export DCPOMATIC_GRAPHICS=$DIR/../graphics
 
index 6f43290c4f1d56488fd719f7a05b89708c71e78a..bf4c5732edb16d0f5bac2436e1744c5ee6d3c283 100755 (executable)
--- a/run/tests
+++ b/run/tests
@@ -3,7 +3,7 @@
 # e.g. --run_tests=foo
 set -e
 
 # e.g. --run_tests=foo
 set -e
 
-PRIVATE_GIT="5298360d6bbae434fb4625fda1cc9dd6be101df3"
+PRIVATE_GIT="881c48805e352dfe150993814757ca974282be18"
 
 if [ "$1" == "--check" ]; then
        shift 1
 
 if [ "$1" == "--check" ]; then
        shift 1
index c788e7cb1d271296fd201477f9e0e6631de0c32b..4a7c87b341e1046e0efbc4cabe965626d68ce01e 100644 (file)
@@ -295,8 +295,10 @@ FFmpegContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
                                        _filters.push_back(*Filter::from_id("hflip"));
                                } else if (fabs (rot - 90) < 1.0) {
                                        _filters.push_back(*Filter::from_id("90clock"));
                                        _filters.push_back(*Filter::from_id("hflip"));
                                } else if (fabs (rot - 90) < 1.0) {
                                        _filters.push_back(*Filter::from_id("90clock"));
+                                       video->rotate_size();
                                } else if (fabs (rot - 270) < 1.0) {
                                        _filters.push_back(*Filter::from_id("90anticlock"));
                                } else if (fabs (rot - 270) < 1.0) {
                                        _filters.push_back(*Filter::from_id("90anticlock"));
+                                       video->rotate_size();
                                }
                        }
                        if (examiner->has_alpha()) {
                                }
                        }
                        if (examiner->has_alpha()) {
index 7f7a078638b540ba81bbbe38c5ad260970232fa0..6130d8e5fb5c59be98c6aec9c6ed7b78e23eeac1 100644 (file)
@@ -668,11 +668,11 @@ FFmpegDecoder::decode_and_process_subtitle_packet (AVPacket* packet)
        */
        ContentTime from;
        from = sub_period.from + _pts_offset;
        */
        ContentTime from;
        from = sub_period.from + _pts_offset;
+       _have_current_subtitle = true;
        if (sub_period.to) {
                _current_subtitle_to = *sub_period.to + _pts_offset;
        } else {
                _current_subtitle_to = optional<ContentTime>();
        if (sub_period.to) {
                _current_subtitle_to = *sub_period.to + _pts_offset;
        } else {
                _current_subtitle_to = optional<ContentTime>();
-               _have_current_subtitle = true;
        }
 
        ContentBitmapText bitmap_text(from);
        }
 
        ContentBitmapText bitmap_text(from);
index 60241b23319f3816b265a5b3beacebb07d4ee62b..c1170f098ce8b416cacd1ab1562e4d99cd4a1fd7 100644 (file)
@@ -102,7 +102,7 @@ FFmpegEncoder::stereo_map() const
                map.set(dcp::Channel::CENTRE, 1, overall_gain * minus_3dB);
                map.set(dcp::Channel::LS,     0, overall_gain);
                break;
                map.set(dcp::Channel::CENTRE, 1, overall_gain * minus_3dB);
                map.set(dcp::Channel::LS,     0, overall_gain);
                break;
-       case 6:
+       default:
                map.set(dcp::Channel::LEFT,   0, overall_gain);
                map.set(dcp::Channel::RIGHT,  1, overall_gain);
                map.set(dcp::Channel::CENTRE, 0, overall_gain * minus_3dB);
                map.set(dcp::Channel::LEFT,   0, overall_gain);
                map.set(dcp::Channel::RIGHT,  1, overall_gain);
                map.set(dcp::Channel::CENTRE, 0, overall_gain * minus_3dB);
@@ -111,7 +111,6 @@ FFmpegEncoder::stereo_map() const
                map.set(dcp::Channel::RS,     1, overall_gain);
                break;
        }
                map.set(dcp::Channel::RS,     1, overall_gain);
                break;
        }
-       /* XXX: maybe we should do something better for >6 channel DCPs */
        return map;
 }
 
        return map;
 }
 
index 15cb14ad53301605df3e96ec4398f7ffdce55b8c..51ade8e89cb844336baa4dfac51ef56be3f4fbea 100644 (file)
@@ -182,7 +182,6 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr<const FFmpegContent> c, shared_ptr<Jo
                auto stream = _format_context->streams[*_video_stream];
                auto rotate_tag = av_dict_get (stream->metadata, "rotate", 0, 0);
                uint8_t* displaymatrix = av_stream_get_side_data (stream, AV_PKT_DATA_DISPLAYMATRIX, 0);
                auto stream = _format_context->streams[*_video_stream];
                auto rotate_tag = av_dict_get (stream->metadata, "rotate", 0, 0);
                uint8_t* displaymatrix = av_stream_get_side_data (stream, AV_PKT_DATA_DISPLAYMATRIX, 0);
-               _rotation = 0;
 
                if (rotate_tag && *rotate_tag->value && strcmp(rotate_tag->value, "0")) {
                        char *tail;
 
                if (rotate_tag && *rotate_tag->value && strcmp(rotate_tag->value, "0")) {
                        char *tail;
@@ -196,7 +195,9 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr<const FFmpegContent> c, shared_ptr<Jo
                        _rotation = - av_display_rotation_get ((int32_t*) displaymatrix);
                }
 
                        _rotation = - av_display_rotation_get ((int32_t*) displaymatrix);
                }
 
-               _rotation = *_rotation - 360 * floor (*_rotation / 360 + 0.9 / 360);
+               if (_rotation) {
+                       _rotation = *_rotation - 360 * floor (*_rotation / 360 + 0.9 / 360);
+               }
        }
 
        LOG_GENERAL("Temporal reference was %1", temporal_reference);
        }
 
        LOG_GENERAL("Temporal reference was %1", temporal_reference);
index 7c9777c1694ed77df52f5af315b3c928e08a2252..32d2fefc2830c86fec1f057179c70d5dd74ef7e6 100644 (file)
@@ -69,6 +69,16 @@ J2KEncoder::~J2KEncoder ()
 {
        _server_found_connection.disconnect();
 
 {
        _server_found_connection.disconnect();
 
+       /* One of our encoder threads may be waiting on Writer::write() to return, if that method
+        * is blocked with the writer queue full waiting for _full_condition.  In that case, the
+        * attempt to terminate the encoder threads below (in terminate_threads()) will fail because
+        * the encoder thread waiting for ::write() will have interruption disabled.
+        *
+        * To work around that, make the writer into a zombie to unblock any pending write()s and
+        * not block on any future ones.
+        */
+       _writer.zombify();
+
        boost::mutex::scoped_lock lm (_threads_mutex);
        terminate_threads ();
 }
        boost::mutex::scoped_lock lm (_threads_mutex);
        terminate_threads ();
 }
index ebd22c1941860c9ce82ee76a8288641cb9702a09..c94799d7dafbdf39f0978ca5b91c6e2b64eb3397 100644 (file)
@@ -8,7 +8,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2024-01-12 00:54+0100\n"
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2024-01-12 00:54+0100\n"
-"PO-Revision-Date: 2023-05-15 09:32+0200\n"
+"PO-Revision-Date: 2024-05-02 15:01+0200\n"
 "Last-Translator: Tomáš Begeni <begeni@razdva.cz>\n"
 "Language-Team: \n"
 "Language: cs_CZ\n"
 "Last-Translator: Tomáš Begeni <begeni@razdva.cz>\n"
 "Language-Team: \n"
 "Language: cs_CZ\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 3.2.2\n"
+"X-Generator: Poedit 3.4.2\n"
 
 #: src/lib/video_content.cc:503
 #, c-format
 
 #: src/lib/video_content.cc:503
 #, c-format
@@ -352,15 +352,14 @@ msgstr ""
 "se, aby mezera mezi titulky byla alespoň 2 snímky."
 
 #: src/lib/hints.cc:685
 "se, aby mezera mezi titulky byla alespoň 2 snímky."
 
 #: src/lib/hints.cc:685
-#, fuzzy
 msgid ""
 "At least one piece of subtitle content has no specified language.  It is "
 "advisable to set the language for each piece of subtitle content in the "
 "\"Content→Timed text\" or \"Content→Open subtitles\" tab."
 msgstr ""
 msgid ""
 "At least one piece of subtitle content has no specified language.  It is "
 "advisable to set the language for each piece of subtitle content in the "
 "\"Content→Timed text\" or \"Content→Open subtitles\" tab."
 msgstr ""
-"Jedna část titulků nebo skrytých titulků nemá zadaný jazyk. Je vhodné "
-"nastavit jazyk pro každý část titulků nebo skrytých titulků na kartě „Obsah "
-"→ Časovat text“, „Obsah → Otevřít titulky“ nebo „Obsah → Skryté titulky“."
+"Alespoň jedna část obsahu titulků nemá specifikovaný jazyk. Je vhodné "
+"nastavit jazyk pro každou část obsahu titulků v záložce „Obsah→Časovaný "
+"text“ nebo „Obsah→Otevřít titulky“."
 
 #: src/lib/audio_content.cc:277
 msgid "Audio will be resampled from %1Hz to %2Hz"
 
 #: src/lib/audio_content.cc:277
 msgid "Audio will be resampled from %1Hz to %2Hz"
@@ -913,9 +912,8 @@ msgid "Event"
 msgstr "Událost"
 
 #: src/lib/hints.cc:397
 msgstr "Událost"
 
 #: src/lib/hints.cc:397
-#, fuzzy
 msgid "Examining audio"
 msgid "Examining audio"
-msgstr "Zkoumání titulků"
+msgstr "Zkoumání zvuku"
 
 #: src/lib/hints.cc:399
 msgid "Examining audio, subtitles and closed captions"
 
 #: src/lib/hints.cc:399
 msgid "Examining audio, subtitles and closed captions"
@@ -1062,15 +1060,14 @@ msgid "If you do use 25fps you should change your DCP standard to SMPTE."
 msgstr "Používáte-li 25fps, měli byste změnit váš standard DCP na SMPTE."
 
 #: src/lib/hints.cc:249
 msgstr "Používáte-li 25fps, měli byste změnit váš standard DCP na SMPTE."
 
 #: src/lib/hints.cc:249
-#, fuzzy
 msgid ""
 "In general it is now advisable to make SMPTE DCPs unless you have a "
 "particular reason to use Interop.  It is advisable to set your DCP to use "
 "the SMPTE standard in the \"DCP\" tab."
 msgstr ""
 msgid ""
 "In general it is now advisable to make SMPTE DCPs unless you have a "
 "particular reason to use Interop.  It is advisable to set your DCP to use "
 "the SMPTE standard in the \"DCP\" tab."
 msgstr ""
-"Obecně je nyní vhodné dělat SMPTE DCP, pokud nemáte konkrétní důvod používat "
-"Interop. Na kartě „DCP“ se doporučuje nastavit DCP tak, aby používalo "
-"standard SMPTE."
+"Obecně je nyní vhodné vytvořit SMPTE DCP, pokud nemáte konkrétní důvod "
+"používat Interop. Je vhodné nastavit váš DCP tak, aby používal standard "
+"SMPTE v záložce „DCP“."
 
 #: src/lib/release_notes.cc:53
 msgid ""
 
 #: src/lib/release_notes.cc:53
 msgid ""
@@ -1215,14 +1212,13 @@ msgid "No CPLs found in DCP."
 msgstr "V DCP nebyla nalezena žádná CPLs."
 
 #: src/lib/kdm_with_metadata.cc:217
 msgstr "V DCP nebyla nalezena žádná CPLs."
 
 #: src/lib/kdm_with_metadata.cc:217
-#, fuzzy
 msgid "No from address configured in the KDM Email tab of preferences"
 msgid "No from address configured in the KDM Email tab of preferences"
-msgstr "Žádný KDM z adresy nakonfigurované v předvolbách"
+msgstr "Ne z adresy nakonfigurované na kartě E-mail KDM v předvolbách"
 
 #: src/lib/kdm_with_metadata.cc:213 src/lib/send_notification_email_job.cc:70
 
 #: src/lib/kdm_with_metadata.cc:213 src/lib/send_notification_email_job.cc:70
-#, fuzzy
 msgid "No outgoing mail server configured in the Email tab of preferences"
 msgid "No outgoing mail server configured in the Email tab of preferences"
-msgstr "V konfiguraci není nastaven emailový server"
+msgstr ""
+"Na kartě E-mail v předvolbách není nakonfigurován žádný server odchozí pošty"
 
 #: src/lib/image_content.cc:131
 msgid "No valid image files were found in the folder."
 
 #: src/lib/image_content.cc:131
 msgid "No valid image files were found in the folder."
@@ -1238,12 +1234,11 @@ msgstr "Žádný"
 
 #: src/lib/job.cc:607
 msgid "OK"
 
 #: src/lib/job.cc:607
 msgid "OK"
-msgstr ""
+msgstr "OK"
 
 #: src/lib/job.cc:612
 
 #: src/lib/job.cc:612
-#, fuzzy
 msgid "OK (ran for %1 from %2 to %3)"
 msgid "OK (ran for %1 from %2 to %3)"
-msgstr "OK (hotovo za %1)"
+msgstr "OK (spuštěno od %1 do %2 to %3)"
 
 #: src/lib/job.cc:610
 msgid "OK (ran for %1)"
 
 #: src/lib/job.cc:610
 msgid "OK (ran for %1)"
@@ -1292,7 +1287,7 @@ msgstr "Policy"
 
 #: src/lib/filter.cc:106
 msgid "Premultiply alpha channel"
 
 #: src/lib/filter.cc:106
 msgid "Premultiply alpha channel"
-msgstr ""
+msgstr "Předem násobit alfa kanál"
 
 #: src/lib/content.cc:494
 msgid "Prepared for video frame rate"
 
 #: src/lib/content.cc:494
 msgid "Prepared for video frame rate"
@@ -1561,7 +1556,6 @@ msgid "The certificate chain for signing is invalid (%1)"
 msgstr "Řetěz certifikátů pro podepisování je neplatný (%1)"
 
 #: src/lib/hints.cc:721
 msgstr "Řetěz certifikátů pro podepisování je neplatný (%1)"
 
 #: src/lib/hints.cc:721
-#, fuzzy
 msgid ""
 "The certificate chain that DCP-o-matic uses for signing DCPs and KDMs "
 "contains a small error which will prevent DCPs from being validated "
 msgid ""
 "The certificate chain that DCP-o-matic uses for signing DCPs and KDMs "
 "contains a small error which will prevent DCPs from being validated "
@@ -1569,14 +1563,13 @@ msgid ""
 "certificate chain by clicking the \"Re-make certificates and key...\" button "
 "in the Keys page of Preferences."
 msgstr ""
 "certificate chain by clicking the \"Re-make certificates and key...\" button "
 "in the Keys page of Preferences."
 msgstr ""
-"Řetězec certifikátů, který DCP-o-matic používá pro podepisování DCP a KDM, "
-"obsahuje malou chybu, která v některých systémech brání správnému ověření "
-"DCP.  Doporučujeme vám znovu vytvořit řetězec podpisových certifikátů "
-"kliknutím na tlačítko „Re-make certificates and key…“ (Znovu vytvořit "
-"certifikáty a klíče…) na stránce Keys (Klíče) v Předvolbách."
+"Řetězec certifikátů, který DCP-o-matic používá k podepisování DCP a KDM, "
+"obsahuje malou chybu, která zabrání správnému ověření DCP na některých "
+"systémech. Je vhodné znovu vytvořit řetězec podpisových certifikátů "
+"kliknutím na tlačítko „Znovu vytvořit certifikáty a klíč…“ na stránce Klíče "
+"v Předvolbách."
 
 #: src/lib/hints.cc:727
 
 #: src/lib/hints.cc:727
-#, fuzzy
 msgid ""
 "The certificate chain that DCP-o-matic uses for signing DCPs and KDMs has a "
 "validity period that is too long.  This will cause problems playing back "
 msgid ""
 "The certificate chain that DCP-o-matic uses for signing DCPs and KDMs has a "
 "validity period that is too long.  This will cause problems playing back "
@@ -1584,12 +1577,11 @@ msgid ""
 "chain by clicking the \"Re-make certificates and key...\" button in the Keys "
 "page of Preferences."
 msgstr ""
 "chain by clicking the \"Re-make certificates and key...\" button in the Keys "
 "page of Preferences."
 msgstr ""
-"Řetězec certifikátů, který DCP-o-matic používá pro podepisování DCP a KDM, "
-"má příliš dlouhou dobu platnosti.  To způsobuje problémy s přehráváním DCP "
-"na některých systémech. Doporučujeme znovu vytvořit řetězec podpisových "
-"certifikátů kliknutím na tlačítko „Re-make certificates and key…“ (Znovu "
-"vytvořit certifikáty a klíč…) na stránce Keys (Klíče) v okně Preferences "
-"(Předvolby)."
+"Řetěz certifikátů, který DCP-o-matic používá k podepisování DCP a KDM, má "
+"příliš dlouhou dobu platnosti. To způsobí problémy s přehráváním DCP na "
+"některých systémech. Je vhodné znovu vytvořit řetězec podpisových "
+"certifikátů kliknutím na tlačítko „Znovu vytvořit certifikáty a klíč…“ na "
+"stránce Klíče v Předvolbách."
 
 #: src/lib/video_decoder.cc:81
 msgid ""
 
 #: src/lib/video_decoder.cc:81
 msgid ""
@@ -1626,7 +1618,6 @@ msgid "The file %1 has been trimmed by %2 milliseconds more."
 msgstr "Soubor %1 byl oříznut o %2 milisekund více."
 
 #: src/lib/hints.cc:239
 msgstr "Soubor %1 byl oříznut o %2 milisekund více."
 
 #: src/lib/hints.cc:239
-#, fuzzy
 msgid ""
 "There is a large difference between the frame rate of your DCP and that of "
 "some of your content.  This will cause your audio to play back at a much "
 msgid ""
 "There is a large difference between the frame rate of your DCP and that of "
 "some of your content.  This will cause your audio to play back at a much "
@@ -1634,11 +1625,11 @@ msgid ""
 "rate to one closer to your content, provided that your target projection "
 "systems support your chosen DCP rate."
 msgstr ""
 "rate to one closer to your content, provided that your target projection "
 "systems support your chosen DCP rate."
 msgstr ""
-"Mezi rámcovou frekvencí vašeho DCP a některým z vašich obsahů je velký "
-"rozdíl. To způsobí, že se váš zvuk přehrává na mnohem nižším nebo vyšším "
-"rozstupu, než by měl. Doporučuje se, abyste nastavili frekvenci snímků DCP "
-"tak, aby se přiblížila vašemu obsahu za předpokladu, že vaše cílové "
-"projekční systémy podporují zvolenou rychlost DCP."
+"Mezi snímkovou frekvencí vašeho DCP a některého vašeho obsahu je velký "
+"rozdíl. To způsobí, že se váš zvuk bude přehrávat s mnohem nižší nebo vyšší "
+"výškou, než by měl. Je vhodné nastavit snímkovou frekvenci DCP na takovou, "
+"která je blíže vašemu obsahu, za předpokladu, že vaše cílové projekční "
+"systémy podporují vámi zvolenou rychlost DCP."
 
 #: src/lib/dcp_content.cc:675
 msgid "There is no video in this DCP"
 
 #: src/lib/dcp_content.cc:675
 msgid "There is no video in this DCP"
@@ -1822,7 +1813,6 @@ msgid "Yet Another Deinterlacing Filter"
 msgstr "Ještě další deinterlacing filter"
 
 #: src/lib/hints.cc:199
 msgstr "Ještě další deinterlacing filter"
 
 #: src/lib/hints.cc:199
-#, fuzzy
 msgid ""
 "You are set up for a DCP at a frame rate of %1 fps.  This frame rate is not "
 "supported by all projectors.  It is advisable to change the DCP frame rate "
 msgid ""
 "You are set up for a DCP at a frame rate of %1 fps.  This frame rate is not "
 "supported by all projectors.  It is advisable to change the DCP frame rate "
@@ -1910,6 +1900,9 @@ msgid ""
 "distributors to raise QC errors when they check your DCP.  To avoid this, "
 "set the DCP audio channels to 8 or 16."
 msgstr ""
 "distributors to raise QC errors when they check your DCP.  To avoid this, "
 "set the DCP audio channels to 8 or 16."
 msgstr ""
+"Váš DCP má %1 zvukových kanálů, spíše než 8 nebo 16. To může způsobit, že "
+"někteří distributoři při kontrole vašeho DCP zvýší chyby kontroly kvality. "
+"Abyste tomu zabránili, nastavte zvukové kanály DCP na 8 nebo 16."
 
 #: src/lib/hints.cc:110
 msgid ""
 
 #: src/lib/hints.cc:110
 msgid ""
@@ -2142,7 +2135,6 @@ msgid "still"
 msgstr "stále"
 
 #: src/lib/dcp_content.cc:779
 msgstr "stále"
 
 #: src/lib/dcp_content.cc:779
-#, fuzzy
 msgid "they overlap other text content; remove the other content."
 msgstr "překrývá se s jiným textovým obsahem; odeberte další obsah."
 
 msgid "they overlap other text content; remove the other content."
 msgstr "překrývá se s jiným textovým obsahem; odeberte další obsah."
 
index 91ed1185588d181056d76a8fd78ea11ffaefa8c5..6c027ff114ceaae500adbb3d2c340f94753a2d37 100644 (file)
@@ -722,3 +722,12 @@ VideoContent::actual_crop () const
        );
 }
 
        );
 }
 
+
+void
+VideoContent::rotate_size()
+{
+       if (_size) {
+               std::swap(_size->width, _size->height);
+       }
+}
+
index e7e8eb1b3d3d6f35c68169bc71677ffddf0632e7..495d000e160401a24059a4f355a92df3acc90f04 100644 (file)
@@ -220,6 +220,8 @@ public:
        void modify_position (std::shared_ptr<const Film> film, dcpomatic::DCPTime& pos) const;
        void modify_trim_start (dcpomatic::ContentTime& pos) const;
 
        void modify_position (std::shared_ptr<const Film> film, dcpomatic::DCPTime& pos) const;
        void modify_trim_start (dcpomatic::ContentTime& pos) const;
 
+       void rotate_size();
+
        static std::shared_ptr<VideoContent> from_xml (Content* parent, cxml::ConstNodePtr node, int version, VideoRange video_range_hint);
 
 private:
        static std::shared_ptr<VideoContent> from_xml (Content* parent, cxml::ConstNodePtr node, int version, VideoRange video_range_hint);
 
 private:
index fbe2d248d5c952c3112f1e5f9f7184ae3b4073c3..7b9defd73071f3c8ad546ff7d5f1385d5f38b6c2 100644 (file)
@@ -144,6 +144,10 @@ Writer::write (shared_ptr<const Data> encoded, Frame frame, Eyes eyes)
 {
        boost::mutex::scoped_lock lock (_state_mutex);
 
 {
        boost::mutex::scoped_lock lock (_state_mutex);
 
+       if (_zombie) {
+               return;
+       }
+
        while (_queued_full_in_memory > _maximum_frames_in_memory) {
                /* There are too many full frames in memory; wake the main writer thread and
                   wait until it sorts everything out */
        while (_queued_full_in_memory > _maximum_frames_in_memory) {
                /* There are too many full frames in memory; wake the main writer thread and
                   wait until it sorts everything out */
@@ -377,6 +381,9 @@ try
        while (true)
        {
                boost::mutex::scoped_lock lock (_state_mutex);
        while (true)
        {
                boost::mutex::scoped_lock lock (_state_mutex);
+               if (_zombie) {
+                       return;
+               }
 
                while (true) {
 
 
                while (true) {
 
@@ -1042,3 +1049,17 @@ Writer::write_hanging_text (ReelWriter& reel)
        }
        _hanging_texts = new_hanging_texts;
 }
        }
        _hanging_texts = new_hanging_texts;
 }
+
+
+/** Set the writer so that it has no queue and drops any pending or future requests to write images */
+void
+Writer::zombify()
+{
+       boost::mutex::scoped_lock lock(_state_mutex);
+
+       _queue.clear();
+       _queued_full_in_memory = 0;
+       _zombie = true;
+       _full_condition.notify_all();
+}
+
index efb6a17d8d54448b740e2b3fc238010c6abff01f..f0f1fe69ac77d07ea8ce25df94a29667f9279d26 100644 (file)
@@ -34,6 +34,8 @@
 #include "exception_store.h"
 #include "font_id_map.h"
 #include "player_text.h"
 #include "exception_store.h"
 #include "font_id_map.h"
 #include "player_text.h"
+#include "text_type.h"
+#include "types.h"
 #include "weak_film.h"
 #include <dcp/atmos_frame.h>
 #include <boost/thread.hpp>
 #include "weak_film.h"
 #include <dcp/atmos_frame.h>
 #include <boost/thread.hpp>
@@ -125,6 +127,8 @@ public:
 
        void set_encoder_threads (int threads);
 
 
        void set_encoder_threads (int threads);
 
+       void zombify();
+
 private:
        friend struct ::writer_disambiguate_font_ids1;
        friend struct ::writer_disambiguate_font_ids2;
 private:
        friend struct ::writer_disambiguate_font_ids1;
        friend struct ::writer_disambiguate_font_ids2;
@@ -227,6 +231,8 @@ private:
        };
 
        std::vector<HangingText> _hanging_texts;
        };
 
        std::vector<HangingText> _hanging_texts;
+
+       bool _zombie = false;
 };
 
 
 };
 
 
index 7dd3bfe358877f7359f88c7c6e3bee0a06310de2..87a1ca7873bfc37697ac53a7a6f2b9dc67f6fdaa 100644 (file)
@@ -228,7 +228,7 @@ def build(bld):
     obj.uselib = """
                  AVCODEC AVUTIL AVFORMAT AVFILTER SWSCALE
                  BOOST_FILESYSTEM BOOST_THREAD BOOST_DATETIME BOOST_SIGNALS2 BOOST_REGEX
     obj.uselib = """
                  AVCODEC AVUTIL AVFORMAT AVFILTER SWSCALE
                  BOOST_FILESYSTEM BOOST_THREAD BOOST_DATETIME BOOST_SIGNALS2 BOOST_REGEX
-                 SAMPLERATE POSTPROC TIFF SSH DCP CXML GLIB XML++
+                 SAMPLERATE POSTPROC TIFF SSH DCP CXML GLIB LZMA XML++
                  CURL ZIP BZ2 FONTCONFIG PANGOMM CAIROMM XMLSEC SUB ICU NETTLE PNG JPEG LEQM_NRT
                  LIBZ
                  """
                  CURL ZIP BZ2 FONTCONFIG PANGOMM CAIROMM XMLSEC SUB ICU NETTLE PNG JPEG LEQM_NRT
                  LIBZ
                  """
index 1b1ef06294373adaa68443e9909b43981d4cb7a6..584ebd27ddc7f4d0804d233db88622f53a0df56c 100644 (file)
@@ -47,7 +47,6 @@
 #include "wx/report_problem_dialog.h"
 #include "wx/save_template_dialog.h"
 #include "wx/self_dkdm_dialog.h"
 #include "wx/report_problem_dialog.h"
 #include "wx/save_template_dialog.h"
 #include "wx/self_dkdm_dialog.h"
-#include "wx/send_i18n_dialog.h"
 #include "wx/servers_list_dialog.h"
 #include "wx/standard_controls.h"
 #include "wx/system_information_dialog.h"
 #include "wx/servers_list_dialog.h"
 #include "wx/standard_controls.h"
 #include "wx/system_information_dialog.h"
@@ -241,7 +240,6 @@ enum {
        ID_tools_encoding_servers,
        ID_tools_manage_templates,
        ID_tools_check_for_updates,
        ID_tools_encoding_servers,
        ID_tools_manage_templates,
        ID_tools_check_for_updates,
-       ID_tools_send_translations,
        ID_tools_system_information,
        ID_tools_restore_default_preferences,
        ID_tools_export_preferences,
        ID_tools_system_information,
        ID_tools_restore_default_preferences,
        ID_tools_export_preferences,
@@ -353,7 +351,6 @@ public:
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_encoding_servers, this),  ID_tools_encoding_servers);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_manage_templates, this),  ID_tools_manage_templates);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_check_for_updates, this), ID_tools_check_for_updates);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_encoding_servers, this),  ID_tools_encoding_servers);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_manage_templates, this),  ID_tools_manage_templates);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_check_for_updates, this), ID_tools_check_for_updates);
-               Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_send_translations, this), ID_tools_send_translations);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_system_information, this),ID_tools_system_information);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_restore_default_preferences, this), ID_tools_restore_default_preferences);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_export_preferences, this), ID_tools_export_preferences);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_system_information, this),ID_tools_system_information);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_restore_default_preferences, this), ID_tools_restore_default_preferences);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_export_preferences, this), ID_tools_export_preferences);
@@ -1107,35 +1104,6 @@ private:
                UpdateChecker::instance()->run();
        }
 
                UpdateChecker::instance()->run();
        }
 
-       void tools_send_translations ()
-       {
-               SendI18NDialog dialog(this);
-               if (dialog.ShowModal() != wxID_OK) {
-                       return;
-               }
-
-               string body;
-               body += dialog.name() + "\n";
-               body += dialog.language() + "\n";
-               body += string(dcpomatic_version) + " " + string(dcpomatic_git_commit) + "\n";
-               body += "--\n";
-               auto translations = I18NHook::translations ();
-               for (auto i: translations) {
-                       body += i.first + "\n" + i.second + "\n\n";
-               }
-               if (dialog.email().find("@") == string::npos) {
-                       error_dialog (this, _("You must enter a valid email address when sending translations, "
-                                             "otherwise the DCP-o-matic maintainers cannot credit you or contact you with questions."));
-               } else {
-                       Email email(dialog.email(), { "carl@dcpomatic.com" }, "DCP-o-matic translations", body);
-                       try {
-                               email.send("main.carlh.net", 2525, EmailProtocol::STARTTLS);
-                       } catch (NetworkError& e) {
-                               error_dialog (this, _("Could not send translations"), std_to_wx(e.what()));
-                       }
-               }
-       }
-
        void help_about ()
        {
                AboutDialog dialog(this);
        void help_about ()
        {
                AboutDialog dialog(this);
@@ -1399,7 +1367,6 @@ private:
                add_item (tools, _("Encoding servers..."), ID_tools_encoding_servers, 0);
                add_item (tools, _("Manage templates..."), ID_tools_manage_templates, 0);
                add_item (tools, _("Check for updates"), ID_tools_check_for_updates, 0);
                add_item (tools, _("Encoding servers..."), ID_tools_encoding_servers, 0);
                add_item (tools, _("Manage templates..."), ID_tools_manage_templates, 0);
                add_item (tools, _("Check for updates"), ID_tools_check_for_updates, 0);
-               add_item (tools, _("Send translations..."), ID_tools_send_translations, 0);
                add_item (tools, _("System information..."), ID_tools_system_information, 0);
                tools->AppendSeparator ();
                add_item (tools, _("Restore default preferences"), ID_tools_restore_default_preferences, ALWAYS);
                add_item (tools, _("System information..."), ID_tools_system_information, 0);
                tools->AppendSeparator ();
                add_item (tools, _("Restore default preferences"), ID_tools_restore_default_preferences, ALWAYS);
index 42e7c19e0dd63a2c91c66807a5256fbc1d19a1a7..ef5985c5b19d5d0d9b1703dc5062025297052918 100644 (file)
@@ -8,7 +8,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2024-01-12 00:54+0100\n"
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2024-01-12 00:54+0100\n"
-"PO-Revision-Date: 2023-05-15 09:26+0200\n"
+"PO-Revision-Date: 2024-05-02 14:01+0200\n"
 "Last-Translator: Tomáš Begeni <begeni@razdva.cz>\n"
 "Language-Team: \n"
 "Language: cs_CZ\n"
 "Last-Translator: Tomáš Begeni <begeni@razdva.cz>\n"
 "Language-Team: \n"
 "Language: cs_CZ\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 3.2.2\n"
+"X-Generator: Poedit 3.4.2\n"
 
 #: src/tools/dcpomatic_combiner.cc:171
 msgid "%1 already exists as a file, so you cannot use it for a DCP."
 
 #: src/tools/dcpomatic_combiner.cc:171
 msgid "%1 already exists as a file, so you cannot use it for a DCP."
@@ -276,7 +276,7 @@ msgstr "Text názvu obsahu"
 
 #: src/tools/dcpomatic_disk.cc:161
 msgid "Copy DCP"
 
 #: src/tools/dcpomatic_disk.cc:161
 msgid "Copy DCP"
-msgstr ""
+msgstr "Kopírovat DCP"
 
 #: src/tools/dcpomatic.cc:1339
 msgid "Copy settings\tCtrl-C"
 
 #: src/tools/dcpomatic.cc:1339
 msgid "Copy settings\tCtrl-C"
@@ -293,9 +293,8 @@ msgid ""
 msgstr "Nelze dešifrovat DKDM. Možná nebylo vytvořeno správným certifikátem."
 
 #: src/tools/dcpomatic.cc:632 src/tools/dcpomatic.cc:649
 msgstr "Nelze dešifrovat DKDM. Možná nebylo vytvořeno správným certifikátem."
 
 #: src/tools/dcpomatic.cc:632 src/tools/dcpomatic.cc:649
-#, fuzzy
 msgid "Could not duplicate project."
 msgid "Could not duplicate project."
-msgstr "Nemohu najít přehrávač."
+msgstr "Projekt nelze duplikovat."
 
 #: src/tools/dcpomatic.cc:913
 msgid "Could not find batch converter."
 
 #: src/tools/dcpomatic.cc:913
 msgid "Could not find batch converter."
@@ -310,6 +309,8 @@ msgid ""
 "Could not listen for new batch jobs.  Perhaps another instance of the DCP-o-"
 "matic Batch Converter is running."
 msgstr ""
 "Could not listen for new batch jobs.  Perhaps another instance of the DCP-o-"
 "matic Batch Converter is running."
 msgstr ""
+"Nelze načíst nové dávkové úlohy. Možná běží další instance DCP-o-matic Batch "
+"Converter."
 
 #: src/tools/dcpomatic_editor.cc:336
 msgid "Could not load DCP"
 
 #: src/tools/dcpomatic_editor.cc:336
 msgid "Could not load DCP"
@@ -380,22 +381,19 @@ msgstr ""
 
 #: src/tools/dcpomatic.cc:771
 msgid "Could not remove existing preferences file"
 
 #: src/tools/dcpomatic.cc:771
 msgid "Could not remove existing preferences file"
-msgstr ""
+msgstr "Stávající soubor předvoleb nelze odstranit"
 
 #: src/tools/dcpomatic.cc:605 src/tools/dcpomatic.cc:1278
 
 #: src/tools/dcpomatic.cc:605 src/tools/dcpomatic.cc:1278
-#, fuzzy
 msgid "Could not save project."
 msgid "Could not save project."
-msgstr "Nemohu vytvořit DCP."
+msgstr "Projekt nelze uložit."
 
 #: src/tools/dcpomatic.cc:616
 
 #: src/tools/dcpomatic.cc:616
-#, fuzzy
 msgid "Could not save template."
 msgid "Could not save template."
-msgstr "Nemohu najít přehrávač."
+msgstr "Šablonu nelze uložit."
 
 #: src/tools/dcpomatic.cc:1123
 
 #: src/tools/dcpomatic.cc:1123
-#, fuzzy
 msgid "Could not send translations"
 msgid "Could not send translations"
-msgstr "Nemohu spustit nautilus"
+msgstr "Překlady se nepodařilo odeslat"
 
 #: src/tools/dcpomatic.cc:1039
 msgid "Could not show DCP."
 
 #: src/tools/dcpomatic.cc:1039
 msgid "Could not show DCP."
@@ -440,12 +438,11 @@ msgstr "Vytvořit KDMs"
 
 #: src/tools/dcpomatic_editor.cc:208
 msgid "Creator"
 
 #: src/tools/dcpomatic_editor.cc:208
 msgid "Creator"
-msgstr ""
+msgstr "Tvůrce"
 
 #: src/tools/dcpomatic_disk.cc:132 src/tools/dcpomatic_disk.cc:136
 
 #: src/tools/dcpomatic_disk.cc:132 src/tools/dcpomatic_disk.cc:136
-#, fuzzy
 msgid "DCP"
 msgid "DCP"
-msgstr "CPL"
+msgstr "DCP"
 
 #: src/tools/dcpomatic.cc:1537 src/tools/dcpomatic.cc:1634
 #: src/tools/dcpomatic.cc:1673
 
 #: src/tools/dcpomatic.cc:1537 src/tools/dcpomatic.cc:1634
 #: src/tools/dcpomatic.cc:1673
@@ -458,26 +455,22 @@ msgstr "DCP-o-matic konvertor"
 
 #: src/tools/dcpomatic_combiner.cc:178 src/tools/dcpomatic_combiner.cc:222
 #: src/tools/dcpomatic_combiner.cc:256
 
 #: src/tools/dcpomatic_combiner.cc:178 src/tools/dcpomatic_combiner.cc:222
 #: src/tools/dcpomatic_combiner.cc:256
-#, fuzzy
 msgid "DCP-o-matic Combiner"
 msgid "DCP-o-matic Combiner"
-msgstr "DCP-o-matic přehrávač"
+msgstr "DCP-o-matic Combiner"
 
 #: src/tools/dcpomatic_disk.cc:315 src/tools/dcpomatic_disk.cc:323
 #: src/tools/dcpomatic_disk.cc:356 src/tools/dcpomatic_disk.cc:444
 #: src/tools/dcpomatic_disk.cc:490
 
 #: src/tools/dcpomatic_disk.cc:315 src/tools/dcpomatic_disk.cc:323
 #: src/tools/dcpomatic_disk.cc:356 src/tools/dcpomatic_disk.cc:444
 #: src/tools/dcpomatic_disk.cc:490
-#, fuzzy
 msgid "DCP-o-matic Disk Writer"
 msgid "DCP-o-matic Disk Writer"
-msgstr "DCP-o-matic KDM Creator"
+msgstr "DCP-o-matic Disk Writer"
 
 #: src/tools/dcpomatic_editor.cc:293 src/tools/dcpomatic_editor.cc:447
 
 #: src/tools/dcpomatic_editor.cc:293 src/tools/dcpomatic_editor.cc:447
-#, fuzzy
 msgid "DCP-o-matic Editor"
 msgid "DCP-o-matic Editor"
-msgstr "DCP-o-matic Playlist Editor"
+msgstr "DCP-o-matic Editor"
 
 #: src/tools/dcpomatic_editor.cc:498
 
 #: src/tools/dcpomatic_editor.cc:498
-#, fuzzy
 msgid "DCP-o-matic Editor could not start."
 msgid "DCP-o-matic Editor could not start."
-msgstr "DCP-o-matic nelze spustit"
+msgstr "DCP-o-matic Editor nelze spustit."
 
 #: src/tools/dcpomatic_server.cc:152
 msgid "DCP-o-matic Encode Server"
 
 #: src/tools/dcpomatic_server.cc:152
 msgid "DCP-o-matic Encode Server"
@@ -507,7 +500,7 @@ msgstr "DCP-o-matic nelze spustit"
 
 #: src/tools/dcpomatic_combiner.cc:188
 msgid "DCPs combined successfully."
 
 #: src/tools/dcpomatic_combiner.cc:188
 msgid "DCPs combined successfully."
-msgstr ""
+msgstr "DCP se úspěšně spojily."
 
 #: src/tools/dcpomatic_kdm.cc:170
 msgid "DKDM"
 
 #: src/tools/dcpomatic_kdm.cc:170
 msgid "DKDM"
@@ -516,7 +509,7 @@ msgstr "DKDM"
 #: src/tools/dcpomatic_kdm.cc:577
 #, c-format
 msgid "DKDM %s is already in the DKDM list and will not be added again."
 #: src/tools/dcpomatic_kdm.cc:577
 #, c-format
 msgid "DKDM %s is already in the DKDM list and will not be added again."
-msgstr ""
+msgstr "DKDM %s je již v seznamu DKDM a nebude znovu přidán."
 
 #: src/tools/dcpomatic_player.cc:599
 msgid "Decode at full resolution"
 
 #: src/tools/dcpomatic_player.cc:599
 msgid "Decode at full resolution"
@@ -539,6 +532,8 @@ msgid ""
 "Did you install the DCP-o-matic Disk Writer.pkg from the .dmg?  Please check "
 "and try again."
 msgstr ""
 "Did you install the DCP-o-matic Disk Writer.pkg from the .dmg?  Please check "
 "and try again."
 msgstr ""
+"Nainstalovali jste DCP-o-matic Disk Writer.pkg z .dmg? Zkontrolujte prosím a "
+"zkuste to znovu."
 
 #: src/tools/dcpomatic.cc:1874 src/tools/dcpomatic.cc:1889
 #: src/tools/dcpomatic.cc:1931
 
 #: src/tools/dcpomatic.cc:1874 src/tools/dcpomatic.cc:1889
 #: src/tools/dcpomatic.cc:1931
@@ -550,6 +545,8 @@ msgid ""
 "Do you see a 'User Account Control' dialogue asking about "
 "dcpomatic2_disk_writer.exe?  If so, click 'Yes', then try again."
 msgstr ""
 "Do you see a 'User Account Control' dialogue asking about "
 "dcpomatic2_disk_writer.exe?  If so, click 'Yes', then try again."
 msgstr ""
+"Vidíte dialog „Řízení uživatelských účtů“ s dotazem na "
+"dcpomatic2_disk_writer.exe? Pokud ano, klikněte na ‚Ano‘ a zkuste to znovu."
 
 #: src/tools/dcpomatic.cc:819
 #, c-format
 
 #: src/tools/dcpomatic.cc:819
 #, c-format
@@ -570,7 +567,7 @@ msgstr "Dolů"
 
 #: src/tools/dcpomatic_disk.cc:148
 msgid "Drive"
 
 #: src/tools/dcpomatic_disk.cc:148
 msgid "Drive"
-msgstr ""
+msgstr "Disk"
 
 #: src/tools/dcpomatic_player.cc:593
 msgid "Dual screen\tShift+F11"
 
 #: src/tools/dcpomatic_player.cc:593
 msgid "Dual screen\tShift+F11"
@@ -594,11 +591,11 @@ msgstr "Duplikovat…"
 
 #: src/tools/dcpomatic_editor.cc:89
 msgid "Duration"
 
 #: src/tools/dcpomatic_editor.cc:89
 msgid "Duration"
-msgstr ""
+msgstr "Délka"
 
 #: src/tools/dcpomatic_editor.cc:149
 msgid "Edit reel"
 
 #: src/tools/dcpomatic_editor.cc:149
 msgid "Edit reel"
-msgstr ""
+msgstr "Upravit reel"
 
 #: src/tools/dcpomatic_batch.cc:100 src/tools/dcpomatic.cc:1388
 msgid "Encoding servers..."
 
 #: src/tools/dcpomatic_batch.cc:100 src/tools/dcpomatic.cc:1388
 msgid "Encoding servers..."
@@ -610,12 +607,11 @@ msgstr "Šifrované"
 
 #: src/tools/dcpomatic_editor.cc:84
 msgid "Entry point"
 
 #: src/tools/dcpomatic_editor.cc:84
 msgid "Entry point"
-msgstr ""
+msgstr "Vstupní bod"
 
 #: src/tools/dcpomatic.cc:1396
 
 #: src/tools/dcpomatic.cc:1396
-#, fuzzy
 msgid "Export preferences..."
 msgid "Export preferences..."
-msgstr "Obnovit původní nastavení"
+msgstr "Předvolby exportu…"
 
 #: src/tools/dcpomatic.cc:1368
 msgid "Export subtitles..."
 
 #: src/tools/dcpomatic.cc:1368
 msgid "Export subtitles..."
@@ -641,9 +637,9 @@ msgid "Film changed"
 msgstr "Film byl změněn"
 
 #: src/tools/dcpomatic_kdm.cc:323
 msgstr "Film byl změněn"
 
 #: src/tools/dcpomatic_kdm.cc:323
-#, fuzzy, c-format
+#, c-format
 msgid "Folder %s already exists.  Do you want to overwrite it?"
 msgid "Folder %s already exists.  Do you want to overwrite it?"
-msgstr "Soubor %s již existuje. Chcete soubor přepsat?"
+msgstr "Složka %s již existuje. Chcete jej přepsat?"
 
 #: src/tools/dcpomatic_server.cc:163
 msgid "Frames per second"
 
 #: src/tools/dcpomatic_server.cc:163
 msgid "Frames per second"
@@ -659,15 +655,15 @@ msgstr "Tipy…"
 
 #: src/tools/dcpomatic_combiner.cc:101
 msgid "Input DCP"
 
 #: src/tools/dcpomatic_combiner.cc:101
 msgid "Input DCP"
-msgstr ""
+msgstr "Vstup DCP"
 
 #: src/tools/dcpomatic_editor.cc:94
 msgid "Intrinsic duration"
 
 #: src/tools/dcpomatic_editor.cc:94
 msgid "Intrinsic duration"
-msgstr ""
+msgstr "Vnitřní doba trvání"
 
 #: src/tools/dcpomatic_editor.cc:203
 msgid "Issuer"
 
 #: src/tools/dcpomatic_editor.cc:203
 msgid "Issuer"
-msgstr ""
+msgstr "Vydavatel"
 
 #: src/tools/dcpomatic.cc:483
 msgid ""
 
 #: src/tools/dcpomatic.cc:483
 msgid ""
@@ -738,6 +734,8 @@ msgid ""
 "No ASSETMAP or ASSETMAP.xml found in this folder.  Please choose a DCP "
 "folder."
 msgstr ""
 "No ASSETMAP or ASSETMAP.xml found in this folder.  Please choose a DCP "
 "folder."
 msgstr ""
+"V této složce nebyl nalezen žádný ASSETMAP nebo ASSETMAP.xml. Vyberte prosím "
+"složku DCP."
 
 #: src/tools/dcpomatic_playlist.cc:245
 msgid ""
 
 #: src/tools/dcpomatic_playlist.cc:245
 msgid ""
@@ -753,7 +751,7 @@ msgstr "Otevřít DCP v &player"
 
 #: src/tools/dcpomatic_editor.cc:281
 msgid "Open a DCP using File -> Open"
 
 #: src/tools/dcpomatic_editor.cc:281
 msgid "Open a DCP using File -> Open"
-msgstr ""
+msgstr "Otevřete DCP pomocí Soubor -> Otevřít"
 
 #: src/tools/dcpomatic_kdm.cc:222
 msgid "Output"
 
 #: src/tools/dcpomatic_kdm.cc:222
 msgid "Output"
@@ -761,7 +759,7 @@ msgstr "Výstup"
 
 #: src/tools/dcpomatic_combiner.cc:120
 msgid "Output DCP folder"
 
 #: src/tools/dcpomatic_combiner.cc:120
 msgid "Output DCP folder"
-msgstr ""
+msgstr "Složka pro uložení DCP"
 
 #: src/tools/dcpomatic.cc:1341
 msgid "Paste settings...\tCtrl-V"
 
 #: src/tools/dcpomatic.cc:1341
 msgid "Paste settings...\tCtrl-V"
@@ -769,15 +767,15 @@ msgstr "Vložit nastavení…\tCtrl-V"
 
 #: src/tools/dcpomatic_batch.cc:175
 msgid "Pause or resume conversion"
 
 #: src/tools/dcpomatic_batch.cc:175
 msgid "Pause or resume conversion"
-msgstr ""
+msgstr "Pozastavit nebo obnovit konverzi"
 
 #: src/tools/dcpomatic_batch.cc:175
 msgid "Pause/resume"
 
 #: src/tools/dcpomatic_batch.cc:175
 msgid "Pause/resume"
-msgstr ""
+msgstr "Pozastavit/obnovit"
 
 #: src/tools/dcpomatic_editor.cc:167
 msgid "Picture"
 
 #: src/tools/dcpomatic_editor.cc:167
 msgid "Picture"
-msgstr ""
+msgstr "Obrázek"
 
 #: src/tools/dcpomatic.cc:567
 msgid ""
 
 #: src/tools/dcpomatic.cc:567
 msgid ""
@@ -806,15 +804,15 @@ msgstr "Znovu vytvořit podpisové certifikáty"
 
 #: src/tools/dcpomatic_editor.cc:218
 msgid "Reels"
 
 #: src/tools/dcpomatic_editor.cc:218
 msgid "Reels"
-msgstr ""
+msgstr "Reels"
 
 #: src/tools/dcpomatic_disk.cc:152
 msgid "Refresh"
 
 #: src/tools/dcpomatic_disk.cc:152
 msgid "Refresh"
-msgstr ""
+msgstr "Obnovit"
 
 #: src/tools/dcpomatic.cc:1720
 msgid "Release notes"
 
 #: src/tools/dcpomatic.cc:1720
 msgid "Release notes"
-msgstr ""
+msgstr "Poznámky k vydání"
 
 #: src/tools/dcpomatic_kdm.cc:213 src/tools/dcpomatic_playlist.cc:340
 msgid "Remove"
 
 #: src/tools/dcpomatic_kdm.cc:213 src/tools/dcpomatic_playlist.cc:340
 msgid "Remove"
@@ -842,9 +840,8 @@ msgid "S&how DCP in Finder"
 msgstr "Zobrazit DCP ve Findieru"
 
 #: src/tools/dcpomatic_playlist.cc:319
 msgstr "Zobrazit DCP ve Findieru"
 
 #: src/tools/dcpomatic_playlist.cc:319
-#, fuzzy
 msgid "Save"
 msgid "Save"
-msgstr "&Speichern"
+msgstr "Uložit"
 
 #: src/tools/dcpomatic.cc:1317
 msgid "Save as &template..."
 
 #: src/tools/dcpomatic.cc:1317
 msgid "Save as &template..."
@@ -870,7 +867,7 @@ msgstr "Uložit film a duplikovat"
 
 #: src/tools/dcpomatic_player.cc:732
 msgid "Save frame to file"
 
 #: src/tools/dcpomatic_player.cc:732
 msgid "Save frame to file"
-msgstr ""
+msgstr "Uložit snímek do souboru"
 
 #: src/tools/dcpomatic_kdm.cc:157
 msgid "Screens"
 
 #: src/tools/dcpomatic_kdm.cc:157
 msgid "Screens"
@@ -918,15 +915,15 @@ msgstr "Nastavit rozlišení dekódování tak, aby odpovídalo zobrazení"
 
 #: src/tools/dcpomatic_editor.cc:170
 msgid "Sound"
 
 #: src/tools/dcpomatic_editor.cc:170
 msgid "Sound"
-msgstr ""
+msgstr "Zvuk"
 
 #: src/tools/dcpomatic.cc:761
 msgid "Specify ZIP file"
 
 #: src/tools/dcpomatic.cc:761
 msgid "Specify ZIP file"
-msgstr ""
+msgstr "Zadejte soubor ZIP"
 
 #: src/tools/dcpomatic_editor.cc:173
 msgid "Subtitle"
 
 #: src/tools/dcpomatic_editor.cc:173
 msgid "Subtitle"
-msgstr ""
+msgstr "Titulky"
 
 #: src/tools/dcpomatic.cc:1392 src/tools/dcpomatic_player.cc:608
 msgid "System information..."
 
 #: src/tools/dcpomatic.cc:1392 src/tools/dcpomatic_player.cc:608
 msgid "System information..."
@@ -978,16 +975,21 @@ msgid ""
 "certificates' validity period.  Either use an earlier end time for this KDM "
 "or re-create your signing certificates in the DCP-o-matic preferences window."
 msgstr ""
 "certificates' validity period.  Either use an earlier end time for this KDM "
 "or re-create your signing certificates in the DCP-o-matic preferences window."
 msgstr ""
+"Koncové období KDM je po (nebo blízko) konci doby platnosti podpisových "
+"certifikátů. Buď použijte dřívější čas ukončení tohoto KDM, nebo znovu "
+"vytvořte své podpisové certifikáty v okně předvoleb DCP-o-matic."
 
 #: src/tools/dcpomatic_kdm.cc:461
 msgid ""
 "The KDM start period is before (or close to) the start of the signing "
 "certificate's validity period.  Use a later start time for this KDM."
 msgstr ""
 
 #: src/tools/dcpomatic_kdm.cc:461
 msgid ""
 "The KDM start period is before (or close to) the start of the signing "
 "certificate's validity period.  Use a later start time for this KDM."
 msgstr ""
+"Počáteční období KDM je před (nebo blízko) začátku doby platnosti "
+"podpisového certifikátu. Použijte pozdější čas zahájení pro tento KDM."
 
 #: src/tools/dcpomatic.cc:963
 msgid "The certificate chain for signing is invalid"
 
 #: src/tools/dcpomatic.cc:963
 msgid "The certificate chain for signing is invalid"
-msgstr ""
+msgstr "Řetěz certifikátů pro podepisování je neplatný"
 
 #: src/tools/dcpomatic.cc:1912
 msgid ""
 
 #: src/tools/dcpomatic.cc:1912
 msgid ""
@@ -1022,7 +1024,6 @@ msgstr ""
 "řetězec certifikátů pro podepisování DCP a KDM?"
 
 #: src/tools/dcpomatic.cc:1927
 "řetězec certifikátů pro podepisování DCP a KDM?"
 
 #: src/tools/dcpomatic.cc:1927
-#, fuzzy
 msgid ""
 "The certificate chain that DCP-o-matic uses for signing DCPs and KDMs "
 "contains a small error\n"
 msgid ""
 "The certificate chain that DCP-o-matic uses for signing DCPs and KDMs "
 "contains a small error\n"
@@ -1032,14 +1033,15 @@ msgid ""
 "the certificate chain\n"
 "for signing DCPs and KDMs?"
 msgstr ""
 "the certificate chain\n"
 "for signing DCPs and KDMs?"
 msgstr ""
-"Řetězec certifikátů, který DCP-o-matic používá pro podepisování DCP a KDM, "
+"Řetěz certifikátů, který DCP-o-matic používá k podepisování DCP a KDM, "
 "obsahuje malou chybu\n"
 "obsahuje malou chybu\n"
-"což zabrání tomu, aby byly DCP v některých systémech správně ověřeny. Chcete "
-"znovu vytvořit\n"
-"řetězec certifikátů pro podepisování DCP a KDM?"
+"což zabrání správnému ověření DCP na některých systémech. Tato chyba byla "
+"způsobena\n"
+"chybou v DCP-o-matic, která byla nyní opravena. Chcete znovu vytvořit "
+"řetězec certifikátů\n"
+"pro podepisování DCP a KDM?"
 
 #: src/tools/dcpomatic.cc:1886
 
 #: src/tools/dcpomatic.cc:1886
-#, fuzzy
 msgid ""
 "The certificate chain that DCP-o-matic uses for signing DCPs and KDMs has a "
 "validity period\n"
 msgid ""
 "The certificate chain that DCP-o-matic uses for signing DCPs and KDMs has a "
 "validity period\n"
@@ -1047,11 +1049,11 @@ msgid ""
 "systems.\n"
 "Do you want to re-create the certificate chain for signing DCPs and KDMs?"
 msgstr ""
 "systems.\n"
 "Do you want to re-create the certificate chain for signing DCPs and KDMs?"
 msgstr ""
-"Řetězec certifikátů, který DCP-o-matic používá pro podepisování DCP a KDM, "
-"obsahuje malou chybu\n"
-"což zabrání tomu, aby byly DCP v některých systémech správně ověřeny. Chcete "
-"znovu vytvořit\n"
-"řetězec certifikátů pro podepisování DCP a KDM?"
+"Řetěz certifikátů, který DCP-o-matic používá k podepisování DCP a KDM, má "
+"dobu platnosti\n"
+"to je příliš dlouhé. To způsobí problémy s přehráváním DCP na některých "
+"systémech.\n"
+"Chcete znovu vytvořit řetězec certifikátů pro podepisování DCP a KDM?"
 
 #: src/tools/dcpomatic.cc:1898
 msgid ""
 
 #: src/tools/dcpomatic.cc:1898
 msgid ""
@@ -1075,7 +1077,7 @@ msgstr "Složka %1 již existuje a není prázdná. Chcete pokračovat?"
 
 #: src/tools/dcpomatic_disk.cc:279
 msgid "The disk you selected is no longer available.  Please choose another."
 
 #: src/tools/dcpomatic_disk.cc:279
 msgid "The disk you selected is no longer available.  Please choose another."
-msgstr ""
+msgstr "Vybraný disk již není k dispozici. Vyberte prosím jiný."
 
 #: src/tools/dcpomatic_disk.cc:358
 #, c-format
 
 #: src/tools/dcpomatic_disk.cc:358
 #, c-format
@@ -1083,6 +1085,8 @@ msgid ""
 "The drive %s could not be unmounted.\n"
 "Close any application that is using it, then try again. (%s)"
 msgstr ""
 "The drive %s could not be unmounted.\n"
 "Close any application that is using it, then try again. (%s)"
 msgstr ""
+"Disk %s nelze odpojit.\n"
+"Zavřete všechny aplikace, které jej používají, a zkuste to znovu. (%s)"
 
 #: src/tools/dcpomatic_disk.cc:531 src/tools/dcpomatic_player.cc:1364
 msgid ""
 
 #: src/tools/dcpomatic_disk.cc:531 src/tools/dcpomatic_player.cc:1364
 msgid ""
@@ -1110,14 +1114,13 @@ msgstr ""
 "fungovat správně. Prosím, zkontrolujte nastavení filmu."
 
 #: src/tools/dcpomatic_player.cc:414
 "fungovat správně. Prosím, zkontrolujte nastavení filmu."
 
 #: src/tools/dcpomatic_player.cc:414
-#, fuzzy
 msgid ""
 "This looks like a DCP-o-matic project folder, which cannot be loaded into "
 "the player.  Choose the DCP folder inside the DCP-o-matic project folder if "
 "that's what you want to play."
 msgstr ""
 "Vypadá to jako složka projektu DCP-o-matic, kterou nelze načíst do "
 msgid ""
 "This looks like a DCP-o-matic project folder, which cannot be loaded into "
 "the player.  Choose the DCP folder inside the DCP-o-matic project folder if "
 "that's what you want to play."
 msgstr ""
 "Vypadá to jako složka projektu DCP-o-matic, kterou nelze načíst do "
-"přehrávače. Pokud chcete přehrávat, vyberte adresář DCP ve složce projektu "
+"přehrávače. Pokud jí chcete přehrát, vyberte složku DCP ve složce projektu "
 "DCP-o-matic."
 
 #: src/tools/dcpomatic_player.cc:607
 "DCP-o-matic."
 
 #: src/tools/dcpomatic_player.cc:607
@@ -1125,9 +1128,8 @@ msgid "Timing..."
 msgstr "Časování…"
 
 #: src/tools/dcpomatic_disk.cc:116
 msgstr "Časování…"
 
 #: src/tools/dcpomatic_disk.cc:116
-#, fuzzy
 msgid "Tools"
 msgid "Tools"
-msgstr "&Nástroje"
+msgstr "Nástroje"
 
 #: src/tools/dcpomatic.cc:565
 #, c-format
 
 #: src/tools/dcpomatic.cc:565
 #, c-format
@@ -1145,7 +1147,7 @@ msgstr "Nedokončené úlohy"
 
 #: src/tools/dcpomatic_disk.cc:115
 msgid "Uninstall..."
 
 #: src/tools/dcpomatic_disk.cc:115
 msgid "Uninstall..."
-msgstr ""
+msgstr "Odinstalovat…"
 
 #: src/tools/dcpomatic_playlist.cc:337
 msgid "Up"
 
 #: src/tools/dcpomatic_playlist.cc:337
 msgid "Up"
@@ -1218,12 +1220,16 @@ msgid ""
 "You did not correctly confirm that you read the warning that was just "
 "shown.  DCP-o-matic Disk Writer will close now.  Please try again."
 msgstr ""
 "You did not correctly confirm that you read the warning that was just "
 "shown.  DCP-o-matic Disk Writer will close now.  Please try again."
 msgstr ""
+"Nepotvrdili jste správně, že jste si přečetli právě zobrazené varování. DCP-"
+"o-matic Disk Writer se nyní uzavře. Prosím zkuste to znovu."
 
 #: src/tools/dcpomatic_disk.cc:374
 msgid ""
 "You did not correctly confirm that you read the warning that was just "
 "shown.  Please try again."
 msgstr ""
 
 #: src/tools/dcpomatic_disk.cc:374
 msgid ""
 "You did not correctly confirm that you read the warning that was just "
 "shown.  Please try again."
 msgstr ""
+"Nepotvrdili jste správně, že jste si přečetli právě zobrazené varování. "
+"Prosím zkuste to znovu."
 
 #: src/tools/dcpomatic_batch.cc:340 src/tools/dcpomatic.cc:589
 #: src/tools/dcpomatic_editor.cc:381 src/tools/dcpomatic_player.cc:640
 
 #: src/tools/dcpomatic_batch.cc:340 src/tools/dcpomatic.cc:589
 #: src/tools/dcpomatic_editor.cc:381 src/tools/dcpomatic_player.cc:640
@@ -1240,6 +1246,8 @@ msgid ""
 "You must enter a valid email address when sending translations, otherwise "
 "the DCP-o-matic maintainers cannot credit you or contact you with questions."
 msgstr ""
 "You must enter a valid email address when sending translations, otherwise "
 "the DCP-o-matic maintainers cannot credit you or contact you with questions."
 msgstr ""
+"Při odesílání překladů musíte zadat platnou e-mailovou adresu, jinak vám "
+"správci DCP-o-matic nemohou připsat kredit ani vás kontaktovat s dotazy."
 
 #, fuzzy
 #~ msgid "DCP-o-matic DCP Combiner"
 
 #, fuzzy
 #~ msgid "DCP-o-matic DCP Combiner"
index a7c91982caf8accc06accce7e2f045c60ec1e1fe..27d0893aba0ba2463e0ab344ecebf10afb03f9f7 100644 (file)
@@ -9,7 +9,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2024-01-12 00:54+0100\n"
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2024-01-12 00:54+0100\n"
-"PO-Revision-Date: 2023-05-15 09:25+0200\n"
+"PO-Revision-Date: 2024-05-02 14:12+0200\n"
 "Last-Translator: Tomáš Begeni <begeni@razdva.cz>\n"
 "Language-Team: DCP-o-matic translators\n"
 "Language: cs_CZ\n"
 "Last-Translator: Tomáš Begeni <begeni@razdva.cz>\n"
 "Language-Team: DCP-o-matic translators\n"
 "Language: cs_CZ\n"
@@ -17,7 +17,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 3.2.2\n"
+"X-Generator: Poedit 3.4.2\n"
 "X-Poedit-Bookmarks: -1,-1,-1,-1,369,-1,-1,-1,-1,-1\n"
 
 #: src/wx/player_information.cc:112
 "X-Poedit-Bookmarks: -1,-1,-1,-1,369,-1,-1,-1,-1,-1\n"
 
 #: src/wx/player_information.cc:112
@@ -80,12 +80,11 @@ msgid "%s %s"
 msgstr "%s %s"
 
 #: src/wx/about_dialog.cc:89
 msgstr "%s %s"
 
 #: src/wx/about_dialog.cc:89
-#, fuzzy
 msgid ""
 "(C) 2012-2024 Carl Hetherington, Terrence Meiczinger\n"
 " Ole Laursen"
 msgstr ""
 msgid ""
 "(C) 2012-2024 Carl Hetherington, Terrence Meiczinger\n"
 " Ole Laursen"
 msgstr ""
-"© 2012-2023 Carl Hetherington, Terrence Meiczinger\n"
+"© 2012-2024 Carl Hetherington, Terrence Meiczinger\n"
 " Ole Laursen"
 
 #: src/wx/file_picker_ctrl.cc:51 src/wx/file_picker_ctrl.cc:66
 " Ole Laursen"
 
 #: src/wx/file_picker_ctrl.cc:51 src/wx/file_picker_ctrl.cc:66
@@ -210,7 +209,7 @@ msgstr "<IssueDate> má neplatnou hodnotu %n"
 #: src/wx/verify_dcp_dialog.cc:417
 #, c-format
 msgid "<MainSoundConfiguration> describes incorrect number of channels (%n)"
 #: src/wx/verify_dcp_dialog.cc:417
 #, c-format
 msgid "<MainSoundConfiguration> describes incorrect number of channels (%n)"
-msgstr ""
+msgstr "<MainSoundConfiguration> popisuje nesprávný počet kanálů (%n)"
 
 #: src/wx/subtitle_appearance_dialog.cc:118
 msgid "<b>New colour</b>"
 
 #: src/wx/subtitle_appearance_dialog.cc:118
 msgid "<b>New colour</b>"
@@ -313,6 +312,8 @@ msgid ""
 "A subtitle or closed caption refers to a font with ID %id that does not have "
 "a corresponding <LoadFont> node."
 msgstr ""
 "A subtitle or closed caption refers to a font with ID %id that does not have "
 "a corresponding <LoadFont> node."
 msgstr ""
+"Titulky nebo skryté titulky odkazují na písmo s ID %id, které nemá "
+"odpovídající node <LoadFont>."
 
 #: src/wx/config_dialog.cc:996
 msgid "ALSA"
 
 #: src/wx/config_dialog.cc:996
 msgid "ALSA"
@@ -399,9 +400,8 @@ msgid "Add recipient"
 msgstr "Přidat adresáta"
 
 #: src/wx/content_panel.cc:264
 msgstr "Přidat adresáta"
 
 #: src/wx/content_panel.cc:264
-#, fuzzy
 msgid "Add video, image, sound or subtitle files to the film (Ctrl+A)."
 msgid "Add video, image, sound or subtitle files to the film (Ctrl+A)."
-msgstr "Přidat video, obrázek zvuk nebo titulky do filmu."
+msgstr "Přidejte do filmu soubory videa, obrázků, zvuku nebo titulků (Ctrl+A)."
 
 #: src/wx/config_dialog.cc:301 src/wx/recipients_panel.cc:69
 #: src/wx/editable_list.h:141
 
 #: src/wx/config_dialog.cc:301 src/wx/recipients_panel.cc:69
 #: src/wx/editable_list.h:141
@@ -720,14 +720,12 @@ msgid "Certificate downloaded"
 msgstr "Certifikát stažen"
 
 #: src/wx/invalid_certificate_period_dialog.cc:63
 msgstr "Certifikát stažen"
 
 #: src/wx/invalid_certificate_period_dialog.cc:63
-#, fuzzy
 msgid "Certificate end"
 msgid "Certificate end"
-msgstr "Řetěz certifikátoů"
+msgstr "Konec certifikátu"
 
 #: src/wx/invalid_certificate_period_dialog.cc:55
 
 #: src/wx/invalid_certificate_period_dialog.cc:55
-#, fuzzy
 msgid "Certificate start"
 msgid "Certificate start"
-msgstr "Řetěz certifikátoů"
+msgstr "Začátek certifikátu"
 
 #: src/wx/metadata_dialog.cc:298
 msgid "Chain"
 
 #: src/wx/metadata_dialog.cc:298
 msgid "Chain"
@@ -786,9 +784,8 @@ msgid "Christie"
 msgstr "Christie"
 
 #: src/wx/invalid_certificate_period_dialog.cc:39
 msgstr "Christie"
 
 #: src/wx/invalid_certificate_period_dialog.cc:39
-#, fuzzy
 msgid "Cinema"
 msgid "Cinema"
-msgstr "kino"
+msgstr "Kino"
 
 #: src/wx/full_config_dialog.cc:122
 msgid "Cinema and screen database file"
 
 #: src/wx/full_config_dialog.cc:122
 msgid "Cinema and screen database file"
@@ -914,9 +911,8 @@ msgid "Could not load certificate (%s)"
 msgstr "Nelze načíst certifikát (%s)"
 
 #: src/wx/simple_video_view.cc:176
 msgstr "Nelze načíst certifikát (%s)"
 
 #: src/wx/simple_video_view.cc:176
-#, fuzzy
 msgid "Could not play content"
 msgid "Could not play content"
-msgstr "Nelze načíst KDM"
+msgstr "Obsah nelze přehrát"
 
 #: src/wx/gl_video_view.cc:139
 #, c-format
 
 #: src/wx/gl_video_view.cc:139
 #, c-format
@@ -961,9 +957,8 @@ msgid "Cover Sheet"
 msgstr "Titulní stránka"
 
 #: src/wx/invalid_certificate_period_dialog.cc:98
 msgstr "Titulní stránka"
 
 #: src/wx/invalid_certificate_period_dialog.cc:98
-#, fuzzy
 msgid "Create KDMs anyway"
 msgid "Create KDMs anyway"
-msgstr "Přesto vytvořit DCP"
+msgstr "Přesto vytvořit KDM"
 
 #: src/wx/film_name_location_dialog.cc:51
 msgid "Create in folder"
 
 #: src/wx/film_name_location_dialog.cc:51
 msgid "Create in folder"
@@ -1464,6 +1459,8 @@ msgid ""
 "Frame %frame has an image component that is too large (component %component "
 "is %size bytes in size)."
 msgstr ""
 "Frame %frame has an image component that is too large (component %component "
 "is %size bytes in size)."
 msgstr ""
+"Snímek %frame obsahuje komponentu obrázku, která je příliš velká (komponenta "
+"%component má velikost %size bytů)."
 
 #: src/wx/dcp_panel.cc:827
 msgid "Frame Rate"
 
 #: src/wx/dcp_panel.cc:827
 msgid "Frame Rate"
@@ -1601,9 +1598,8 @@ msgid "IP address / host name"
 msgstr "IP adresa / host name"
 
 #: src/wx/full_config_dialog.cc:1551
 msgstr "IP adresa / host name"
 
 #: src/wx/full_config_dialog.cc:1551
-#, fuzzy
 msgid "ISDCF name part length"
 msgid "ISDCF name part length"
-msgstr "ISDCF název"
+msgstr "Délka části názvu ISDCF"
 
 #: src/wx/full_config_dialog.cc:1387
 msgid "Identifiers"
 
 #: src/wx/full_config_dialog.cc:1387
 msgid "Identifiers"
@@ -1737,13 +1733,12 @@ msgid "Intermediate common name"
 msgstr "Intermediate common name"
 
 #: src/wx/metadata_dialog.cc:208
 msgstr "Intermediate common name"
 
 #: src/wx/metadata_dialog.cc:208
-#, fuzzy
 msgid "International texted"
 msgid "International texted"
-msgstr "CPL anotace textu"
+msgstr "Mezinárodní textové zprávy"
 
 #: src/wx/metadata_dialog.cc:209
 msgid "International textless"
 
 #: src/wx/metadata_dialog.cc:209
 msgid "International textless"
-msgstr ""
+msgstr "Mezinárodní bez textu"
 
 #: src/wx/dcp_panel.cc:173 src/wx/full_config_dialog.cc:414
 msgid "Interop"
 
 #: src/wx/dcp_panel.cc:173 src/wx/full_config_dialog.cc:414
 msgid "Interop"
@@ -1754,9 +1749,8 @@ msgid "Invalid DCP-o-matic export file"
 msgstr "Neplatný soubor exportu DCP-o-matic"
 
 #: src/wx/invalid_certificate_period_dialog.cc:33
 msgstr "Neplatný soubor exportu DCP-o-matic"
 
 #: src/wx/invalid_certificate_period_dialog.cc:33
-#, fuzzy
 msgid "Invalid certificates"
 msgid "Invalid certificates"
-msgstr "Stáhnout certifikát"
+msgstr "Neplatné certifikáty"
 
 #: src/wx/colour_conversion_editor.cc:215
 msgid "Inverse 2.6 gamma correction on output"
 
 #: src/wx/colour_conversion_editor.cc:215
 msgid "Inverse 2.6 gamma correction on output"
@@ -2210,9 +2204,8 @@ msgid "Open console window"
 msgstr "Otevřít okno s konzolou"
 
 #: src/wx/content_panel.cc:288
 msgstr "Otevřít okno s konzolou"
 
 #: src/wx/content_panel.cc:288
-#, fuzzy
 msgid "Open the timeline for the film (Ctrl+T)."
 msgid "Open the timeline for the film (Ctrl+T)."
-msgstr "Otevřít časovou osu pro film."
+msgstr "Otevřete časovou osu filmu (Ctrl+T)."
 
 #: src/wx/full_config_dialog.cc:1774 src/wx/player_config_dialog.cc:113
 msgid "OpenGL (faster)"
 
 #: src/wx/full_config_dialog.cc:1774 src/wx/player_config_dialog.cc:113
 msgid "OpenGL (faster)"
@@ -2538,9 +2531,8 @@ msgid "Remove Screen"
 msgstr "Odstranit obraz"
 
 #: src/wx/content_panel.cc:276
 msgstr "Odstranit obraz"
 
 #: src/wx/content_panel.cc:276
-#, fuzzy
 msgid "Remove the selected piece of content from the film (Delete)."
 msgid "Remove the selected piece of content from the film (Delete)."
-msgstr "Odstranit vybranou část obsahu z filmu."
+msgstr "Odstraňte vybranou část obsahu z filmu (Smazat)."
 
 #: src/wx/rename_template_dialog.cc:26
 msgid "Rename template"
 
 #: src/wx/rename_template_dialog.cc:26
 msgid "Rename template"
@@ -2673,9 +2665,8 @@ msgid "Scale"
 msgstr "Měřítko"
 
 #: src/wx/invalid_certificate_period_dialog.cc:47
 msgstr "Měřítko"
 
 #: src/wx/invalid_certificate_period_dialog.cc:47
-#, fuzzy
 msgid "Screen"
 msgid "Screen"
-msgstr "Obraz"
+msgstr "Obrazovka"
 
 #: src/wx/kdm_dialog.cc:81
 msgid "Screens"
 
 #: src/wx/kdm_dialog.cc:81
 msgid "Screens"
@@ -2816,9 +2807,8 @@ msgid "Set project DCP settings from this DCP"
 msgstr "Nastavit DCP projekt z tohoto DCP"
 
 #: src/wx/content_menu.cc:113
 msgstr "Nastavit DCP projekt z tohoto DCP"
 
 #: src/wx/content_menu.cc:113
-#, fuzzy
 msgid "Set project markers from this DCP"
 msgid "Set project markers from this DCP"
-msgstr "Nastavit DCP projekt z tohoto DCP"
+msgstr "Nastavte značky projektu z tohoto DCP"
 
 #: src/wx/custom_scale_dialog.cc:42
 msgid "Set ratio and fit to DCP container"
 
 #: src/wx/custom_scale_dialog.cc:42
 msgid "Set ratio and fit to DCP container"
@@ -2855,11 +2845,11 @@ msgstr "Zobrazit graf zvukových hladin…"
 #: src/wx/screens_panel.cc:763
 #, c-format
 msgid "Show only %d checked"
 #: src/wx/screens_panel.cc:763
 #, c-format
 msgid "Show only %d checked"
-msgstr ""
+msgstr "Zobrazit pouze %d zaškrtnutých"
 
 #: src/wx/screens_panel.cc:65 src/wx/screens_panel.cc:761
 msgid "Show only checked"
 
 #: src/wx/screens_panel.cc:65 src/wx/screens_panel.cc:761
 msgid "Show only checked"
-msgstr ""
+msgstr "Zobrazit pouze zaškrtnuté"
 
 #: src/wx/text_panel.cc:170
 msgid "Show subtitle area"
 
 #: src/wx/text_panel.cc:170
 msgid "Show subtitle area"
@@ -2903,14 +2893,12 @@ msgid "Snap"
 msgstr "Přichytit k objektům"
 
 #: src/wx/invalid_certificate_period_dialog.cc:83
 msgstr "Přichytit k objektům"
 
 #: src/wx/invalid_certificate_period_dialog.cc:83
-#, fuzzy
 msgid ""
 "Some KDMs would have validity periods which are outside the recipient "
 "certificate validity periods.  What do you want to do?"
 msgstr ""
 msgid ""
 "Some KDMs would have validity periods which are outside the recipient "
 "certificate validity periods.  What do you want to do?"
 msgstr ""
-"Některé KDM by měly doby platnosti, které jsou zcela mimo doby platnosti "
-"certifikátu příjemce.  Je velmi nepravděpodobné, že by takové KDM fungovaly, "
-"a proto nebudou vytvořeny."
+"Některé KDM by měly doby platnosti, které jsou mimo období platnosti "
+"certifikátu příjemce. Co chceš dělat?"
 
 #: src/wx/verify_dcp_dialog.cc:384
 msgid ""
 
 #: src/wx/verify_dcp_dialog.cc:384
 msgid ""
@@ -2933,16 +2921,15 @@ msgstr "Zvuk"
 
 #: src/wx/verify_dcp_dialog.cc:414
 msgid "Sound assets do not all have the same channel count."
 
 #: src/wx/verify_dcp_dialog.cc:414
 msgid "Sound assets do not all have the same channel count."
-msgstr ""
+msgstr "Všechny zvuková assety nemají stejný počet kanálů."
 
 #: src/wx/gain_calculator_dialog.cc:32
 msgid "Sound processor"
 msgstr "Zvukový procesor"
 
 #: src/wx/metadata_dialog.cc:207
 
 #: src/wx/gain_calculator_dialog.cc:32
 msgid "Sound processor"
 msgstr "Zvukový procesor"
 
 #: src/wx/metadata_dialog.cc:207
-#, fuzzy
 msgid "Specific"
 msgid "Specific"
-msgstr "Nespecifikováno"
+msgstr "Specifický"
 
 #: src/wx/dcp_panel.cc:150
 msgid "Split by video content"
 
 #: src/wx/dcp_panel.cc:150
 msgid "Split by video content"
@@ -3068,9 +3055,8 @@ msgid "Temporary version"
 msgstr "Dočasočná verze"
 
 #: src/wx/metadata_dialog.cc:205
 msgstr "Dočasočná verze"
 
 #: src/wx/metadata_dialog.cc:205
-#, fuzzy
 msgid "Territory type"
 msgid "Territory type"
-msgstr "Území (např. SK)"
+msgstr "Typ území"
 
 #: src/wx/full_config_dialog.cc:994 src/wx/full_config_dialog.cc:997
 msgid "Test email sending failed."
 
 #: src/wx/full_config_dialog.cc:994 src/wx/full_config_dialog.cc:997
 msgid "Test email sending failed."
@@ -3095,7 +3081,7 @@ msgstr "Čas 'do' musí být po čase 'od’."
 #: src/wx/verify_dcp_dialog.cc:438
 #, c-format
 msgid "The <LabelText> in a <ContentVersion> in CPL %id is empty"
 #: src/wx/verify_dcp_dialog.cc:438
 #, c-format
 msgid "The <LabelText> in a <ContentVersion> in CPL %id is empty"
-msgstr ""
+msgstr "<LabelText> v <ContentVersion> v CPL %id je prázdný"
 
 #: src/wx/verify_dcp_dialog.cc:399
 msgid ""
 
 #: src/wx/verify_dcp_dialog.cc:399
 msgid ""
@@ -3236,14 +3222,13 @@ msgstr ""
 "DCP je funkce, ale nemá žádnou značku FFMC (první snímek úvodních titulků)."
 
 #: src/wx/dkdm_dialog.cc:173 src/wx/kdm_dialog.cc:206
 "DCP je funkce, ale nemá žádnou značku FFMC (první snímek úvodních titulků)."
 
 #: src/wx/dkdm_dialog.cc:173 src/wx/kdm_dialog.cc:206
-#, fuzzy
 msgid ""
 "The KDM end period is after (or close to) the end of the signing "
 "certificates' validity period.  Either use an earlier end time for this KDM "
 "or re-create your signing certificates in the DCP-o-matic preferences window."
 msgstr ""
 msgid ""
 "The KDM end period is after (or close to) the end of the signing "
 "certificates' validity period.  Either use an earlier end time for this KDM "
 "or re-create your signing certificates in the DCP-o-matic preferences window."
 msgstr ""
-"Konec období KDM je po (nebo blízkém) konci doby platnosti podpisových "
-"certifikátů. Použijte pro tento KDM dřívější čas ukončení nebo znovu "
+"Koncové období KDM je po (nebo blízko) konci doby platnosti podpisových "
+"certifikátů. Buď použijte dřívější čas ukončení tohoto KDM, nebo znovu "
 "vytvořte své podpisové certifikáty v okně předvoleb DCP-o-matic."
 
 #: src/wx/dkdm_dialog.cc:171 src/wx/kdm_dialog.cc:204
 "vytvořte své podpisové certifikáty v okně předvoleb DCP-o-matic."
 
 #: src/wx/dkdm_dialog.cc:171 src/wx/kdm_dialog.cc:204
@@ -3291,7 +3276,7 @@ msgstr "ID prostředku v časované textové mxf neodpovídá ID obsaženého XM
 #: src/wx/verify_dcp_dialog.cc:432
 #, c-format
 msgid "The SMPTE subtitle asset %id has <Text> nodes but no <LoadFont> node"
 #: src/wx/verify_dcp_dialog.cc:432
 #, c-format
 msgid "The SMPTE subtitle asset %id has <Text> nodes but no <LoadFont> node"
-msgstr ""
+msgstr "Titulky SMPTE %id má uzly <Text>, ale žádný uzel <LoadFont>"
 
 #: src/wx/verify_dcp_dialog.cc:160
 #, c-format
 
 #: src/wx/verify_dcp_dialog.cc:160
 #, c-format
@@ -3315,7 +3300,7 @@ msgstr ""
 #, c-format
 msgid ""
 "The XML in the subtitle asset %n has more than one namespace declaration."
 #, c-format
 msgid ""
 "The XML in the subtitle asset %n has more than one namespace declaration."
-msgstr ""
+msgstr "XML v aktivu titulků %n má více než jednu deklaraci jmenného prostoru."
 
 #: src/wx/verify_dcp_dialog.cc:182
 #, c-format
 
 #: src/wx/verify_dcp_dialog.cc:182
 #, c-format
@@ -3349,7 +3334,7 @@ msgstr "Datový zdroj %n nemá <Hash> v CPL."
 #: src/wx/verify_dcp_dialog.cc:435
 #, c-format
 msgid "The asset with ID %id in the asset map actually has an id of %other_id"
 #: src/wx/verify_dcp_dialog.cc:435
 #, c-format
 msgid "The asset with ID %id in the asset map actually has an id of %other_id"
-msgstr ""
+msgstr "Dílo s ID %id v mapě aktiv má ve skutečnosti id %other_id"
 
 #: src/wx/verify_dcp_dialog.cc:272
 #, c-format
 
 #: src/wx/verify_dcp_dialog.cc:272
 #, c-format
@@ -3406,6 +3391,8 @@ msgid ""
 "The font file for font ID \"%n\" was not found, or was not referred to in "
 "the ASSETMAP."
 msgstr ""
 "The font file for font ID \"%n\" was not found, or was not referred to in "
 "the ASSETMAP."
 msgstr ""
+"Soubor fontu pro ID fontu „%n“ nebyl nalezen nebo na něj nebyl odkaz v "
+"ASSETMAP."
 
 #: src/wx/verify_dcp_dialog.cc:209
 #, c-format
 
 #: src/wx/verify_dcp_dialog.cc:209
 #, c-format
@@ -4232,9 +4219,8 @@ msgid "full screen"
 msgstr "celá obrazovka"
 
 #: src/wx/player_config_dialog.cc:99
 msgstr "celá obrazovka"
 
 #: src/wx/player_config_dialog.cc:99
-#, fuzzy
 msgid "full screen with separate advanced controls"
 msgid "full screen with separate advanced controls"
-msgstr "celá obrazovka s ovládacími prvky na jiném monitoru"
+msgstr "celá obrazovka se samostatnými pokročilými ovládacími prvky"
 
 #. TRANSLATORS: this is an abbreviation for "hours"
 #: src/wx/timing_panel.cc:85
 
 #. TRANSLATORS: this is an abbreviation for "hours"
 #: src/wx/timing_panel.cc:85
diff --git a/src/wx/send_i18n_dialog.cc b/src/wx/send_i18n_dialog.cc
deleted file mode 100644 (file)
index 6efcf99..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
-    Copyright (C) 2018-2021 Carl Hetherington <cth@carlh.net>
-
-    This file is part of DCP-o-matic.
-
-    DCP-o-matic is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    DCP-o-matic is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-
-#include "i18n_hook.h"
-#include "send_i18n_dialog.h"
-#include "wx_util.h"
-#include <dcp/warnings.h>
-LIBDCP_DISABLE_WARNINGS
-#include <wx/listctrl.h>
-LIBDCP_ENABLE_WARNINGS
-
-
-using std::string;
-using std::map;
-
-
-SendI18NDialog::SendI18NDialog (wxWindow* parent)
-       : wxDialog (parent, wxID_ANY, _("Send translations"))
-{
-       auto overall_sizer = new wxBoxSizer (wxVERTICAL);
-
-       auto table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
-       table->AddGrowableCol (1, 1);
-
-       add_label_to_sizer (table, this, _("Your name"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL);
-       _name = new wxTextCtrl (this, wxID_ANY);
-       table->Add (_name, 0, wxEXPAND);
-
-       add_label_to_sizer (table, this, _("Your email"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL);
-       _email = new wxTextCtrl (this, wxID_ANY);
-       table->Add (_email, 0, wxEXPAND);
-
-       add_label_to_sizer (table, this, _("Language"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL);
-       _language = new wxTextCtrl (this, wxID_ANY);
-       table->Add (_language, 0, wxEXPAND);
-
-       auto list = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxSize(800, -1), wxLC_REPORT | wxLC_NO_HEADER);
-       list->AppendColumn(wxT(""), wxLIST_FORMAT_LEFT, 400);
-       list->AppendColumn(wxT(""), wxLIST_FORMAT_LEFT, 400);
-
-       auto translations = I18NHook::translations ();
-       int N = 0;
-       for (auto const& i: translations) {
-               wxListItem it;
-               it.SetId(N);
-               it.SetColumn(0);
-               it.SetText(std_to_wx(i.first));
-               list->InsertItem(it);
-               it.SetColumn(1);
-               it.SetText(std_to_wx(i.second));
-               list->SetItem(it);
-               ++N;
-       }
-
-       overall_sizer->Add (table, 0, wxEXPAND | wxALL, DCPOMATIC_SIZER_GAP);
-       overall_sizer->Add (list, 1, wxEXPAND | wxALL, DCPOMATIC_SIZER_GAP);
-
-       auto buttons = CreateSeparatedButtonSizer (wxOK | wxCANCEL);
-       if (buttons) {
-               overall_sizer->Add (buttons, wxSizerFlags().Expand().DoubleBorder());
-       }
-
-       SetSizerAndFit (overall_sizer);
-}
diff --git a/src/wx/send_i18n_dialog.h b/src/wx/send_i18n_dialog.h
deleted file mode 100644 (file)
index 4651fb8..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
-    Copyright (C) 2018 Carl Hetherington <cth@carlh.net>
-
-    This file is part of DCP-o-matic.
-
-    DCP-o-matic is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    DCP-o-matic is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-
-#include "wx_util.h"
-#include <dcp/warnings.h>
-LIBDCP_DISABLE_WARNINGS
-#include <wx/wx.h>
-LIBDCP_ENABLE_WARNINGS
-
-
-class SendI18NDialog : public wxDialog
-{
-public:
-       SendI18NDialog (wxWindow* parent);
-
-       std::string name () {
-               return wx_to_std (_name->GetValue());
-       }
-
-       std::string email () {
-               return wx_to_std (_email->GetValue());
-       }
-
-       std::string language () {
-               return wx_to_std (_language->GetValue());
-       }
-
-private:
-       wxTextCtrl* _name;
-       wxTextCtrl* _email;
-       wxTextCtrl* _language;
-};
index 711b6bbad505179861a4af3ea98c09aac4dae82a..374beb6564f657326dd5ca68dd34ea8053ce4433 100644 (file)
@@ -102,6 +102,7 @@ supported_by.Add (wxT ("Kenneth Biswabic"));
 supported_by.Add (wxT ("Mike Blakesley"));
 supported_by.Add (wxT ("Cyrille Blanc"));
 supported_by.Add (wxT ("Stijn De Blieck"));
 supported_by.Add (wxT ("Mike Blakesley"));
 supported_by.Add (wxT ("Cyrille Blanc"));
 supported_by.Add (wxT ("Stijn De Blieck"));
+supported_by.Add (wxT ("Nathan Block"));
 supported_by.Add (wxT ("Félix Blume"));
 supported_by.Add (wxT ("Theodor Boder"));
 supported_by.Add (wxT ("Thorsten Boehnke"));
 supported_by.Add (wxT ("Félix Blume"));
 supported_by.Add (wxT ("Theodor Boder"));
 supported_by.Add (wxT ("Thorsten Boehnke"));
@@ -126,6 +127,7 @@ supported_by.Add (wxT ("Phillip Branford"));
 supported_by.Add (wxT ("Ingebjørg Braseth"));
 supported_by.Add (wxT ("Studio Brauneis"));
 supported_by.Add (wxT ("Thomas Bray"));
 supported_by.Add (wxT ("Ingebjørg Braseth"));
 supported_by.Add (wxT ("Studio Brauneis"));
 supported_by.Add (wxT ("Thomas Bray"));
+supported_by.Add (wxT ("Thomas Bray"));
 supported_by.Add (wxT ("queerfilm festival Bremen"));
 supported_by.Add (wxT ("Martin Brenneis"));
 supported_by.Add (wxT ("Petra-Puk Bresser"));
 supported_by.Add (wxT ("queerfilm festival Bremen"));
 supported_by.Add (wxT ("Martin Brenneis"));
 supported_by.Add (wxT ("Petra-Puk Bresser"));
@@ -233,6 +235,7 @@ supported_by.Add (wxT ("Adam Cousins"));
 supported_by.Add (wxT ("Aria Covamonas"));
 supported_by.Add (wxT ("Tom Cowan"));
 supported_by.Add (wxT ("Jill Cox"));
 supported_by.Add (wxT ("Aria Covamonas"));
 supported_by.Add (wxT ("Tom Cowan"));
 supported_by.Add (wxT ("Jill Cox"));
+supported_by.Add (wxT ("Tate Cozza"));
 supported_by.Add (wxT ("Stefano Cravero"));
 supported_by.Add (wxT ("Phillip Crawford"));
 supported_by.Add (wxT ("Root && Rust Creative"));
 supported_by.Add (wxT ("Stefano Cravero"));
 supported_by.Add (wxT ("Phillip Crawford"));
 supported_by.Add (wxT ("Root && Rust Creative"));
@@ -316,6 +319,7 @@ supported_by.Add (wxT ("Guy Edmonds"));
 supported_by.Add (wxT ("Simon Edwards"));
 supported_by.Add (wxT ("Arthur Edwards"));
 supported_by.Add (wxT ("Si Edwards"));
 supported_by.Add (wxT ("Simon Edwards"));
 supported_by.Add (wxT ("Arthur Edwards"));
 supported_by.Add (wxT ("Si Edwards"));
+supported_by.Add (wxT ("NEU-Deli Einbeck"));
 supported_by.Add (wxT ("Thomas Eingartner"));
 supported_by.Add (wxT ("Gabriel Eiriz"));
 supported_by.Add (wxT ("Chris Eller"));
 supported_by.Add (wxT ("Thomas Eingartner"));
 supported_by.Add (wxT ("Gabriel Eiriz"));
 supported_by.Add (wxT ("Chris Eller"));
@@ -372,6 +376,7 @@ supported_by.Add (wxT ("Marc Fiebig"));
 supported_by.Add (wxT ("Moshel Film"));
 supported_by.Add (wxT ("Juli Film"));
 supported_by.Add (wxT ("Pató Film"));
 supported_by.Add (wxT ("Moshel Film"));
 supported_by.Add (wxT ("Juli Film"));
 supported_by.Add (wxT ("Pató Film"));
+supported_by.Add (wxT ("HisStory Film"));
 supported_by.Add (wxT ("Hoppe Film"));
 supported_by.Add (wxT ("“How to Successfully Fail in Hollywood” Film"));
 supported_by.Add (wxT ("Hamann Film"));
 supported_by.Add (wxT ("Hoppe Film"));
 supported_by.Add (wxT ("“How to Successfully Fail in Hollywood” Film"));
 supported_by.Add (wxT ("Hamann Film"));
@@ -443,6 +448,7 @@ supported_by.Add (wxT ("Francesca Garau"));
 supported_by.Add (wxT ("Jordi Miró Garcia"));
 supported_by.Add (wxT ("Francisco Montoro Garcia"));
 supported_by.Add (wxT ("Stefano Gariglio"));
 supported_by.Add (wxT ("Jordi Miró Garcia"));
 supported_by.Add (wxT ("Francisco Montoro Garcia"));
 supported_by.Add (wxT ("Stefano Gariglio"));
+supported_by.Add (wxT ("Tom Garner"));
 supported_by.Add (wxT ("Bethwyn Garswood"));
 supported_by.Add (wxT ("Andris Gauja"));
 supported_by.Add (wxT ("DocCollection GbR"));
 supported_by.Add (wxT ("Bethwyn Garswood"));
 supported_by.Add (wxT ("Andris Gauja"));
 supported_by.Add (wxT ("DocCollection GbR"));
@@ -569,6 +575,7 @@ supported_by.Add (wxT ("Shinya Isobe"));
 supported_by.Add (wxT ("Theodore Ivanov"));
 supported_by.Add (wxT ("Julien Ivanowich"));
 supported_by.Add (wxT ("Denis Ivashvkevych"));
 supported_by.Add (wxT ("Theodore Ivanov"));
 supported_by.Add (wxT ("Julien Ivanowich"));
 supported_by.Add (wxT ("Denis Ivashvkevych"));
+supported_by.Add (wxT ("June Nho Ivers"));
 supported_by.Add (wxT ("Emilia Izquierdo"));
 supported_by.Add (wxT ("Mahboobani Jackie"));
 supported_by.Add (wxT ("Alexzandra Jackson"));
 supported_by.Add (wxT ("Emilia Izquierdo"));
 supported_by.Add (wxT ("Mahboobani Jackie"));
 supported_by.Add (wxT ("Alexzandra Jackson"));
@@ -650,6 +657,7 @@ supported_by.Add (wxT ("Dieter Kovacic"));
 supported_by.Add (wxT ("Filip Kovcin"));
 supported_by.Add (wxT ("Alan Kraemer"));
 supported_by.Add (wxT ("Joel Krantz"));
 supported_by.Add (wxT ("Filip Kovcin"));
 supported_by.Add (wxT ("Alan Kraemer"));
 supported_by.Add (wxT ("Joel Krantz"));
+supported_by.Add (wxT ("Oliver Krause"));
 supported_by.Add (wxT ("Ralph-Raimund Krause"));
 supported_by.Add (wxT ("Christian Kreil"));
 supported_by.Add (wxT ("Sebastian Kreis"));
 supported_by.Add (wxT ("Ralph-Raimund Krause"));
 supported_by.Add (wxT ("Christian Kreil"));
 supported_by.Add (wxT ("Sebastian Kreis"));
@@ -678,6 +686,8 @@ supported_by.Add (wxT ("Angela En-yu Lao"));
 supported_by.Add (wxT ("Daniel Martinez Lara"));
 supported_by.Add (wxT ("Gabriel Montagné Láscaris-Comneno"));
 supported_by.Add (wxT ("Marga Laube"));
 supported_by.Add (wxT ("Daniel Martinez Lara"));
 supported_by.Add (wxT ("Gabriel Montagné Láscaris-Comneno"));
 supported_by.Add (wxT ("Marga Laube"));
+supported_by.Add (wxT ("James Lauchlan"));
+supported_by.Add (wxT ("Luc Lavergne"));
 supported_by.Add (wxT ("Nicholas Lavigne"));
 supported_by.Add (wxT ("Philip Lawrence"));
 supported_by.Add (wxT ("David Lawrence"));
 supported_by.Add (wxT ("Nicholas Lavigne"));
 supported_by.Add (wxT ("Philip Lawrence"));
 supported_by.Add (wxT ("David Lawrence"));
@@ -813,6 +823,7 @@ supported_by.Add (wxT ("Kenjo McCurtain"));
 supported_by.Add (wxT ("Dawn McElligott"));
 supported_by.Add (wxT ("Caitlin Mcgrath"));
 supported_by.Add (wxT ("Neil McGrath"));
 supported_by.Add (wxT ("Dawn McElligott"));
 supported_by.Add (wxT ("Caitlin Mcgrath"));
 supported_by.Add (wxT ("Neil McGrath"));
+supported_by.Add (wxT ("Tom Mcintire"));
 supported_by.Add (wxT ("Andrew McKee"));
 supported_by.Add (wxT ("Gordon McLeod"));
 supported_by.Add (wxT ("Britt McTammany"));
 supported_by.Add (wxT ("Andrew McKee"));
 supported_by.Add (wxT ("Gordon McLeod"));
 supported_by.Add (wxT ("Britt McTammany"));
@@ -855,6 +866,7 @@ supported_by.Add (wxT ("Rigoberto Mora"));
 supported_by.Add (wxT ("Pierre-Jean Moreau"));
 supported_by.Add (wxT ("Stanislas Moreau"));
 supported_by.Add (wxT ("Ted Morée"));
 supported_by.Add (wxT ("Pierre-Jean Moreau"));
 supported_by.Add (wxT ("Stanislas Moreau"));
 supported_by.Add (wxT ("Ted Morée"));
+supported_by.Add (wxT ("Daniel Morez"));
 supported_by.Add (wxT ("Paolo Morini"));
 supported_by.Add (wxT ("Lars Moritz"));
 supported_by.Add (wxT ("Lindsay Morris"));
 supported_by.Add (wxT ("Paolo Morini"));
 supported_by.Add (wxT ("Lars Moritz"));
 supported_by.Add (wxT ("Lindsay Morris"));
@@ -908,6 +920,7 @@ supported_by.Add (wxT ("Didier Oriol"));
 supported_by.Add (wxT ("Kevin Orman"));
 supported_by.Add (wxT ("George Orr"));
 supported_by.Add (wxT ("orwoid.com"));
 supported_by.Add (wxT ("Kevin Orman"));
 supported_by.Add (wxT ("George Orr"));
 supported_by.Add (wxT ("orwoid.com"));
+supported_by.Add (wxT ("Neil Oseman"));
 supported_by.Add (wxT ("Danilo Marichal Osorio"));
 supported_by.Add (wxT ("Norbert Ostendorf"));
 supported_by.Add (wxT ("Peter Östlund"));
 supported_by.Add (wxT ("Danilo Marichal Osorio"));
 supported_by.Add (wxT ("Norbert Ostendorf"));
 supported_by.Add (wxT ("Peter Östlund"));
@@ -927,6 +940,7 @@ supported_by.Add (wxT ("Christian Passeri"));
 supported_by.Add (wxT ("Sharad Patel"));
 supported_by.Add (wxT ("Panagiotis Patsiaouras"));
 supported_by.Add (wxT ("Anand Patwardhan"));
 supported_by.Add (wxT ("Sharad Patel"));
 supported_by.Add (wxT ("Panagiotis Patsiaouras"));
 supported_by.Add (wxT ("Anand Patwardhan"));
+supported_by.Add (wxT ("Tomaz Pavkovic"));
 supported_by.Add (wxT ("Stanko Pavlica"));
 supported_by.Add (wxT ("Konstantinos Pavlidis"));
 supported_by.Add (wxT ("Natalie Peart"));
 supported_by.Add (wxT ("Stanko Pavlica"));
 supported_by.Add (wxT ("Konstantinos Pavlidis"));
 supported_by.Add (wxT ("Natalie Peart"));
@@ -948,6 +962,7 @@ supported_by.Add (wxT ("Jason Phelps"));
 supported_by.Add (wxT ("John Phillips"));
 supported_by.Add (wxT ("Nat Phong"));
 supported_by.Add (wxT ("Phonotone"));
 supported_by.Add (wxT ("John Phillips"));
 supported_by.Add (wxT ("Nat Phong"));
 supported_by.Add (wxT ("Phonotone"));
+supported_by.Add (wxT ("Kari Layland Photography"));
 supported_by.Add (wxT ("MelRish Photos And Films"));
 supported_by.Add (wxT ("Paolo Piccioli"));
 supported_by.Add (wxT ("Peccadillo Pictures"));
 supported_by.Add (wxT ("MelRish Photos And Films"));
 supported_by.Add (wxT ("Paolo Piccioli"));
 supported_by.Add (wxT ("Peccadillo Pictures"));
@@ -985,6 +1000,7 @@ supported_by.Add (wxT ("Pentimenti Productions"));
 supported_by.Add (wxT ("Hitman Productions"));
 supported_by.Add (wxT ("WLFK Productions"));
 supported_by.Add (wxT ("Ceridwen Productions"));
 supported_by.Add (wxT ("Hitman Productions"));
 supported_by.Add (wxT ("WLFK Productions"));
 supported_by.Add (wxT ("Ceridwen Productions"));
+supported_by.Add (wxT ("ZooTime Productions"));
 supported_by.Add (wxT ("A Tractor Productions"));
 supported_by.Add (wxT ("Second Wind Productions"));
 supported_by.Add (wxT ("Locomotive Productions"));
 supported_by.Add (wxT ("A Tractor Productions"));
 supported_by.Add (wxT ("Second Wind Productions"));
 supported_by.Add (wxT ("Locomotive Productions"));
@@ -1060,6 +1076,7 @@ supported_by.Add (wxT ("Objectif 13 S.C.S."));
 supported_by.Add (wxT ("Neil Sadwelkar"));
 supported_by.Add (wxT ("Hakan Sahin"));
 supported_by.Add (wxT ("Sebastien Saint-Cricq"));
 supported_by.Add (wxT ("Neil Sadwelkar"));
 supported_by.Add (wxT ("Hakan Sahin"));
 supported_by.Add (wxT ("Sebastien Saint-Cricq"));
+supported_by.Add (wxT ("Milena Salazar"));
 supported_by.Add (wxT ("Lasse Salling"));
 supported_by.Add (wxT ("Community TV Salzburg"));
 supported_by.Add (wxT ("Keith Sanborn"));
 supported_by.Add (wxT ("Lasse Salling"));
 supported_by.Add (wxT ("Community TV Salzburg"));
 supported_by.Add (wxT ("Keith Sanborn"));
index c77f68ea1dc2c7ea1baec1cbbf064d89cfa3963d..c7a32e5dd14f65df759fee5ab14f2ad6549e8404 100644 (file)
@@ -449,6 +449,12 @@ VerifyDCPDialog::VerifyDCPDialog (wxWindow* parent, shared_ptr<VerifyDCPJob> job
                case dcp::VerificationNote::Code::EMPTY_CONTENT_VERSION_LABEL_TEXT:
                        add(i, _("The <LabelText> in a <ContentVersion> in CPL %id is empty"));
                        break;
                case dcp::VerificationNote::Code::EMPTY_CONTENT_VERSION_LABEL_TEXT:
                        add(i, _("The <LabelText> in a <ContentVersion> in CPL %id is empty"));
                        break;
+               case dcp::VerificationNote::Code::INVALID_CPL_NAMESPACE:
+                       add(i, _("The CPL %f has an invalid namespace %n"));
+                       break;
+               case dcp::VerificationNote::Code::MISSING_CPL_CONTENT_VERSION:
+                       add(i, _("The CPL %n has no <ContentVersion> tag"));
+                       break;
                }
        }
 
                }
        }
 
index 9c6ea6b8435c0ab71f00b1f08d402c04cccfd143..a6eefa69f6ab452846f9febbc8caa6d8810d1161 100644 (file)
@@ -139,7 +139,6 @@ sources = """
           screen_dialog.cc
           screens_panel.cc
           self_dkdm_dialog.cc
           screen_dialog.cc
           screens_panel.cc
           self_dkdm_dialog.cc
-          send_i18n_dialog.cc
           send_test_email_dialog.cc
           server_dialog.cc
           servers_list_dialog.cc
           send_test_email_dialog.cc
           server_dialog.cc
           servers_list_dialog.cc
diff --git a/test/j2k_encoder_test.cc b/test/j2k_encoder_test.cc
new file mode 100644 (file)
index 0000000..bc3bd97
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+    Copyright (C) 2024 Carl Hetherington <cth@carlh.net>
+
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    DCP-o-matic is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+
+#include "lib/config.h"
+#include "lib/cross.h"
+#include "lib/image.h"
+#include "lib/j2k_encoder.h"
+#include "lib/player_video.h"
+#include "lib/raw_image_proxy.h"
+#include "lib/writer.h"
+#include "test.h"
+extern "C" {
+#include <libavutil/pixfmt.h>
+}
+#include <boost/test/unit_test.hpp>
+
+
+using std::make_shared;
+using std::weak_ptr;
+using boost::optional;
+
+
+BOOST_AUTO_TEST_CASE(j2k_encoder_deadlock_test)
+{
+       ConfigRestorer cr;
+
+       auto film = new_test_film2("j2k_encoder_deadlock_test");
+
+       /* Don't call ::start() on this Writer, so it can never write anything */
+       Writer writer(film, {});
+       writer.set_encoder_threads(4);
+
+       /* We want to test the case where the writer queue fills, and this can't happen unless there
+        * are enough encoding threads (each of which will end up waiting for the writer to empty,
+        * which will never happen).
+        */
+       Config::instance()->set_master_encoding_threads(4);
+       J2KEncoder encoder(film, writer);
+       encoder.begin();
+
+       for (int i = 0; i < 26; ++i) {
+               auto image = make_shared<Image>(AV_PIX_FMT_RGB24, dcp::Size(1998, 1080), Image::Alignment::PADDED);
+               auto image_proxy = make_shared<RawImageProxy>(image);
+               encoder.encode(
+                       std::make_shared<PlayerVideo>(
+                               image_proxy,
+                               Crop(),
+                               optional<double>(),
+                               dcp::Size(1998, 1080),
+                               dcp::Size(1998, 1080),
+                               Eyes::BOTH,
+                               Part::WHOLE,
+                               optional<ColourConversion>(),
+                               VideoRange::VIDEO,
+                               weak_ptr<Content>(),
+                               optional<Frame>(),
+                               false
+                               ),
+                       {}
+                       );
+       }
+
+       dcpomatic_sleep_seconds(10);
+}
+
index 79cc68849499531dfa339e63bfeacd4f16724b9a..8bb18f304c2d77ea2b2702d2077b44f3ee239e8e 100644 (file)
 
 #include "lib/content.h"
 #include "lib/content_factory.h"
 
 #include "lib/content.h"
 #include "lib/content_factory.h"
+#include "lib/content_text.h"
+#include "lib/dcpomatic_time.h"
 #include "lib/film.h"
 #include "lib/film.h"
+#include "lib/ffmpeg_content.h"
+#include "lib/ffmpeg_decoder.h"
 #include "lib/text_content.h"
 #include "lib/text_content.h"
+#include "lib/text_decoder.h"
 #include "lib/video_content.h"
 #include "test.h"
 #include <dcp/cpl.h>
 #include "lib/video_content.h"
 #include "test.h"
 #include <dcp/cpl.h>
@@ -33,6 +38,9 @@
 #include <iostream>
 
 
 #include <iostream>
 
 
+using std::dynamic_pointer_cast;
+
+
 BOOST_AUTO_TEST_CASE (test_subtitle_timing_with_frame_rate_change)
 {
        Cleanup cl;
 BOOST_AUTO_TEST_CASE (test_subtitle_timing_with_frame_rate_change)
 {
        Cleanup cl;
@@ -72,3 +80,66 @@ BOOST_AUTO_TEST_CASE (test_subtitle_timing_with_frame_rate_change)
        cl.run();
 }
 
        cl.run();
 }
 
+
+BOOST_AUTO_TEST_CASE(dvb_subtitles_replace_the_last)
+{
+       /* roh.mkv contains subtitles that come out of FFmpeg with incorrect stop times (30s
+        * after the start, which seems to be some kind of DVB "standard" timeout).
+        * Between actual subtitles it contains blanks that are apparently supposed to clear
+        * the previous subtitle.  Make sure that happens.
+        */
+       auto content = content_factory(TestPaths::private_data() / "roh.mkv");
+       BOOST_REQUIRE(!content.empty());
+       auto film = new_test_film2("dvb_subtitles_replace_the_last", { content[0] });
+
+       FFmpegDecoder decoder(film, dynamic_pointer_cast<FFmpegContent>(content[0]), false);
+       BOOST_REQUIRE(!decoder.text.empty());
+
+       struct Event {
+               std::string type;
+               dcpomatic::ContentTime time;
+
+               bool operator==(Event const& other) const {
+                       return type == other.type && time == other.time;
+               }
+       };
+
+       std::vector<Event> events;
+
+       auto start = [&events](ContentBitmapText text) {
+               events.push_back({"start", text.from()});
+       };
+
+       auto stop = [&events](dcpomatic::ContentTime time) {
+               if (!events.empty() && events.back().type == "stop") {
+                       /* We'll get a bad (too-late) stop time, then the correct one
+                        * when the "clearing" subtitle arrives.
+                        */
+                       events.pop_back();
+               }
+               events.push_back({"stop", time});
+       };
+
+       decoder.text.front()->BitmapStart.connect(start);
+       decoder.text.front()->Stop.connect(stop);
+
+       while (!decoder.pass()) {}
+
+       using dcpomatic::ContentTime;
+
+       std::vector<Event> correct = {
+               { "start", ContentTime(439872) },  // 4.582000s     actual subtitle #1
+               { "stop",  ContentTime(998400) },  // 10.400000s    stop caused by incoming blank
+               { "start", ContentTime(998400) },  // 10.400000s    blank
+               { "stop",  ContentTime(1141248) }, // 11.888000s    stop caused by incoming subtitle #2
+               { "start", ContentTime(1141248) }, // 11.888000s    subtitle #2
+               { "stop",  ContentTime(1455936) }, // 15.166000s    ...
+               { "start", ContentTime(1455936) }, // 15.166000s
+               { "stop",  ContentTime(1626816) }, // 16.946000s
+               { "start", ContentTime(1626816) }, // 16.946000s
+       };
+
+       BOOST_REQUIRE(events.size() > correct.size());
+       BOOST_CHECK(std::vector<Event>(events.begin(), events.begin() + correct.size()) == correct);
+}
+
index bb66d1a5f952ff07d115ac63c9d647e6346829a6..cd23badc0610eac04f971087bab4466ffa0aad9b 100644 (file)
@@ -112,6 +112,7 @@ def build(bld):
                  interrupt_encoder_test.cc
                  isdcf_name_test.cc
                  j2k_bandwidth_test.cc
                  interrupt_encoder_test.cc
                  isdcf_name_test.cc
                  j2k_bandwidth_test.cc
+                 j2k_encoder_test.cc
                  job_manager_test.cc
                  kdm_cli_test.cc
                  kdm_naming_test.cc
                  job_manager_test.cc
                  kdm_cli_test.cc
                  kdm_naming_test.cc
diff --git a/wscript b/wscript
index f6f73a52a132701aa667dfe169270935e817681e..d97a2f97cd594d1bebc6d2c74db396215b1db0f2 100644 (file)
--- a/wscript
+++ b/wscript
@@ -38,17 +38,17 @@ APPNAME = 'dcpomatic'
 libdcp_version = '1.8.73'
 libsub_version = '1.6.42'
 
 libdcp_version = '1.8.73'
 libsub_version = '1.6.42'
 
-this_version = subprocess.Popen(shlex.split('git tag -l --points-at HEAD'), stdout=subprocess.PIPE).communicate()[0]
-last_version = subprocess.Popen(shlex.split('git describe --tags --match v* --abbrev=0'), stdout=subprocess.PIPE).communicate()[0]
+this_version = subprocess.Popen(['git', 'tag', '-l', '--points-at', 'HEAD'], stdout=subprocess.PIPE).communicate()[0]
+git_head = subprocess.Popen(['git', 'rev-parse', '--short=9', 'HEAD'], stdout=subprocess.PIPE).communicate()[0]
 
 # Python 2/3 compatibility; I don't really understand what's going on here
 if not isinstance(this_version, str):
     this_version = this_version.decode('utf-8')
 
 # Python 2/3 compatibility; I don't really understand what's going on here
 if not isinstance(this_version, str):
     this_version = this_version.decode('utf-8')
-if not isinstance(last_version, str):
-    last_version = last_version.decode('utf-8')
+if not isinstance(git_head, str):
+    git_head = git_head.decode('utf-8')
 
 
-if this_version == '' or this_version == 'merged-to-main':
-    VERSION = '%sdevel' % last_version[1:].strip()
+if this_version == '':
+    VERSION = git_head.strip()
 else:
     VERSION = this_version[1:].strip()
 
 else:
     VERSION = this_version[1:].strip()
 
@@ -196,7 +196,6 @@ def configure(conf):
                                int main() { std::locale::global (boost::locale::generator().generate ("")); }\n
                                """,
                                msg='Checking for boost locale library',
                                int main() { std::locale::global (boost::locale::generator().generate ("")); }\n
                                """,
                                msg='Checking for boost locale library',
-                               libpath='/usr/local/lib',
                                lib=['boost_locale%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix],
                                uselib_store='BOOST_LOCALE')
 
                                lib=['boost_locale%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix],
                                uselib_store='BOOST_LOCALE')
 
@@ -219,7 +218,6 @@ def configure(conf):
     if conf.env.TARGET_OSX:
         conf.env.append_value('CXXFLAGS', ['-DDCPOMATIC_OSX', '-DGL_SILENCE_DEPRECATION'])
         conf.env.append_value('LINKFLAGS', '-headerpad_max_install_names')
     if conf.env.TARGET_OSX:
         conf.env.append_value('CXXFLAGS', ['-DDCPOMATIC_OSX', '-DGL_SILENCE_DEPRECATION'])
         conf.env.append_value('LINKFLAGS', '-headerpad_max_install_names')
-        conf.env.append_value('LINKFLAGS', '-llzma')
 
     #
     # Dependencies.
 
     #
     # Dependencies.
@@ -250,7 +248,7 @@ def configure(conf):
                        mandatory=True,
                        msg='Checking for libicu',
                        okmsg='yes',
                        mandatory=True,
                        msg='Checking for libicu',
                        okmsg='yes',
-                       libpath=['/usr/local/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu'],
+                       libpath=['/usr/lib', '/usr/lib/x86_64-linux-gnu'],
                        lib=['icuio', 'icui18n', 'icudata', 'icuuc'],
                        uselib_store='ICU')
 
                        lib=['icuio', 'icui18n', 'icudata', 'icuuc'],
                        uselib_store='ICU')
 
@@ -400,7 +398,6 @@ def configure(conf):
                             int main() { struct jpeg_compress_struct compress; jpeg_create_compress (&compress); return 0; }
                             """,
                    msg='Checking for libjpeg',
                             int main() { struct jpeg_compress_struct compress; jpeg_create_compress (&compress); return 0; }
                             """,
                    msg='Checking for libjpeg',
-                   libpath='/usr/local/lib',
                    lib=['jpeg'],
                    uselib_store='JPEG')
 
                    lib=['jpeg'],
                    uselib_store='JPEG')
 
@@ -411,7 +408,6 @@ def configure(conf):
                                 int main() { ext4_mount("ext4_fs", "/mp/", false); }\n
                                 """,
                                 msg='Checking for lwext4 library',
                                 int main() { ext4_mount("ext4_fs", "/mp/", false); }\n
                                 """,
                                 msg='Checking for lwext4 library',
-                                libpath='/usr/local/lib',
                                 lib=['lwext4', 'blockdev'],
                                 uselib_store='LWEXT4')
 
                                 lib=['lwext4', 'blockdev'],
                                 uselib_store='LWEXT4')
 
@@ -550,7 +546,6 @@ def configure(conf):
                            int main() { boost::thread t; }\n
                            """,
                        msg='Checking for boost threading library',
                            int main() { boost::thread t; }\n
                            """,
                        msg='Checking for boost threading library',
-                       libpath='/usr/local/lib',
                        lib=[boost_thread, 'boost_system%s' % boost_lib_suffix],
                        uselib_store='BOOST_THREAD')
 
                        lib=[boost_thread, 'boost_system%s' % boost_lib_suffix],
                        uselib_store='BOOST_THREAD')
 
@@ -559,7 +554,6 @@ def configure(conf):
                            int main() { boost::filesystem::copy_file ("a", "b"); }\n
                            """,
                        msg='Checking for boost filesystem library',
                            int main() { boost::filesystem::copy_file ("a", "b"); }\n
                            """,
                        msg='Checking for boost filesystem library',
-                       libpath='/usr/local/lib',
                        lib=['boost_filesystem%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix],
                        uselib_store='BOOST_FILESYSTEM')
 
                        lib=['boost_filesystem%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix],
                        uselib_store='BOOST_FILESYSTEM')
 
@@ -568,7 +562,6 @@ def configure(conf):
                            int main() { boost::gregorian::day_clock::local_day(); }\n
                            """,
                        msg='Checking for boost datetime library',
                            int main() { boost::gregorian::day_clock::local_day(); }\n
                            """,
                        msg='Checking for boost datetime library',
-                       libpath='/usr/local/lib',
                        lib=['boost_date_time%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix],
                        uselib_store='BOOST_DATETIME')
 
                        lib=['boost_date_time%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix],
                        uselib_store='BOOST_DATETIME')