Don't throw an error when the Butler says it is finished (#2097).
authorCarl Hetherington <cth@carlh.net>
Mon, 11 Oct 2021 08:51:43 +0000 (10:51 +0200)
committerCarl Hetherington <cth@carlh.net>
Mon, 11 Oct 2021 10:34:47 +0000 (12:34 +0200)
src/lib/ffmpeg_encoder.cc
test/ffmpeg_encoder_test.cc

index dd773168aab2620a14a89e692d12610b552afb22..5db3e31a69f97e90687e652afb2ce19902ef9f6e 100644 (file)
@@ -178,12 +178,15 @@ FFmpegEncoder::go ()
                        Butler::Error e;
                        auto v = _butler->get_video (true, &e);
                        _butler->rethrow ();
-                       if (!v.first) {
-                               throw DecodeError(String::compose("Error during decoding: %1", e.summary()));
-                       }
-                       auto fe = encoder->get (v.first->eyes());
-                       if (fe) {
-                               fe->video(v.first, v.second - reel->from);
+                       if (v.first) {
+                               auto fe = encoder->get (v.first->eyes());
+                               if (fe) {
+                                       fe->video(v.first, v.second - reel->from);
+                               }
+                       } else {
+                               if (e.code != Butler::Error::Code::FINISHED) {
+                                       throw DecodeError(String::compose("Error during decoding: %1", e.summary()));
+                               }
                        }
                }
 
index d0bce03567065c24860fb9ab63faeb78baa460ff..3d6276fcb388605e837e6f50c928da38a95cc13f 100644 (file)
@@ -40,7 +40,6 @@
 using std::string;
 using std::shared_ptr;
 using std::make_shared;
-using boost::optional;
 using namespace dcpomatic;
 
 
@@ -455,3 +454,15 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_with_reels)
        check ("build/test/ffmpeg_encoder_h264_with_reels_reel2.mov");
 }
 
+
+/** Regression test for "Error during decoding: Butler finished" (#2097) */
+BOOST_AUTO_TEST_CASE (ffmpeg_encoder_prores_regression_1)
+{
+       auto content = content_factory(TestPaths::private_data() / "arrietty_JP-EN.mkv").front();
+       auto film = new_test_film2 ("ffmpeg_encoder_prores_regression_1", { content });
+
+       auto job = make_shared<TranscodeJob>(film);
+       FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_regression_1.mov", ExportFormat::PRORES, false, true, false, 23);
+       encoder.go ();
+}
+