Rename PRORES -> PRORES_HQ
[dcpomatic.git] / test / ffmpeg_encoder_test.cc
index d0bce03567065c24860fb9ab63faeb78baa460ff..ff730ad53354a904a8aabf9894a8bf48e16500a1 100644 (file)
 
 #include "lib/audio_content.h"
 #include "lib/compose.hpp"
+#include "lib/config.h"
 #include "lib/content_factory.h"
 #include "lib/dcp_content.h"
+#include "lib/dcpomatic_log.h"
 #include "lib/ffmpeg_content.h"
 #include "lib/ffmpeg_encoder.h"
 #include "lib/ffmpeg_examiner.h"
@@ -40,7 +42,6 @@
 using std::string;
 using std::shared_ptr;
 using std::make_shared;
-using boost::optional;
 using namespace dcpomatic;
 
 
@@ -56,11 +57,10 @@ ffmpeg_content_test (int number, boost::filesystem::path content, ExportFormat f
                name += "h264";
                extension = "mp4";
                break;
-       case ExportFormat::PRORES:
+       case ExportFormat::PRORES_HQ:
                name += "prores";
                extension = "mov";
                break;
-       case ExportFormat::H264_PCM:
        case ExportFormat::SUBTITLES_DCP:
                BOOST_REQUIRE (false);
        }
@@ -68,12 +68,12 @@ ffmpeg_content_test (int number, boost::filesystem::path content, ExportFormat f
        name = String::compose("%1_test%2", name, number);
 
        auto c = make_shared<FFmpegContent>(content);
-       shared_ptr<Film> film = new_test_film2 (name, {c}, &cl);
+       auto film = new_test_film2 (name, {c}, &cl);
        film->set_name (name);
        film->set_audio_channels (6);
 
        film->write_metadata ();
-       auto job = make_shared<TranscodeJob>(film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        auto file = boost::filesystem::path("build") / "test" / String::compose("%1.%2", name, extension);
        cl.add (file);
        FFmpegEncoder encoder (film, job, file, format, false, false, false, 23);
@@ -86,28 +86,28 @@ ffmpeg_content_test (int number, boost::filesystem::path content, ExportFormat f
 /** Red / green / blue MP4 -> Prores */
 BOOST_AUTO_TEST_CASE (ffmpeg_encoder_prores_test1)
 {
-       ffmpeg_content_test (1, "test/data/test.mp4", ExportFormat::PRORES);
+       ffmpeg_content_test (1, "test/data/test.mp4", ExportFormat::PRORES_HQ);
 }
 
 
 /** Dolby Aurora trailer VOB -> Prores */
 BOOST_AUTO_TEST_CASE (ffmpeg_encoder_prores_test2)
 {
-       ffmpeg_content_test (2, TestPaths::private_data() / "dolby_aurora.vob", ExportFormat::PRORES);
+       ffmpeg_content_test (2, TestPaths::private_data() / "dolby_aurora.vob", ExportFormat::PRORES_HQ);
 }
 
 
 /** Sintel trailer -> Prores */
 BOOST_AUTO_TEST_CASE (ffmpeg_encoder_prores_test3)
 {
-       ffmpeg_content_test (3, TestPaths::private_data() / "Sintel_Trailer1.480p.DivX_Plus_HD.mkv", ExportFormat::PRORES);
+       ffmpeg_content_test (3, TestPaths::private_data() / "Sintel_Trailer1.480p.DivX_Plus_HD.mkv", ExportFormat::PRORES_HQ);
 }
 
 
 /** Big Buck Bunny trailer -> Prores */
 BOOST_AUTO_TEST_CASE (ffmpeg_encoder_prores_test4)
 {
-       ffmpeg_content_test (4, TestPaths::private_data() / "big_buck_bunny_trailer_480p.mov", ExportFormat::PRORES);
+       ffmpeg_content_test (4, TestPaths::private_data() / "big_buck_bunny_trailer_480p.mov", ExportFormat::PRORES_HQ);
 }
 
 
@@ -126,8 +126,8 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_prores_test5)
        c->video->set_length (240);
 
        film->write_metadata ();
-       auto job = make_shared<TranscodeJob> (film);
-       FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_test5.mov", ExportFormat::PRORES, false, false, false, 23);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
+       FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_test5.mov", ExportFormat::PRORES_HQ, false, false, false, 23);
        encoder.go ();
 }
 
@@ -148,8 +148,8 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_prores_test6)
        s->only_text()->set_effect_colour (dcp::Colour (0, 255, 255));
        film->write_metadata();
 
