Merge master and multifarious hackery.
[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 #if 0   
24         /* Run some tests with a limited range of allowed rates */
25         
26         std::list<int> afr;
27         afr.push_back (24);
28         afr.push_back (25);
29         afr.push_back (30);
30         Config::instance()->set_allowed_dcp_frame_rates (afr);
31
32         int best = best_dcp_frame_rate (60);
33         FrameRateConversion frc = FrameRateConversion (60, best);
34         BOOST_CHECK_EQUAL (best, 30);
35         BOOST_CHECK_EQUAL (frc.skip, true);
36         BOOST_CHECK_EQUAL (frc.repeat, false);
37         BOOST_CHECK_EQUAL (frc.change_speed, false);
38         
39         best = best_dcp_frame_rate (50);
40         frc = FrameRateConversion (50, best);
41         BOOST_CHECK_EQUAL (best, 25);
42         BOOST_CHECK_EQUAL (frc.skip, true);
43         BOOST_CHECK_EQUAL (frc.repeat, false);
44         BOOST_CHECK_EQUAL (frc.change_speed, false);
45
46         best = best_dcp_frame_rate (48);
47         frc = FrameRateConversion (48, best);
48         BOOST_CHECK_EQUAL (best, 24);
49         BOOST_CHECK_EQUAL (frc.skip, true);
50         BOOST_CHECK_EQUAL (frc.repeat, false);
51         BOOST_CHECK_EQUAL (frc.change_speed, false);
52         
53         best = best_dcp_frame_rate (30);
54         frc = FrameRateConversion (30, best);
55         BOOST_CHECK_EQUAL (best, 30);
56         BOOST_CHECK_EQUAL (frc.skip, false);
57         BOOST_CHECK_EQUAL (frc.repeat, false);
58         BOOST_CHECK_EQUAL (frc.change_speed, false);
59
60         best = best_dcp_frame_rate (29.97);
61         frc = FrameRateConversion (29.97, best);
62         BOOST_CHECK_EQUAL (best, 30);
63         BOOST_CHECK_EQUAL (frc.skip, false);
64         BOOST_CHECK_EQUAL (frc.repeat, false);
65         BOOST_CHECK_EQUAL (frc.change_speed, true);
66         
67         best = best_dcp_frame_rate (25);
68         frc = FrameRateConversion (25, best);
69         BOOST_CHECK_EQUAL (best, 25);
70         BOOST_CHECK_EQUAL (frc.skip, false);
71         BOOST_CHECK_EQUAL (frc.repeat, false);
72         BOOST_CHECK_EQUAL (frc.change_speed, false);
73
74         best = best_dcp_frame_rate (24);
75         frc = FrameRateConversion (24, best);
76         BOOST_CHECK_EQUAL (best, 24);
77         BOOST_CHECK_EQUAL (frc.skip, false);
78         BOOST_CHECK_EQUAL (frc.repeat, false);
79         BOOST_CHECK_EQUAL (frc.change_speed, false);
80
81         best = best_dcp_frame_rate (14.5);
82         frc = FrameRateConversion (14.5, best);
83         BOOST_CHECK_EQUAL (best, 30);
84         BOOST_CHECK_EQUAL (frc.skip, false);
85         BOOST_CHECK_EQUAL (frc.repeat, true);
86         BOOST_CHECK_EQUAL (frc.change_speed, true);
87
88         best = best_dcp_frame_rate (12.6);
89         frc = FrameRateConversion (12.6, best);
90         BOOST_CHECK_EQUAL (best, 25);
91         BOOST_CHECK_EQUAL (frc.skip, false);
92         BOOST_CHECK_EQUAL (frc.repeat, true);
93         BOOST_CHECK_EQUAL (frc.change_speed, true);
94
95         best = best_dcp_frame_rate (12.4);
96         frc = FrameRateConversion (12.4, best);
97         BOOST_CHECK_EQUAL (best, 25);
98         BOOST_CHECK_EQUAL (frc.skip, false);
99         BOOST_CHECK_EQUAL (frc.repeat, true);
100         BOOST_CHECK_EQUAL (frc.change_speed, true);
101
102         best = best_dcp_frame_rate (12);
103         frc = FrameRateConversion (12, best);
104         BOOST_CHECK_EQUAL (best, 24);
105         BOOST_CHECK_EQUAL (frc.skip, false);
106         BOOST_CHECK_EQUAL (frc.repeat, true);
107         BOOST_CHECK_EQUAL (frc.change_speed, false);
108
109         /* Now add some more rates and see if it will use them
110            in preference to skip/repeat.
111         */
112
113         afr.push_back (48);
114         afr.push_back (50);
115         afr.push_back (60);
116         Config::instance()->set_allowed_dcp_frame_rates (afr);
117
118         best = best_dcp_frame_rate (60);
119         frc = FrameRateConversion (60, best);
120         BOOST_CHECK_EQUAL (best, 60);
121         BOOST_CHECK_EQUAL (frc.skip, false);
122         BOOST_CHECK_EQUAL (frc.repeat, false);
123         BOOST_CHECK_EQUAL (frc.change_speed, false);
124         
125         best = best_dcp_frame_rate (50);
126         frc = FrameRateConversion (50, best);
127         BOOST_CHECK_EQUAL (best, 50);
128         BOOST_CHECK_EQUAL (frc.skip, false);
129         BOOST_CHECK_EQUAL (frc.repeat, false);
130         BOOST_CHECK_EQUAL (frc.change_speed, false);
131
132         best = best_dcp_frame_rate (48);
133         frc = FrameRateConversion (48, best);
134         BOOST_CHECK_EQUAL (best, 48);
135         BOOST_CHECK_EQUAL (frc.skip, false);
136         BOOST_CHECK_EQUAL (frc.repeat, false);
137         BOOST_CHECK_EQUAL (frc.change_speed, false);
138
139         /* Check some out-there conversions (not the best) */
140         
141         frc = FrameRateConversion (14.99, 24);
142         BOOST_CHECK_EQUAL (frc.skip, false);
143         BOOST_CHECK_EQUAL (frc.repeat, true);
144         BOOST_CHECK_EQUAL (frc.change_speed, true);
145
146         /* Check some conversions with limited DCP targets */
147
148         afr.clear ();
149         afr.push_back (24);
150         Config::instance()->set_allowed_dcp_frame_rates (afr);
151
152         best = best_dcp_frame_rate (25);
153         frc = FrameRateConversion (25, best);
154         BOOST_CHECK_EQUAL (best, 24);
155         BOOST_CHECK_EQUAL (frc.skip, false);
156         BOOST_CHECK_EQUAL (frc.repeat, false);
157         BOOST_CHECK_EQUAL (frc.change_speed, true);
158 }
159
160 BOOST_AUTO_TEST_CASE (audio_sampling_rate_test)
161 {
162         std::list<int> afr;
163         afr.push_back (24);
164         afr.push_back (25);
165         afr.push_back (30);
166         Config::instance()->set_allowed_dcp_frame_rates (afr);
167
168         shared_ptr<Film> f = new_test_film ("audio_sampling_rate_test");
169         f->set_source_frame_rate (24);
170         f->set_dcp_frame_rate (24);
171
172         f->set_content_audio_stream (shared_ptr<AudioStream> (new FFmpegAudioStream ("a", 42, 48000, 0)));
173         BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 48000);
174
175         f->set_content_audio_stream (shared_ptr<AudioStream> (new FFmpegAudioStream ("a", 42, 44100, 0)));
176         BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 48000);
177
178         f->set_content_audio_stream (shared_ptr<AudioStream> (new FFmpegAudioStream ("a", 42, 80000, 0)));
179         BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 96000);
180
181         f->set_source_frame_rate (23.976);
182         f->set_dcp_frame_rate (best_dcp_frame_rate (23.976));
183         f->set_content_audio_stream (shared_ptr<AudioStream> (new FFmpegAudioStream ("a", 42, 48000, 0)));
184         BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 47952);
185
186         f->set_source_frame_rate (29.97);
187         f->set_dcp_frame_rate (best_dcp_frame_rate (29.97));
188         BOOST_CHECK_EQUAL (f->dcp_frame_rate (), 30);
189         f->set_content_audio_stream (shared_ptr<AudioStream> (new FFmpegAudioStream ("a", 42, 48000, 0)));
190         BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 47952);
191
192         f->set_source_frame_rate (25);
193         f->set_dcp_frame_rate (24);
194         f->set_content_audio_stream (shared_ptr<AudioStream> (new FFmpegAudioStream ("a", 42, 48000, 0)));
195         BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 50000);
196
197         f->set_source_frame_rate (25);
198         f->set_dcp_frame_rate (24);
199         f->set_content_audio_stream (shared_ptr<AudioStream> (new FFmpegAudioStream ("a", 42, 44100, 0)));
200         BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), 50000);
201
202         /* Check some out-there conversions (not the best) */
203         
204         f->set_source_frame_rate (14.99);
205         f->set_dcp_frame_rate (25);
206         f->set_content_audio_stream (shared_ptr<AudioStream> (new FFmpegAudioStream ("a", 42, 16000, 0)));
207         /* The FrameRateConversion within target_audio_sample_rate should choose to double-up
208            the 14.99 fps video to 30 and then run it slow at 25.
209         */
210         BOOST_CHECK_EQUAL (f->target_audio_sample_rate(), rint (48000 * 2 * 14.99 / 25));
211 #endif  
212 }
213