2 Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 /* Test best_dcp_frame_rate and FrameRateConversion */
21 BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test)
23 /* Run some tests with a limited range of allowed rates */
29 Config::instance()->set_allowed_dcp_frame_rates (afr);
31 int best = best_dcp_frame_rate (60);
32 FrameRateConversion frc = FrameRateConversion (60, best);
33 BOOST_CHECK_EQUAL (best, 30);
34 BOOST_CHECK_EQUAL (frc.skip, true);
35 BOOST_CHECK_EQUAL (frc.repeat, false);
36 BOOST_CHECK_EQUAL (frc.change_speed, false);
38 best = best_dcp_frame_rate (50);
39 frc = FrameRateConversion (50, best);
40 BOOST_CHECK_EQUAL (best, 25);
41 BOOST_CHECK_EQUAL (frc.skip, true);
42 BOOST_CHECK_EQUAL (frc.repeat, false);
43 BOOST_CHECK_EQUAL (frc.change_speed, false);
45 best = best_dcp_frame_rate (48);
46 frc = FrameRateConversion (48, best);
47 BOOST_CHECK_EQUAL (best, 24);
48 BOOST_CHECK_EQUAL (frc.skip, true);
49 BOOST_CHECK_EQUAL (frc.repeat, false);
50 BOOST_CHECK_EQUAL (frc.change_speed, false);
52 best = best_dcp_frame_rate (30);
53 frc = FrameRateConversion (30, best);
54 BOOST_CHECK_EQUAL (best, 30);
55 BOOST_CHECK_EQUAL (frc.skip, false);
56 BOOST_CHECK_EQUAL (frc.repeat, false);
57 BOOST_CHECK_EQUAL (frc.change_speed, false);
59 best = best_dcp_frame_rate (29.97);
60 frc = FrameRateConversion (29.97, best);
61 BOOST_CHECK_EQUAL (best, 30);
62 BOOST_CHECK_EQUAL (frc.skip, false);
63 BOOST_CHECK_EQUAL (frc.repeat, false);
64 BOOST_CHECK_EQUAL (frc.change_speed, true);
66 best = best_dcp_frame_rate (25);
67 frc = FrameRateConversion (25, best);
68 BOOST_CHECK_EQUAL (best, 25);
69 BOOST_CHECK_EQUAL (frc.skip, false);
70 BOOST_CHECK_EQUAL (frc.repeat, false);
71 BOOST_CHECK_EQUAL (frc.change_speed, false);
73 best = best_dcp_frame_rate (24);
74 frc = FrameRateConversion (24, best);
75 BOOST_CHECK_EQUAL (best, 24);
76 BOOST_CHECK_EQUAL (frc.skip, false);
77 BOOST_CHECK_EQUAL (frc.repeat, false);
78 BOOST_CHECK_EQUAL (frc.change_speed, false);
80 best = best_dcp_frame_rate (14.5);
81 frc = FrameRateConversion (14.5, best);
82 BOOST_CHECK_EQUAL (best, 30);
83 BOOST_CHECK_EQUAL (frc.skip, false);
84 BOOST_CHECK_EQUAL (frc.repeat, true);
85 BOOST_CHECK_EQUAL (frc.change_speed, true);
87 best = best_dcp_frame_rate (12.6);
88 frc = FrameRateConversion (12.6, best);
89 BOOST_CHECK_EQUAL (best, 25);
90 BOOST_CHECK_EQUAL (frc.skip, false);
91 BOOST_CHECK_EQUAL (frc.repeat, true);
92 BOOST_CHECK_EQUAL (frc.change_speed, true);
94 best = best_dcp_frame_rate (12.4);
95 frc = FrameRateConversion (12.4, best);
96 BOOST_CHECK_EQUAL (best, 25);
97 BOOST_CHECK_EQUAL (frc.skip, false);
98 BOOST_CHECK_EQUAL (frc.repeat, true);
99 BOOST_CHECK_EQUAL (frc.change_speed, true);
101 best = best_dcp_frame_rate (12);
102 frc = FrameRateConversion (12, best);
103 BOOST_CHECK_EQUAL (best, 24);
104 BOOST_CHECK_EQUAL (frc.skip, false);
105 BOOST_CHECK_EQUAL (frc.repeat, true);
106 BOOST_CHECK_EQUAL (frc.change_speed, false);
108 /* Now add some more rates and see if it will use them
109 in preference to skip/repeat.
115 Config::instance()->set_allowed_dcp_frame_rates (afr);
117 best = best_dcp_frame_rate (60);
118 frc = FrameRateConversion (60, best);
119 BOOST_CHECK_EQUAL (best, 60);
120 BOOST_CHECK_EQUAL (frc.skip, false);
121 BOOST_CHECK_EQUAL (frc.repeat, false);
122 BOOST_CHECK_EQUAL (frc.change_speed, false);
124 best = best_dcp_frame_rate (50);
125 frc = FrameRateConversion (50, best);
126 BOOST_CHECK_EQUAL (best, 50);
127 BOOST_CHECK_EQUAL (frc.skip, false);
128 BOOST_CHECK_EQUAL (frc.repeat, false);
129 BOOST_CHECK_EQUAL (frc.change_speed, false);
131 best = best_dcp_frame_rate (48);
132 frc = FrameRateConversion (48, best);
133 BOOST_CHECK_EQUAL (best, 48);
134 BOOST_CHECK_EQUAL (frc.skip, false);
135 BOOST_CHECK_EQUAL (frc.repeat, false);
136 BOOST_CHECK_EQUAL (frc.change_speed, false);
138 /* Check some out-there conversions (not the best) */
140 frc = FrameRateConversion (14.99, 24);
141 BOOST_CHECK_EQUAL (frc.skip, false);
142 BOOST_CHECK_EQUAL (frc.repeat, true);
143 BOOST_CHECK_EQUAL (frc.change_speed, true);
145 /* Check some conversions with limited DCP targets */
149 Config::instance()->set_allowed_dcp_frame_rates (afr);
151 best = best_dcp_frame_rate (25);
152 frc = FrameRateConversion (25, best);
153 BOOST_CHECK_EQUAL (best, 24);
154 BOOST_CHECK_EQUAL (frc.skip, false);
155 BOOST_CHECK_EQUAL (frc.repeat, false);
156 BOOST_CHECK_EQUAL (frc.change_speed, true);
159 BOOST_AUTO_TEST_CASE (audio_sampling_rate_test)
165 Config::instance()->set_allowed_dcp_frame_rates (afr);
167 shared_ptr<Film> f = new_test_film ("audio_sampling_rate_test");
168 f->set_source_frame_rate (24);
169 f->set_dcp_frame_rate (24);
171 f->set_content_audio_stream (shared_ptr<AudioStream> (new FFmpegAudioStream ("a", 42, 48000, 0)));
172 BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 48000);
174 f->set_content_audio_stream (shared_ptr<AudioStream> (new FFmpegAudioStream ("a", 42, 44100, 0)));
175 BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 48000);
177 f->set_content_audio_stream (shared_ptr<AudioStream> (new FFmpegAudioStream ("a", 42, 80000, 0)));
178 BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 96000);
180 f->set_source_frame_rate (23.976);
181 f->set_dcp_frame_rate (best_dcp_frame_rate (23.976));
182 f->set_content_audio_stream (shared_ptr<AudioStream> (new FFmpegAudioStream ("a", 42, 48000, 0)));
183 BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 47952);
185 f->set_source_frame_rate (29.97);
186 f->set_dcp_frame_rate (best_dcp_frame_rate (29.97));
187 BOOST_CHECK_EQUAL (f->dcp_frame_rate (), 30);
188 f->set_content_audio_stream (shared_ptr<AudioStream> (new FFmpegAudioStream ("a", 42, 48000, 0)));
189 BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 47952);
191 f->set_source_frame_rate (25);
192 f->set_dcp_frame_rate (24);
193 f->set_content_audio_stream (shared_ptr<AudioStream> (new FFmpegAudioStream ("a", 42, 48000, 0)));
194 BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 50000);
196 f->set_source_frame_rate (25);
197 f->set_dcp_frame_rate (24);
198 f->set_content_audio_stream (shared_ptr<AudioStream> (new FFmpegAudioStream ("a", 42, 44100, 0)));
199 BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 50000);
201 /* Check some out-there conversions (not the best) */
203 f->set_source_frame_rate (14.99);
204 f->set_dcp_frame_rate (25);
205 f->set_content_audio_stream (shared_ptr<AudioStream> (new FFmpegAudioStream ("a", 42, 16000, 0)));
206 /* The FrameRateConversion within target_audio_sample_rate should choose to double-up
207 the 14.99 fps video to 30 and then run it slow at 25.
209 BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), rint (48000 * 2 * 14.99 / 25));