Merge branch 'master' of ssh://houllier/home/carl/git/dvdomatic
[dcpomatic.git] / test / frame_rate_test.cc
1 /*
2     Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
3
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.
8
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.
13
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.
17
18 */
19
20 /* Test best_dcp_frame_rate and FrameRateConversion */
21 BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test)
22 {
23         /* Run some tests with a limited range of allowed rates */
24         
25         std::list<int> afr;
26         afr.push_back (24);
27         afr.push_back (25);
28         afr.push_back (30);
29         Config::instance()->set_allowed_dcp_frame_rates (afr);
30
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);
37         
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);
44
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);
51         
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);
58
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);
65         
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);
72
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);
79
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);
86
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);
93
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);
100
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);
107
108         /* Now add some more rates and see if it will use them
109            in preference to skip/repeat.
110         */
111
112         afr.push_back (48);
113         afr.push_back (50);
114         afr.push_back (60);
115         Config::instance()->set_allowed_dcp_frame_rates (afr);
116
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);
123         
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);
130
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);
137
138         /* Check some out-there conversions (not the best) */
139         
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);
144
145         /* Check some conversions with limited DCP targets */
146
147         afr.clear ();
148         afr.push_back (24);
149         Config::instance()->set_allowed_dcp_frame_rates (afr);
150
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);
157 }
158
159 BOOST_AUTO_TEST_CASE (audio_sampling_rate_test)
160 {
161         std::list<int> afr;
162         afr.push_back (24);
163         afr.push_back (25);
164         afr.push_back (30);
165         Config::instance()->set_allowed_dcp_frame_rates (afr);
166
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);
170
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);
173
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);
176
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);
179
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);
184
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);
190
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);
195
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);
200
201         /* Check some out-there conversions (not the best) */
202         
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.
208         */
209         BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), rint (48000 * 2 * 14.99 / 25));
210 }
211