X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Ftest.cc;h=46fadd5703cb8eacb155b197337ba5ab41d4530a;hb=47f25009bcbc765e397bcb471dd361a511c99daf;hp=75199fac7ebd834e29d918405d1915a76b264a51;hpb=106c8fb2d471cb0b01da3b6b09e743304a869f4b;p=dcpomatic.git diff --git a/test/test.cc b/test/test.cc index 75199fac7..46fadd570 100644 --- a/test/test.cc +++ b/test/test.cc @@ -28,7 +28,6 @@ #include "job_manager.h" #include "util.h" #include "exceptions.h" -#include "delay_line.h" #include "image.h" #include "log.h" #include "dcp_video_frame.h" @@ -39,9 +38,11 @@ #include "subtitle.h" #include "scaler.h" #include "ffmpeg_decoder.h" -#include "external_audio_decoder.h" +#include "sndfile_decoder.h" +#include "dcp_content_type.h" +#include "trimmer.h" #define BOOST_TEST_DYN_LINK -#define BOOST_TEST_MODULE dvdomatic_test +#define BOOST_TEST_MODULE dcpomatic_test #include using std::string; @@ -89,14 +90,24 @@ new_test_film (string name) BOOST_AUTO_TEST_CASE (make_black_test) { /* This needs to happen in the first test */ - dvdomatic_setup (); + dcpomatic_setup (); libdcp::Size in_size (512, 512); libdcp::Size out_size (1024, 1024); - { - /* Plain RGB input */ - boost::shared_ptr foo (new SimpleImage (AV_PIX_FMT_RGB24, in_size, true)); + list pix_fmts; + pix_fmts.push_back (AV_PIX_FMT_RGB24); + pix_fmts.push_back (AV_PIX_FMT_YUV420P); + pix_fmts.push_back (AV_PIX_FMT_YUV422P10LE); + pix_fmts.push_back (AV_PIX_FMT_YUV444P9LE); + pix_fmts.push_back (AV_PIX_FMT_YUV444P9BE); + pix_fmts.push_back (AV_PIX_FMT_YUV444P10LE); + pix_fmts.push_back (AV_PIX_FMT_YUV444P10BE); + pix_fmts.push_back (AV_PIX_FMT_UYVY422); + + int N = 0; + for (list::const_iterator i = pix_fmts.begin(); i != pix_fmts.end(); ++i) { + boost::shared_ptr foo (new SimpleImage (*i, in_size, true)); foo->make_black (); boost::shared_ptr bar = foo->scale_and_convert_to_rgb (out_size, 0, Scaler::from_id ("bicubic"), true); @@ -108,41 +119,60 @@ BOOST_AUTO_TEST_CASE (make_black_test) } p += bar->stride()[0]; } - } - { - /* YUV420P input */ - boost::shared_ptr foo (new SimpleImage (AV_PIX_FMT_YUV420P, in_size, true)); - foo->make_black (); - boost::shared_ptr bar = foo->scale_and_convert_to_rgb (out_size, 0, Scaler::from_id ("bicubic"), true); - - uint8_t* p = bar->data()[0]; - for (int y = 0; y < bar->size().height; ++y) { - uint8_t* q = p; - for (int x = 0; x < bar->line_size()[0]; ++x) { - BOOST_CHECK_EQUAL (*q++, 0); - } - p += bar->stride()[0]; - } + ++N; } +} - { - /* YUV422P10LE input */ - boost::shared_ptr foo (new SimpleImage (AV_PIX_FMT_YUV422P10LE, in_size, true)); - foo->make_black (); - boost::shared_ptr bar = foo->scale_and_convert_to_rgb (out_size, 0, Scaler::from_id ("bicubic"), true); - - uint8_t* p = bar->data()[0]; - for (int y = 0; y < bar->size().height; ++y) { - uint8_t* q = p; - for (int x = 0; x < bar->line_size()[0]; ++x) { - BOOST_CHECK_EQUAL (*q++, 0); - } - p += bar->stride()[0]; - } - } +shared_ptr trimmer_test_last; + +void +trimmer_test_helper (shared_ptr audio) +{ + trimmer_test_last = audio; } +/** Test the audio handling of the Trimmer */ +BOOST_AUTO_TEST_CASE (trimmer_test) +{ + Trimmer trimmer (shared_ptr (), 25, 75, 200, 48000, 25, 25); + + trimmer.Audio.connect (bind (&trimmer_test_helper, _1)); + + /* 21 video frames-worth of audio frames; should be completely stripped */ + trimmer_test_last.reset (); + shared_ptr audio (new AudioBuffers (6, 21 * 1920)); + trimmer.process_audio (audio); + BOOST_CHECK (trimmer_test_last == 0); + + /* 42 more video frames-worth, 4 should be stripped from the start */ + audio.reset (new AudioBuffers (6, 42 * 1920)); + trimmer.process_audio (audio); + BOOST_CHECK (trimmer_test_last); + BOOST_CHECK_EQUAL (trimmer_test_last->frames(), 38 * 1920); + + /* 42 more video frames-worth, should be kept as-is */ + trimmer_test_last.reset (); + audio.reset (new AudioBuffers (6, 42 * 1920)); + trimmer.process_audio (audio); + BOOST_CHECK (trimmer_test_last); + BOOST_CHECK_EQUAL (trimmer_test_last->frames(), 42 * 1920); + + /* 25 more video frames-worth, 5 should be trimmed from the end */ + trimmer_test_last.reset (); + audio.reset (new AudioBuffers (6, 25 * 1920)); + trimmer.process_audio (audio); + BOOST_CHECK (trimmer_test_last); + BOOST_CHECK_EQUAL (trimmer_test_last->frames(), 20 * 1920); + + /* Now some more; all should be trimmed */ + trimmer_test_last.reset (); + audio.reset (new AudioBuffers (6, 100 * 1920)); + trimmer.process_audio (audio); + BOOST_CHECK (trimmer_test_last == 0); +} + + BOOST_AUTO_TEST_CASE (film_metadata_test) { setup_test_config (); @@ -162,7 +192,7 @@ BOOST_AUTO_TEST_CASE (film_metadata_test) BOOST_CHECK (f->filters ().empty()); f->set_name ("fred"); - BOOST_CHECK_THROW (f->set_content ("jim"), OpenFileError); +// BOOST_CHECK_THROW (f->set_content ("jim"), OpenFileError); f->set_dcp_content_type (DCPContentType::from_pretty_name ("Short")); f->set_format (Format::from_nickname ("Flat")); f->set_left_crop (1); @@ -175,7 +205,7 @@ BOOST_AUTO_TEST_CASE (film_metadata_test) f->set_filters (f_filters); f->set_trim_start (42); f->set_trim_end (99); - f->set_dcp_ab (true); + f->set_ab (true); f->write_metadata (); stringstream s; @@ -197,56 +227,25 @@ BOOST_AUTO_TEST_CASE (film_metadata_test) BOOST_CHECK_EQUAL (g_filters.back(), Filter::from_id ("unsharp")); BOOST_CHECK_EQUAL (g->trim_start(), 42); BOOST_CHECK_EQUAL (g->trim_end(), 99); - BOOST_CHECK_EQUAL (g->dcp_ab(), true); + BOOST_CHECK_EQUAL (g->ab(), true); g->write_metadata (); BOOST_CHECK_EQUAL (::system (s.str().c_str ()), 0); } -BOOST_AUTO_TEST_CASE (stream_test) -{ - FFmpegAudioStream a ("ffmpeg 4 44100 1 hello there world", boost::optional (1)); - BOOST_CHECK_EQUAL (a.id(), 4); - BOOST_CHECK_EQUAL (a.sample_rate(), 44100); - BOOST_CHECK_EQUAL (a.channel_layout(), 1); - BOOST_CHECK_EQUAL (a.name(), "hello there world"); - BOOST_CHECK_EQUAL (a.to_string(), "ffmpeg 4 44100 1 hello there world"); - - ExternalAudioStream e ("external 44100 1", boost::optional (1)); - BOOST_CHECK_EQUAL (e.sample_rate(), 44100); - BOOST_CHECK_EQUAL (e.channel_layout(), 1); - BOOST_CHECK_EQUAL (e.to_string(), "external 44100 1"); - - SubtitleStream s ("5 a b c", boost::optional (1)); - BOOST_CHECK_EQUAL (s.id(), 5); - BOOST_CHECK_EQUAL (s.name(), "a b c"); - - shared_ptr ff = audio_stream_factory ("ffmpeg 4 44100 1 hello there world", boost::optional (1)); - shared_ptr cff = dynamic_pointer_cast (ff); - BOOST_CHECK (cff); - BOOST_CHECK_EQUAL (cff->id(), 4); - BOOST_CHECK_EQUAL (cff->sample_rate(), 44100); - BOOST_CHECK_EQUAL (cff->channel_layout(), 1); - BOOST_CHECK_EQUAL (cff->name(), "hello there world"); - BOOST_CHECK_EQUAL (cff->to_string(), "ffmpeg 4 44100 1 hello there world"); - - shared_ptr fe = audio_stream_factory ("external 44100 1", boost::optional (1)); - BOOST_CHECK_EQUAL (fe->sample_rate(), 44100); - BOOST_CHECK_EQUAL (fe->channel_layout(), 1); - BOOST_CHECK_EQUAL (fe->to_string(), "external 44100 1"); -} - BOOST_AUTO_TEST_CASE (format_test) { Format::setup_formats (); Format const * f = Format::from_nickname ("Flat"); BOOST_CHECK (f); - BOOST_CHECK_EQUAL (f->ratio_as_integer(shared_ptr ()), 185); + BOOST_CHECK_EQUAL (f->dcp_size().width, 1998); + BOOST_CHECK_EQUAL (f->dcp_size().height, 1080); f = Format::from_nickname ("Scope"); BOOST_CHECK (f); - BOOST_CHECK_EQUAL (f->ratio_as_integer(shared_ptr ()), 239); + BOOST_CHECK_EQUAL (f->dcp_size().width, 2048); + BOOST_CHECK_EQUAL (f->dcp_size().height, 858); } BOOST_AUTO_TEST_CASE (util_test) @@ -272,101 +271,6 @@ public: void do_log (string) {} }; -void -do_positive_delay_line_test (int delay_length, int data_length) -{ - NullLog log; - - DelayLine d (&log, 6, delay_length); - shared_ptr data (new AudioBuffers (6, data_length)); - - int in = 0; - int out = 0; - int returned = 0; - int zeros = 0; - - for (int i = 0; i < 64; ++i) { - for (int j = 0; j < data_length; ++j) { - for (int c = 0; c < 6; ++c ) { - data->data(c)[j] = in; - ++in; - } - } - - /* This only works because the delay line modifies the parameter */ - d.process_audio (data); - returned += data->frames (); - - for (int j = 0; j < data->frames(); ++j) { - if (zeros < delay_length) { - for (int c = 0; c < 6; ++c) { - BOOST_CHECK_EQUAL (data->data(c)[j], 0); - } - ++zeros; - } else { - for (int c = 0; c < 6; ++c) { - BOOST_CHECK_EQUAL (data->data(c)[j], out); - ++out; - } - } - } - } - - BOOST_CHECK_EQUAL (returned, 64 * data_length); -} - -void -do_negative_delay_line_test (int delay_length, int data_length) -{ - NullLog log; - - DelayLine d (&log, 6, delay_length); - shared_ptr data (new AudioBuffers (6, data_length)); - - int in = 0; - int out = -delay_length * 6; - int returned = 0; - - for (int i = 0; i < 256; ++i) { - data->set_frames (data_length); - for (int j = 0; j < data_length; ++j) { - for (int c = 0; c < 6; ++c) { - data->data(c)[j] = in; - ++in; - } - } - - /* This only works because the delay line modifies the parameter */ - d.process_audio (data); - returned += data->frames (); - - for (int j = 0; j < data->frames(); ++j) { - for (int c = 0; c < 6; ++c) { - BOOST_CHECK_EQUAL (data->data(c)[j], out); - ++out; - } - } - } - - returned += -delay_length; - BOOST_CHECK_EQUAL (returned, 256 * data_length); -} - -BOOST_AUTO_TEST_CASE (delay_line_test) -{ - do_positive_delay_line_test (64, 128); - do_positive_delay_line_test (128, 64); - do_positive_delay_line_test (3, 512); - do_positive_delay_line_test (512, 3); - - do_positive_delay_line_test (0, 64); - - do_negative_delay_line_test (-64, 128); - do_negative_delay_line_test (-128, 64); - do_negative_delay_line_test (-3, 512); - do_negative_delay_line_test (-512, 3); -} - BOOST_AUTO_TEST_CASE (md5_digest_test) { string const t = md5_digest ("test/md5.test"); @@ -375,17 +279,6 @@ BOOST_AUTO_TEST_CASE (md5_digest_test) BOOST_CHECK_THROW (md5_digest ("foobar"), OpenFileError); } -BOOST_AUTO_TEST_CASE (paths_test) -{ - shared_ptr f = new_test_film ("paths_test"); - f->set_directory ("build/test/a/b/c/d/e"); - - f->_content = "/foo/bar/baz"; - BOOST_CHECK_EQUAL (f->content_path(), "/foo/bar/baz"); - f->_content = "foo/bar/baz"; - BOOST_CHECK_EQUAL (f->content_path(), "build/test/a/b/c/d/e/foo/bar/baz"); -} - void do_remote_encode (shared_ptr frame, ServerDescription* description, shared_ptr locally_encoded) { @@ -427,7 +320,7 @@ BOOST_AUTO_TEST_CASE (client_server_test) shared_ptr subtitle (new Subtitle (Position (50, 60), sub_image)); - FileLog log ("build/test/client_server_test.log"); + shared_ptr log (new FileLog ("build/test/client_server_test.log")); shared_ptr frame ( new DCPVideoFrame ( @@ -443,19 +336,19 @@ BOOST_AUTO_TEST_CASE (client_server_test) "", 0, 200000000, - &log + log ) ); shared_ptr locally_encoded = frame->encode_locally (); BOOST_ASSERT (locally_encoded); - Server* server = new Server (&log); + Server* server = new Server (log); new thread (boost::bind (&Server::run, server, 2)); /* Let the server get itself ready */ - dvdomatic_sleep (1); + dcpomatic_sleep (1); ServerDescription description ("localhost", 2); @@ -477,14 +370,14 @@ BOOST_AUTO_TEST_CASE (make_dcp_test) { shared_ptr film = new_test_film ("make_dcp_test"); film->set_name ("test_film2"); - film->set_content ("../../../test/test.mp4"); +// film->set_content ("../../../test/test.mp4"); film->set_format (Format::from_nickname ("Flat")); film->set_dcp_content_type (DCPContentType::from_pretty_name ("Test")); - film->make_dcp (true); + film->make_dcp (); film->write_metadata (); while (JobManager::instance()->work_to_do ()) { - dvdomatic_sleep (1); + dcpomatic_sleep (1); } BOOST_CHECK_EQUAL (JobManager::instance()->errors(), false); @@ -498,7 +391,7 @@ BOOST_AUTO_TEST_CASE (have_dcp_test) BOOST_CHECK (f.have_dcp()); p /= f.dcp_name(); - p /= "video.mxf"; + p /= f.dcp_video_mxf_filename(); boost::filesystem::remove (p); BOOST_CHECK (!f.have_dcp ()); } @@ -507,22 +400,22 @@ BOOST_AUTO_TEST_CASE (make_dcp_with_range_test) { shared_ptr film = new_test_film ("make_dcp_with_range_test"); film->set_name ("test_film3"); - film->set_content ("../../../test/test.mp4"); - film->examine_content (); +// film->set_content ("../../../test/test.mp4"); +// film->examine_content (); film->set_format (Format::from_nickname ("Flat")); film->set_dcp_content_type (DCPContentType::from_pretty_name ("Test")); film->set_trim_end (42); - film->make_dcp (true); + film->make_dcp (); while (JobManager::instance()->work_to_do() && !JobManager::instance()->errors()) { - dvdomatic_sleep (1); + dcpomatic_sleep (1); } BOOST_CHECK_EQUAL (JobManager::instance()->errors(), false); } -/* Test the constructor of DCPFrameRate */ -BOOST_AUTO_TEST_CASE (dcp_frame_rate_test) +/* Test best_dcp_frame_rate and FrameRateConversion */ +BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test) { /* Run some tests with a limited range of allowed rates */ @@ -532,71 +425,82 @@ BOOST_AUTO_TEST_CASE (dcp_frame_rate_test) afr.push_back (30); Config::instance()->set_allowed_dcp_frame_rates (afr); - DCPFrameRate dfr = DCPFrameRate (60); - BOOST_CHECK_EQUAL (dfr.frames_per_second, 30); - BOOST_CHECK_EQUAL (dfr.skip, true); - BOOST_CHECK_EQUAL (dfr.repeat, false); - BOOST_CHECK_EQUAL (dfr.change_speed, false); + int best = best_dcp_frame_rate (60); + FrameRateConversion frc = FrameRateConversion (60, best); + BOOST_CHECK_EQUAL (best, 30); + BOOST_CHECK_EQUAL (frc.skip, true); + BOOST_CHECK_EQUAL (frc.repeat, false); + BOOST_CHECK_EQUAL (frc.change_speed, false); - dfr = DCPFrameRate (50); - BOOST_CHECK_EQUAL (dfr.frames_per_second, 25); - BOOST_CHECK_EQUAL (dfr.skip, true); - BOOST_CHECK_EQUAL (dfr.repeat, false); - BOOST_CHECK_EQUAL (dfr.change_speed, false); - - dfr = DCPFrameRate (48); - BOOST_CHECK_EQUAL (dfr.frames_per_second, 24); - BOOST_CHECK_EQUAL (dfr.skip, true); - BOOST_CHECK_EQUAL (dfr.repeat, false); - BOOST_CHECK_EQUAL (dfr.change_speed, false); + best = best_dcp_frame_rate (50); + frc = FrameRateConversion (50, best); + BOOST_CHECK_EQUAL (best, 25); + BOOST_CHECK_EQUAL (frc.skip, true); + BOOST_CHECK_EQUAL (frc.repeat, false); + BOOST_CHECK_EQUAL (frc.change_speed, false); + + best = best_dcp_frame_rate (48); + frc = FrameRateConversion (48, best); + BOOST_CHECK_EQUAL (best, 24); + BOOST_CHECK_EQUAL (frc.skip, true); + BOOST_CHECK_EQUAL (frc.repeat, false); + BOOST_CHECK_EQUAL (frc.change_speed, false); - dfr = DCPFrameRate (30); - BOOST_CHECK_EQUAL (dfr.skip, false); - BOOST_CHECK_EQUAL (dfr.frames_per_second, 30); - BOOST_CHECK_EQUAL (dfr.repeat, false); - BOOST_CHECK_EQUAL (dfr.change_speed, false); - - dfr = DCPFrameRate (29.97); - BOOST_CHECK_EQUAL (dfr.skip, false); - BOOST_CHECK_EQUAL (dfr.frames_per_second, 30); - BOOST_CHECK_EQUAL (dfr.repeat, false); - BOOST_CHECK_EQUAL (dfr.change_speed, true); + best = best_dcp_frame_rate (30); + frc = FrameRateConversion (30, best); + BOOST_CHECK_EQUAL (best, 30); + BOOST_CHECK_EQUAL (frc.skip, false); + BOOST_CHECK_EQUAL (frc.repeat, false); + BOOST_CHECK_EQUAL (frc.change_speed, false); + + best = best_dcp_frame_rate (29.97); + frc = FrameRateConversion (29.97, best); + BOOST_CHECK_EQUAL (best, 30); + BOOST_CHECK_EQUAL (frc.skip, false); + BOOST_CHECK_EQUAL (frc.repeat, false); + BOOST_CHECK_EQUAL (frc.change_speed, true); - dfr = DCPFrameRate (25); - BOOST_CHECK_EQUAL (dfr.skip, false); - BOOST_CHECK_EQUAL (dfr.frames_per_second, 25); - BOOST_CHECK_EQUAL (dfr.repeat, false); - BOOST_CHECK_EQUAL (dfr.change_speed, false); - - dfr = DCPFrameRate (24); - BOOST_CHECK_EQUAL (dfr.skip, false); - BOOST_CHECK_EQUAL (dfr.frames_per_second, 24); - BOOST_CHECK_EQUAL (dfr.repeat, false); - BOOST_CHECK_EQUAL (dfr.change_speed, false); - - dfr = DCPFrameRate (14.5); - BOOST_CHECK_EQUAL (dfr.skip, false); - BOOST_CHECK_EQUAL (dfr.frames_per_second, 30); - BOOST_CHECK_EQUAL (dfr.repeat, true); - BOOST_CHECK_EQUAL (dfr.change_speed, true); - - dfr = DCPFrameRate (12.6); - BOOST_CHECK_EQUAL (dfr.skip, false); - BOOST_CHECK_EQUAL (dfr.frames_per_second, 25); - BOOST_CHECK_EQUAL (dfr.repeat, true); - BOOST_CHECK_EQUAL (dfr.change_speed, true); - - dfr = DCPFrameRate (12.4); - BOOST_CHECK_EQUAL (dfr.skip, false); - BOOST_CHECK_EQUAL (dfr.frames_per_second, 25); - BOOST_CHECK_EQUAL (dfr.repeat, true); - BOOST_CHECK_EQUAL (dfr.change_speed, true); - - dfr = DCPFrameRate (12); - BOOST_CHECK_EQUAL (dfr.skip, false); - BOOST_CHECK_EQUAL (dfr.frames_per_second, 24); - BOOST_CHECK_EQUAL (dfr.repeat, true); - BOOST_CHECK_EQUAL (dfr.change_speed, false); + best = best_dcp_frame_rate (25); + frc = FrameRateConversion (25, best); + BOOST_CHECK_EQUAL (best, 25); + BOOST_CHECK_EQUAL (frc.skip, false); + BOOST_CHECK_EQUAL (frc.repeat, false); + BOOST_CHECK_EQUAL (frc.change_speed, false); + + best = best_dcp_frame_rate (24); + frc = FrameRateConversion (24, best); + BOOST_CHECK_EQUAL (best, 24); + BOOST_CHECK_EQUAL (frc.skip, false); + BOOST_CHECK_EQUAL (frc.repeat, false); + BOOST_CHECK_EQUAL (frc.change_speed, false); + + best = best_dcp_frame_rate (14.5); + frc = FrameRateConversion (14.5, best); + BOOST_CHECK_EQUAL (best, 30); + BOOST_CHECK_EQUAL (frc.skip, false); + BOOST_CHECK_EQUAL (frc.repeat, true); + BOOST_CHECK_EQUAL (frc.change_speed, true); + + best = best_dcp_frame_rate (12.6); + frc = FrameRateConversion (12.6, best); + BOOST_CHECK_EQUAL (best, 25); + BOOST_CHECK_EQUAL (frc.skip, false); + BOOST_CHECK_EQUAL (frc.repeat, true); + BOOST_CHECK_EQUAL (frc.change_speed, true); + + best = best_dcp_frame_rate (12.4); + frc = FrameRateConversion (12.4, best); + BOOST_CHECK_EQUAL (best, 25); + BOOST_CHECK_EQUAL (frc.skip, false); + BOOST_CHECK_EQUAL (frc.repeat, true); + BOOST_CHECK_EQUAL (frc.change_speed, true); + + best = best_dcp_frame_rate (12); + frc = FrameRateConversion (12, best); + BOOST_CHECK_EQUAL (best, 24); + BOOST_CHECK_EQUAL (frc.skip, false); + BOOST_CHECK_EQUAL (frc.repeat, true); + BOOST_CHECK_EQUAL (frc.change_speed, false); /* Now add some more rates and see if it will use them in preference to skip/repeat. @@ -607,53 +511,106 @@ BOOST_AUTO_TEST_CASE (dcp_frame_rate_test) afr.push_back (60); Config::instance()->set_allowed_dcp_frame_rates (afr); - dfr = DCPFrameRate (60); - BOOST_CHECK_EQUAL (dfr.frames_per_second, 60); - BOOST_CHECK_EQUAL (dfr.skip, false); - BOOST_CHECK_EQUAL (dfr.repeat, false); - BOOST_CHECK_EQUAL (dfr.change_speed, false); + best = best_dcp_frame_rate (60); + frc = FrameRateConversion (60, best); + BOOST_CHECK_EQUAL (best, 60); + BOOST_CHECK_EQUAL (frc.skip, false); + BOOST_CHECK_EQUAL (frc.repeat, false); + BOOST_CHECK_EQUAL (frc.change_speed, false); + + best = best_dcp_frame_rate (50); + frc = FrameRateConversion (50, best); + BOOST_CHECK_EQUAL (best, 50); + BOOST_CHECK_EQUAL (frc.skip, false); + BOOST_CHECK_EQUAL (frc.repeat, false); + BOOST_CHECK_EQUAL (frc.change_speed, false); + + best = best_dcp_frame_rate (48); + frc = FrameRateConversion (48, best); + BOOST_CHECK_EQUAL (best, 48); + BOOST_CHECK_EQUAL (frc.skip, false); + BOOST_CHECK_EQUAL (frc.repeat, false); + BOOST_CHECK_EQUAL (frc.change_speed, false); + + /* Check some out-there conversions (not the best) */ - dfr = DCPFrameRate (50); - BOOST_CHECK_EQUAL (dfr.frames_per_second, 50); - BOOST_CHECK_EQUAL (dfr.skip, false); - BOOST_CHECK_EQUAL (dfr.repeat, false); - BOOST_CHECK_EQUAL (dfr.change_speed, false); - - dfr = DCPFrameRate (48); - BOOST_CHECK_EQUAL (dfr.frames_per_second, 48); - BOOST_CHECK_EQUAL (dfr.skip, false); - BOOST_CHECK_EQUAL (dfr.repeat, false); - BOOST_CHECK_EQUAL (dfr.change_speed, false); + frc = FrameRateConversion (14.99, 24); + BOOST_CHECK_EQUAL (frc.skip, false); + BOOST_CHECK_EQUAL (frc.repeat, true); + BOOST_CHECK_EQUAL (frc.change_speed, true); + + /* Check some conversions with limited DCP targets */ + + afr.clear (); + afr.push_back (24); + Config::instance()->set_allowed_dcp_frame_rates (afr); + + best = best_dcp_frame_rate (25); + frc = FrameRateConversion (25, best); + BOOST_CHECK_EQUAL (best, 24); + BOOST_CHECK_EQUAL (frc.skip, false); + BOOST_CHECK_EQUAL (frc.repeat, false); + BOOST_CHECK_EQUAL (frc.change_speed, true); } BOOST_AUTO_TEST_CASE (audio_sampling_rate_test) { + std::list afr; + afr.push_back (24); + afr.push_back (25); + afr.push_back (30); + Config::instance()->set_allowed_dcp_frame_rates (afr); + shared_ptr f = new_test_film ("audio_sampling_rate_test"); - f->set_frames_per_second (24); +// f->set_source_frame_rate (24); + f->set_dcp_frame_rate (24); - f->set_content_audio_stream (shared_ptr (new FFmpegAudioStream ("a", 42, 48000, 0))); +// f->set_content_audio_stream (shared_ptr (new FFmpegAudioStream ("a", 42, 48000, 0))); BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 48000); - f->set_content_audio_stream (shared_ptr (new FFmpegAudioStream ("a", 42, 44100, 0))); +// f->set_content_audio_stream (shared_ptr (new FFmpegAudioStream ("a", 42, 44100, 0))); BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 48000); - f->set_content_audio_stream (shared_ptr (new FFmpegAudioStream ("a", 42, 80000, 0))); +// f->set_content_audio_stream (shared_ptr (new FFmpegAudioStream ("a", 42, 80000, 0))); BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 96000); - f->set_frames_per_second (23.976); - f->set_content_audio_stream (shared_ptr (new FFmpegAudioStream ("a", 42, 48000, 0))); +// f->set_source_frame_rate (23.976); + f->set_dcp_frame_rate (best_dcp_frame_rate (23.976)); +// f->set_content_audio_stream (shared_ptr (new FFmpegAudioStream ("a", 42, 48000, 0))); BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 47952); - f->set_frames_per_second (29.97); - f->set_content_audio_stream (shared_ptr (new FFmpegAudioStream ("a", 42, 48000, 0))); +// f->set_source_frame_rate (29.97); + f->set_dcp_frame_rate (best_dcp_frame_rate (29.97)); + BOOST_CHECK_EQUAL (f->dcp_frame_rate (), 30); +// f->set_content_audio_stream (shared_ptr (new FFmpegAudioStream ("a", 42, 48000, 0))); BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 47952); + +// f->set_source_frame_rate (25); + f->set_dcp_frame_rate (24); +// f->set_content_audio_stream (shared_ptr (new FFmpegAudioStream ("a", 42, 48000, 0))); + BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 50000); + +// f->set_source_frame_rate (25); + f->set_dcp_frame_rate (24); +// f->set_content_audio_stream (shared_ptr (new FFmpegAudioStream ("a", 42, 44100, 0))); + BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 50000); + + /* Check some out-there conversions (not the best) */ + +// f->set_source_frame_rate (14.99); + f->set_dcp_frame_rate (25); +// f->set_content_audio_stream (shared_ptr (new FFmpegAudioStream ("a", 42, 16000, 0))); + /* The FrameRateConversion within target_audio_sample_rate should choose to double-up + the 14.99 fps video to 30 and then run it slow at 25. + */ + BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), rint (48000 * 2 * 14.99 / 25)); } class TestJob : public Job { public: - TestJob (shared_ptr f, shared_ptr req) - : Job (f, req) + TestJob (shared_ptr f) + : Job (f) { } @@ -684,46 +641,15 @@ BOOST_AUTO_TEST_CASE (job_manager_test) { shared_ptr f; - /* Single job, no dependency */ - shared_ptr a (new TestJob (f, shared_ptr ())); + /* Single job */ + shared_ptr a (new TestJob (f)); JobManager::instance()->add (a); - dvdomatic_sleep (1); + dcpomatic_sleep (1); BOOST_CHECK_EQUAL (a->running (), true); a->set_finished_ok (); - dvdomatic_sleep (2); - BOOST_CHECK_EQUAL (a->finished_ok(), true); - - /* Two jobs, dependency */ - a.reset (new TestJob (f, shared_ptr ())); - shared_ptr b (new TestJob (f, a)); - - JobManager::instance()->add (a); - JobManager::instance()->add (b); - dvdomatic_sleep (2); - BOOST_CHECK_EQUAL (a->running(), true); - BOOST_CHECK_EQUAL (b->running(), false); - a->set_finished_ok (); - dvdomatic_sleep (2); + dcpomatic_sleep (2); BOOST_CHECK_EQUAL (a->finished_ok(), true); - BOOST_CHECK_EQUAL (b->running(), true); - b->set_finished_ok (); - dvdomatic_sleep (2); - BOOST_CHECK_EQUAL (b->finished_ok(), true); - - /* Two jobs, dependency, first fails */ - a.reset (new TestJob (f, shared_ptr ())); - b.reset (new TestJob (f, a)); - - JobManager::instance()->add (a); - JobManager::instance()->add (b); - dvdomatic_sleep (2); - BOOST_CHECK_EQUAL (a->running(), true); - BOOST_CHECK_EQUAL (b->running(), false); - a->set_finished_error (); - dvdomatic_sleep (2); - BOOST_CHECK_EQUAL (a->finished_in_error(), true); - BOOST_CHECK_EQUAL (b->running(), false); } BOOST_AUTO_TEST_CASE (compact_image_test) @@ -824,3 +750,4 @@ BOOST_AUTO_TEST_CASE (aligned_image_test) delete t; delete u; } +