-       auto job = make_shared<TranscodeJob> (film);
-       FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_test6.mov", ExportFormat::PRORES, false, false, false, 23);
+       auto job = make_shared<TranscodeJob> (film, TranscodeJob::ChangedBehaviour::IGNORE);
+       FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_test6.mov", ExportFormat::PRORES_HQ, false, false, false, 23);
        encoder.go ();
 }
 
@@ -173,8 +173,8 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_prores_test7)
        s->only_text()->set_effect (dcp::Effect::SHADOW);
        s->only_text()->set_effect_colour (dcp::Colour (0, 255, 255));
 
-       auto job = make_shared<TranscodeJob> (film);
-       FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_test7.mov", ExportFormat::PRORES, false, false, false, 23);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
+       FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_test7.mov", ExportFormat::PRORES_HQ, false, false, false, 23);
        encoder.go ();
 }
 
@@ -202,7 +202,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test2)
        s->only_text()->set_effect_colour (dcp::Colour (0, 255, 255));
        film->write_metadata();
 
-       auto job = make_shared<TranscodeJob> (film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_h264_test2.mp4", ExportFormat::H264_AAC, false, false, false, 23);
        encoder.go ();
 }
@@ -228,7 +228,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test3)
        s->only_text()->set_effect_colour (dcp::Colour (0, 255, 255));
        film->write_metadata();
 
-       auto job = make_shared<TranscodeJob> (film);
+       auto job = make_shared<TranscodeJob> (film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_h264_test3.mp4", ExportFormat::H264_AAC, false, false, false, 23);
        encoder.go ();
 }
@@ -242,7 +242,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test4)
 
        film->set_container(Ratio::from_id("185"));
 
-       auto job = make_shared<TranscodeJob>(film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder(film, job, "build/test/ffmpeg_encoder_h264_test4.mp4", ExportFormat::H264_AAC, false, false, false, 23);
        encoder.go();
 }
@@ -297,7 +297,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test5)
        map.set (0, 5, 1);
        Rs->audio->set_mapping (map);
 
-       auto job = make_shared<TranscodeJob> (film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_h264_test5.mp4", ExportFormat::H264_AAC, true, false, false, 23);
        encoder.go ();
 
@@ -325,7 +325,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test6)
                i->set_use (true);
        }
 
-       auto job = make_shared<TranscodeJob> (film2);
+       auto job = make_shared<TranscodeJob>(film2, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film2, job, "build/test/ffmpeg_encoder_h264_test6_vf.mp4", ExportFormat::H264_AAC, true, false, false, 23);
        encoder.go ();
 }
@@ -337,7 +337,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_3d_dcp_to_h264)
        auto dcp = make_shared<DCPContent>(TestPaths::private_data() / "xm");
        auto film2 = new_test_film2 ("ffmpeg_encoder_3d_dcp_to_h264_export", {dcp});
 
-       auto job = make_shared<TranscodeJob> (film2);
+       auto job = make_shared<TranscodeJob>(film2, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film2, job, "build/test/ffmpeg_encoder_3d_dcp_to_h264.mp4", ExportFormat::H264_AAC, true, false, false, 23);
        encoder.go ();
 }
@@ -359,7 +359,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test7)
        auto dcp = make_shared<DCPContent>(film->dir(film->dcp_name()));
        auto film2 = new_test_film2 ("ffmpeg_encoder_h264_test7_export", {dcp});
 
-       auto job = make_shared<TranscodeJob> (film2);
+       auto job = make_shared<TranscodeJob> (film2, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film2, job, "build/test/ffmpeg_encoder_h264_test7.mp4", ExportFormat::H264_AAC, true, false, false, 23);
        encoder.go ();
 }
@@ -368,12 +368,12 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test7)
 /** Stereo project with mixdown-to-stereo set */
 BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test8)
 {
-       shared_ptr<Film> film = new_test_film2("ffmpeg_encoder_h264_test4");
-       film->examine_and_add_content(shared_ptr<DCPContent>(new DCPContent("test/data/scope_dcp")));
+       auto film = new_test_film2("ffmpeg_encoder_h264_test4");
+       film->examine_and_add_content(make_shared<DCPContent>("test/data/scope_dcp"));
        BOOST_REQUIRE(!wait_for_jobs());
        film->set_audio_channels (2);
 
-       shared_ptr<Job> job(new TranscodeJob(film));
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder(film, job, "build/test/ffmpeg_encoder_h264_test8.mp4", ExportFormat::H264_AAC, true, false, false, 23);
        encoder.go();
 }
@@ -384,7 +384,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test9)
 {
        shared_ptr<Film> film = new_test_film ("ffmpeg_encoder_prores_test9");
        film->set_name ("ffmpeg_encoder_prores_test9");
-       shared_ptr<ImageContent> c (new ImageContent(TestPaths::private_data() / "bbc405.png"));
+       auto c = make_shared<ImageContent>(TestPaths::private_data() / "bbc405.png");
        film->set_container (Ratio::from_id ("185"));
        film->set_audio_channels (12);
 
@@ -394,7 +394,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_test9)
        c->video->set_length (240);
 
        film->write_metadata ();
-       shared_ptr<Job> job (new TranscodeJob (film));
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_test9.mov", ExportFormat::H264_AAC, false, false, false, 23);
        encoder.go ();
 }
@@ -409,8 +409,8 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_prores_from_dcp_with_crop)
        dcp->video->set_right_crop (32);
        film->write_metadata ();
 
-       auto job = make_shared<TranscodeJob>(film);
-       FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_from_dcp_with_crop.mov", ExportFormat::PRORES, false, false, false, 23);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
+       FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_from_dcp_with_crop.mov", ExportFormat::PRORES_HQ, false, false, false, 23);
        encoder.go ();
 }
 
@@ -424,7 +424,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_from_dcp_with_crop)
        dcp->video->set_right_crop (32);
        film->write_metadata ();
 
-       auto job = make_shared<TranscodeJob>(film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_from_dcp_with_crop.mov", ExportFormat::H264_AAC, false, false, false, 23);
        encoder.go ();
 }
@@ -440,7 +440,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_encoder_h264_with_reels)
        content1->video->set_length (240);
        content2->video->set_length (240);
 
-       auto job = make_shared<TranscodeJob>(film);
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
        FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_h264_with_reels.mov", ExportFormat::H264_AAC, false, true, false, 23);
        encoder.go ();
 
@@ -455,3 +455,32 @@ 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, TranscodeJob::ChangedBehaviour::IGNORE);
+       FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_regression_1.mov", ExportFormat::PRORES_HQ, false, true, false, 23);
+       encoder.go ();
+}
+
+
+/** Regression test for Butler video buffers reached 480 frames (audio is 0) (#2101) */
+BOOST_AUTO_TEST_CASE (ffmpeg_encoder_prores_regression_2)
+{
+       auto logs = dcpomatic_log->types();
+       dcpomatic_log->set_types(logs | LogEntry::TYPE_DEBUG_PLAYER);
+
+       auto content = content_factory(TestPaths::private_data() / "tge_clip.mkv").front();
+       auto film = new_test_film2 ("ffmpeg_encoder_prores_regression_2", { content });
+
+       auto job = make_shared<TranscodeJob>(film, TranscodeJob::ChangedBehaviour::IGNORE);
+       FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_prores_regression_2.mov", ExportFormat::PRORES_HQ, false, true, false, 23);
+       encoder.go ();
+
+       dcpomatic_log->set_types(logs);
+}
+