Don't use --target-macos-arm64 any more, since it's not supported.
[dcpomatic.git] / test / time_calculation_test.cc
1 /*
2     Copyright (C) 2015-2021 Carl Hetherington <cth@carlh.net>
3
4     This file is part of DCP-o-matic.
5
6     DCP-o-matic is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     DCP-o-matic is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
18
19 */
20
21
22 /** @file  test/time_calculation_test.cc
23  *  @brief Test calculation of timings when frame rates change.
24  *  @ingroup feature
25  */
26
27
28 #include "lib/film.h"
29 #include "lib/ffmpeg_content.h"
30 #include "lib/video_content.h"
31 #include "lib/player.h"
32 #include "lib/audio_content.h"
33 #include "test.h"
34 #include <boost/test/unit_test.hpp>
35
36
37 using std::list;
38 using std::make_shared;
39 using std::string;
40 using namespace dcpomatic;
41
42
43 static string const xml = "<Content>"
44         "<Type>FFmpeg</Type>"
45         "<BurnSubtitles>0</BurnSubtitles>"
46         "<BitsPerPixel>8</BitsPerPixel>"
47         "<Path>test/data/red_24.mp4</Path>"
48         "<Digest>2760e03c7251480f7f02c01a907792673784335</Digest>"
49         "<Position>0</Position>"
50         "<TrimStart>0</TrimStart>"
51         "<TrimEnd>0</TrimEnd>"
52         "<VideoLength>1353600</VideoLength>"
53         "<VideoWidth>1280</VideoWidth>"
54         "<VideoHeight>720</VideoHeight>"
55         "<VideoFrameRate>25</VideoFrameRate>"
56         "<VideoFrameType>2d</VideoFrameType>"
57         "<LeftCrop>0</LeftCrop>"
58         "<RightCrop>0</RightCrop>"
59         "<TopCrop>0</TopCrop>"
60         "<BottomCrop>0</BottomCrop>"
61         "<Scale>"
62         "<Ratio>178</Ratio>"
63         "</Scale>"
64         "<ColourConversion>"
65         "<InputTransferFunction>"
66         "<Type>ModifiedGamma</Type>"
67         "<Power>2.222222222222222</Power>"
68         "<Threshold>0.081</Threshold>"
69         "<A>0.099</A>"
70         "<B>4.5</B>"
71         "</InputTransferFunction>"
72         "<RedX>0.64</RedX>"
73         "<RedY>0.33</RedY>"
74         "<GreenX>0.3</GreenX>"
75         "<GreenY>0.6</GreenY>"
76         "<BlueX>0.15</BlueX>"
77         "<BlueY>0.06</BlueY>"
78         "<WhiteX>0.3127</WhiteX>"
79         "<WhiteY>0.329</WhiteY>"
80         "<OutputGamma>2.6</OutputGamma>"
81         "</ColourConversion>"
82         "<FadeIn>0</FadeIn>"
83         "<FadeOut>0</FadeOut>"
84         "<AudioGain>0</AudioGain>"
85         "<AudioDelay>0</AudioDelay>"
86         "<UseSubtitles>0</UseSubtitles>"
87         "<SubtitleXOffset>0</SubtitleXOffset>"
88         "<SubtitleYOffset>0</SubtitleYOffset>"
89         "<SubtitleXScale>1</SubtitleXScale>"
90         "<SubtitleYScale>1</SubtitleYScale>"
91         "<SubtitleLanguage></SubtitleLanguage>"
92         "<AudioStream>"
93         "<Selected>1</Selected>"
94         "<Name>und; 2 channels</Name>"
95         "<Id>1</Id>"
96         "<FrameRate>44100</FrameRate>"
97         "<Length>44100</Length>"
98         "<Channels>2</Channels>"
99         "<FirstAudio>0</FirstAudio>"
100         "<Mapping>"
101         "<InputChannels>2</InputChannels>"
102         "<OutputChannels>12</OutputChannels>"
103         "<Gain Input=\"0\" Output=\"0\">1</Gain>"
104         "<Gain Input=\"0\" Output=\"1\">0</Gain>"
105         "<Gain Input=\"0\" Output=\"2\">0</Gain>"
106         "<Gain Input=\"0\" Output=\"3\">0</Gain>"
107         "<Gain Input=\"0\" Output=\"4\">0</Gain>"
108         "<Gain Input=\"0\" Output=\"5\">0</Gain>"
109         "<Gain Input=\"0\" Output=\"6\">0</Gain>"
110         "<Gain Input=\"0\" Output=\"7\">0</Gain>"
111         "<Gain Input=\"0\" Output=\"8\">0</Gain>"
112         "<Gain Input=\"0\" Output=\"9\">0</Gain>"
113         "<Gain Input=\"0\" Output=\"10\">0</Gain>"
114         "<Gain Input=\"0\" Output=\"11\">0</Gain>"
115         "<Gain Input=\"1\" Output=\"0\">0</Gain>"
116         "<Gain Input=\"1\" Output=\"1\">1</Gain>"
117         "<Gain Input=\"1\" Output=\"2\">0</Gain>"
118         "<Gain Input=\"1\" Output=\"3\">0</Gain>"
119         "<Gain Input=\"1\" Output=\"4\">0</Gain>"
120         "<Gain Input=\"1\" Output=\"5\">0</Gain>"
121         "<Gain Input=\"1\" Output=\"6\">0</Gain>"
122         "<Gain Input=\"1\" Output=\"7\">0</Gain>"
123         "<Gain Input=\"1\" Output=\"8\">0</Gain>"
124         "<Gain Input=\"1\" Output=\"9\">0</Gain>"
125         "<Gain Input=\"1\" Output=\"10\">0</Gain>"
126         "<Gain Input=\"1\" Output=\"11\">0</Gain>"
127         "</Mapping>"
128         "</AudioStream>"
129         "<FirstVideo>0</FirstVideo>"
130         "</Content>";
131
132
133 BOOST_AUTO_TEST_CASE (ffmpeg_time_calculation_test)
134 {
135         auto film = new_test_film ("ffmpeg_time_calculation_test");
136
137         auto doc = make_shared<cxml::Document>();
138         doc->read_string (xml);
139
140         list<string> notes;
141         auto content = make_shared<FFmpegContent>(doc, film->state_version(), notes);
142
143         /* 25fps content, 25fps DCP */
144         film->set_video_frame_rate (25);
145         BOOST_CHECK_EQUAL (content->full_length(film).get(), DCPTime::from_seconds(content->video->length() / 25.0).get());
146         /* 25fps content, 24fps DCP; length should be increased */
147         film->set_video_frame_rate (24);
148         BOOST_CHECK_EQUAL (content->full_length(film).get(), DCPTime::from_seconds(content->video->length() / 24.0).get());
149         /* 25fps content, 30fps DCP; length should be decreased */
150         film->set_video_frame_rate (30);
151         BOOST_CHECK_EQUAL (content->full_length(film).get(), DCPTime::from_seconds(content->video->length() / 30.0).get());
152         /* 25fps content, 50fps DCP; length should be the same */
153         film->set_video_frame_rate (50);
154         BOOST_CHECK_EQUAL (content->full_length(film).get(), DCPTime::from_seconds(content->video->length() / 25.0).get());
155         /* 25fps content, 60fps DCP; length should be decreased */
156         film->set_video_frame_rate (60);
157         BOOST_CHECK_EQUAL (content->full_length(film).get(), DCPTime::from_seconds(content->video->length() * (50.0 / 60) / 25.0).get());
158
159         /* Make the content audio-only */
160         content->video.reset ();
161
162         /* 24fps content, 24fps DCP */
163         film->set_video_frame_rate (24);
164         content->set_video_frame_rate(film, 24);
165         BOOST_CHECK_EQUAL (content->full_length(film).get(), DCPTime::from_seconds(1).get());
166         /* 25fps content, 25fps DCP */
167         film->set_video_frame_rate (25);
168         content->set_video_frame_rate(film, 25);
169         BOOST_CHECK_EQUAL (content->full_length(film).get(), DCPTime::from_seconds(1).get());
170         /* 25fps content, 24fps DCP; length should be increased */
171         film->set_video_frame_rate (24);
172         BOOST_CHECK_SMALL (labs (content->full_length(film).get() - DCPTime::from_seconds(25.0 / 24).get()), 2L);
173         /* 25fps content, 30fps DCP; length should be decreased */
174         film->set_video_frame_rate (30);
175         BOOST_CHECK_EQUAL (content->full_length(film).get(), DCPTime::from_seconds(25.0 / 30).get());
176         /* 25fps content, 50fps DCP; length should be the same */
177         film->set_video_frame_rate (50);
178         BOOST_CHECK_EQUAL (content->full_length(film).get(), DCPTime::from_seconds(1).get());
179         /* 25fps content, 60fps DCP; length should be decreased */
180         film->set_video_frame_rate (60);
181         BOOST_CHECK_EQUAL (content->full_length(film).get(), DCPTime::from_seconds(50.0 / 60).get());
182
183 }
184
185
186 /** Test Player::dcp_to_content_video */
187 BOOST_AUTO_TEST_CASE (player_time_calculation_test1)
188 {
189         auto film = new_test_film ("player_time_calculation_test1");
190
191         auto doc = make_shared<cxml::Document>();
192         doc->read_string (xml);
193
194         list<string> notes;
195         auto content = make_shared<FFmpegContent>(doc, film->state_version(), notes);
196         film->set_sequence (false);
197         film->add_content (content);
198
199         auto player = make_shared<Player>(film, Image::Alignment::COMPACT);
200
201         /* Position 0, no trim, content rate = DCP rate */
202         content->set_position (film, DCPTime());
203         content->set_trim_start(film, ContentTime());
204         content->set_video_frame_rate(film, 24);
205         film->set_video_frame_rate (24);
206         player->setup_pieces ();
207         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
208         auto piece = player->_pieces.front();
209         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime ()), 0);
210         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (0.5)), 12);
211         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (3.0)), 72);
212
213         /* Position 3s, no trim, content rate = DCP rate */
214         content->set_position (film, DCPTime::from_seconds(3));
215         content->set_trim_start(film, ContentTime());
216         content->set_video_frame_rate(film, 24);
217         film->set_video_frame_rate (24);
218         player->setup_pieces ();
219         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
220         piece = player->_pieces.front ();
221         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime ()), 0);
222         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (0.50)),   0);
223         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (3.00)),   0);
224         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (4.50)),  36);
225         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (9.75)), 162);
226
227         /* Position 3s, 1.5s trim, content rate = DCP rate */
228         content->set_position (film, DCPTime::from_seconds(3));
229         content->set_trim_start(film, ContentTime::from_seconds(1.5));
230         content->set_video_frame_rate(film, 24);
231         film->set_video_frame_rate (24);
232         player->setup_pieces ();
233         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
234         piece = player->_pieces.front ();
235         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime ()), 0);
236         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (0.50)),   0);
237         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (3.00)),  36);
238         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (4.50)),  72);
239         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (9.75)), 198);
240
241         /* Position 0, no trim, content rate 24, DCP rate 25.
242            Now, for example, a DCPTime position of 3s means 3s at 25fps.  Since we run the video
243            fast (at 25fps) in this case, this means 75 frames of content video will be used.
244         */
245         content->set_position (film, DCPTime());
246         content->set_trim_start(film, ContentTime());
247         content->set_video_frame_rate(film, 24);
248         film->set_video_frame_rate (25);
249         player->setup_pieces ();
250         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
251         piece = player->_pieces.front ();
252         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime ()), 0);
253         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (0.6)), 15);
254         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (3.0)), 75);
255
256         /* Position 3s, no trim, content rate 24, DCP rate 25 */
257         content->set_position (film, DCPTime::from_seconds(3));
258         content->set_trim_start(film, ContentTime());
259         content->set_video_frame_rate(film, 24);
260         film->set_video_frame_rate (25);
261         player->setup_pieces ();
262         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
263         piece = player->_pieces.front ();
264         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime ()), 0);
265         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (0.60)),   0);
266         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (3.00)),   0);
267         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (4.60)),  40);
268         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (9.75)), 168);
269
270         /* Position 3s, 1.6s trim, content rate 24, DCP rate 25.  Here the trim is in ContentTime,
271            so it's 1.6s at 24fps.  Note that trims are rounded to the nearest video frame, so
272            some of these results are not quite what you'd perhaps expect.
273          */
274         content->set_position (film, DCPTime::from_seconds(3));
275         content->set_trim_start(film, ContentTime::from_seconds(1.6));
276         content->set_video_frame_rate(film, 24);
277         film->set_video_frame_rate (25);
278         player->setup_pieces ();
279         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
280         piece = player->_pieces.front ();
281         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime ()), 0);
282         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (0.60)),   0);
283         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (3.00)),  38);
284         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (4.60)),  78);
285         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (9.75)), 206);
286
287         /* Position 0, no trim, content rate 24, DCP rate 48
288            Now, for example, a DCPTime position of 3s means 3s at 48fps.  Since we run the video
289            with repeated frames in this case, 3 * 24 frames of content video will
290            be used to make 3 * 48 frames of DCP video.  The results should be the same as the
291            content rate = DCP rate case.
292         */
293         content->set_position (film, DCPTime());
294         content->set_trim_start(film, ContentTime());
295         content->set_video_frame_rate(film, 24);
296         film->set_video_frame_rate (48);
297         player->setup_pieces ();
298         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
299         piece = player->_pieces.front ();
300         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime ()), 0);
301         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (0.5)), 12);
302         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (3.0)), 72);
303
304         /* Position 3s, no trim, content rate 24, DCP rate 48 */
305         content->set_position (film, DCPTime::from_seconds(3));
306         content->set_trim_start(film, ContentTime());
307         content->set_video_frame_rate(film, 24);
308         film->set_video_frame_rate (48);
309         player->setup_pieces ();
310         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
311         piece = player->_pieces.front ();
312         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime ()), 0);
313         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (0.50)),   0);
314         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (3.00)),   0);
315         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (4.50)),  36);
316         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (9.75)), 162);
317
318         /* Position 3s, 1.5s trim, content rate 24, DCP rate 48 */
319         content->set_position (film, DCPTime::from_seconds(3));
320         content->set_trim_start(film, ContentTime::from_seconds(1.5));
321         content->set_video_frame_rate(film, 24);
322         film->set_video_frame_rate (48);
323         player->setup_pieces ();
324         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
325         piece = player->_pieces.front ();
326         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime ()), 0);
327         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (0.50)),   0);
328         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (3.00)),  36);
329         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (4.50)),  72);
330         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (9.75)), 198);
331
332         /* Position 0, no trim, content rate 48, DCP rate 24
333            Now, for example, a DCPTime position of 3s means 3s at 24fps.  Since we run the video
334            with skipped frames in this case, 3 * 48 frames of content video will
335            be used to make 3 * 24 frames of DCP video.
336         */
337         content->set_position (film, DCPTime());
338         content->set_trim_start(film, ContentTime());
339         content->set_video_frame_rate(film, 48);
340         film->set_video_frame_rate (24);
341         player->setup_pieces ();
342         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
343         piece = player->_pieces.front ();
344         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime ()), 0);
345         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (0.5)), 24);
346         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (3.0)), 144);
347
348         /* Position 3s, no trim, content rate 24, DCP rate 48 */
349         content->set_position (film, DCPTime::from_seconds(3));
350         content->set_trim_start(film, ContentTime());
351         content->set_video_frame_rate(film, 48);
352         film->set_video_frame_rate (24);
353         player->setup_pieces ();
354         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
355         piece = player->_pieces.front ();
356         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime ()), 0);
357         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (0.50)),   0);
358         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (3.00)),   0);
359         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (4.50)),  72);
360         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (9.75)), 324);
361
362         /* Position 3s, 1.5s trim, content rate 24, DCP rate 48 */
363         content->set_position (film, DCPTime::from_seconds(3));
364         content->set_trim_start(film, ContentTime::from_seconds(1.5));
365         content->set_video_frame_rate(film, 48);
366         film->set_video_frame_rate (24);
367         player->setup_pieces ();
368         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
369         piece = player->_pieces.front ();
370         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime ()), 0);
371         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (0.50)),   0);
372         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (3.00)),  72);
373         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (4.50)), 144);
374         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime::from_seconds (9.75)), 396);
375
376         /* Position 0s, no trim, content rate 29.9978733, DCP rate 30 */
377         content->set_position (film, DCPTime::from_seconds(0));
378         content->set_trim_start(film, ContentTime::from_seconds (0));
379         content->set_video_frame_rate(film, 29.9978733);
380         film->set_video_frame_rate (30);
381         player->setup_pieces ();
382         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
383         piece = player->_pieces.front ();
384         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime ()), 0);
385         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime (3200)), 1);
386         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime (6400)), 2);
387         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime (9600)), 3);
388         BOOST_CHECK_EQUAL (player->dcp_to_content_video (piece, DCPTime (12800)), 4);
389
390 }
391
392 /** Test Player::content_video_to_dcp */
393 BOOST_AUTO_TEST_CASE (player_time_calculation_test2)
394 {
395         auto film = new_test_film ("player_time_calculation_test2");
396
397         auto doc = make_shared<cxml::Document>();
398         doc->read_string (xml);
399
400         list<string> notes;
401         auto content = make_shared<FFmpegContent>(doc, film->state_version(), notes);
402         film->set_sequence (false);
403         film->add_content (content);
404
405         auto player = make_shared<Player>(film, Image::Alignment::COMPACT);
406
407         /* Position 0, no trim, content rate = DCP rate */
408         content->set_position (film, DCPTime());
409         content->set_trim_start(film, ContentTime());
410         content->set_video_frame_rate(film, 24);
411         film->set_video_frame_rate (24);
412         player->setup_pieces ();
413         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
414         auto piece = player->_pieces.front ();
415         BOOST_CHECK_EQUAL (player->content_video_to_dcp (piece, 0).get(), 0);
416         BOOST_CHECK_EQUAL (player->content_video_to_dcp (piece, 12).get(), DCPTime::from_seconds(0.5).get());
417         BOOST_CHECK_EQUAL (player->content_video_to_dcp (piece, 72).get(), DCPTime::from_seconds(3.0).get());
418
419         /* Position 3s, no trim, content rate = DCP rate */
420         content->set_position (film, DCPTime::from_seconds(3));
421         content->set_trim_start(film, ContentTime());
422         content->set_video_frame_rate(film, 24);
423         film->set_video_frame_rate (24);
424         player->setup_pieces ();
425         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
426         piece = player->_pieces.front ();
427         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 0).get(), DCPTime::from_seconds(3.00).get());
428         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 36).get(), DCPTime::from_seconds(4.50).get());
429         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 162).get(), DCPTime::from_seconds(9.75).get());
430
431         /* Position 3s, 1.5s trim, content rate = DCP rate */
432         content->set_position (film, DCPTime::from_seconds(3));
433         content->set_trim_start(film, ContentTime::from_seconds(1.5));
434         content->set_video_frame_rate(film, 24);
435         film->set_video_frame_rate (24);
436         player->setup_pieces ();
437         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
438         piece = player->_pieces.front ();
439         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 0).get(), DCPTime::from_seconds(1.50).get());
440         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 36).get(), DCPTime::from_seconds(3.00).get());
441         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 72).get(), DCPTime::from_seconds(4.50).get());
442         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 198).get(), DCPTime::from_seconds(9.75).get());
443
444         /* Position 0, no trim, content rate 24, DCP rate 25.
445            Now, for example, a DCPTime position of 3s means 3s at 25fps.  Since we run the video
446            fast (at 25fps) in this case, this means 75 frames of content video will be used.
447         */
448         content->set_position (film, DCPTime());
449         content->set_trim_start(film, ContentTime());
450         content->set_video_frame_rate(film, 24);
451         film->set_video_frame_rate (25);
452         player->setup_pieces ();
453         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
454         piece = player->_pieces.front ();
455         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 0).get(), 0);
456         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 15).get(), DCPTime::from_seconds(0.6).get());
457         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 75).get(), DCPTime::from_seconds(3.0).get());
458
459         /* Position 3s, no trim, content rate 24, DCP rate 25 */
460         content->set_position (film, DCPTime::from_seconds(3));
461         content->set_trim_start(film, ContentTime());
462         content->set_video_frame_rate(film, 24);
463         film->set_video_frame_rate (25);
464         player->setup_pieces ();
465         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
466         piece = player->_pieces.front ();
467         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 0).get(), DCPTime::from_seconds(3.00).get());
468         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 40).get(), DCPTime::from_seconds(4.60).get());
469         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 169).get(), DCPTime::from_seconds(9.76).get());
470
471         /* Position 3s, 1.6s trim, content rate 24, DCP rate 25, so the 1.6s trim is at 24fps */
472         content->set_position (film, DCPTime::from_seconds(3));
473         content->set_trim_start(film, ContentTime::from_seconds(1.6));
474         content->set_video_frame_rate(film, 24);
475         film->set_video_frame_rate (25);
476         player->setup_pieces ();
477         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
478         piece = player->_pieces.front ();
479         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 0).get(), 142080);
480         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 40).get(), 295680);
481         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 80).get(), 449280);
482         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 209).get(), 944640);
483
484         /* Position 0, no trim, content rate 24, DCP rate 48
485            Now, for example, a DCPTime position of 3s means 3s at 48fps.  Since we run the video
486            with repeated frames in this case, 3 * 24 frames of content video will
487            be used to make 3 * 48 frames of DCP video.  The results should be the same as the
488            content rate = DCP rate case.
489         */
490         content->set_position (film, DCPTime());
491         content->set_trim_start(film, ContentTime());
492         content->set_video_frame_rate(film, 24);
493         film->set_video_frame_rate (48);
494         player->setup_pieces ();
495         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
496         piece = player->_pieces.front ();
497         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 0).get(), 0);
498         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 12).get(), DCPTime::from_seconds(0.5).get());
499         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 72).get(), DCPTime::from_seconds(3.0).get());
500
501         /* Position 3s, no trim, content rate 24, DCP rate 48 */
502         content->set_position (film, DCPTime::from_seconds(3));
503         content->set_trim_start(film, ContentTime());
504         content->set_video_frame_rate(film, 24);
505         film->set_video_frame_rate (48);
506         player->setup_pieces ();
507         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
508         piece = player->_pieces.front ();
509         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 0).get(), DCPTime::from_seconds(3.00).get());
510         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 36).get(), DCPTime::from_seconds(4.50).get());
511         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 162).get(), DCPTime::from_seconds(9.75).get());
512
513         /* Position 3s, 1.5s trim, content rate 24, DCP rate 48 */
514         content->set_position (film, DCPTime::from_seconds(3));
515         content->set_trim_start(film, ContentTime::from_seconds(1.5));
516         content->set_video_frame_rate(film, 24);
517         film->set_video_frame_rate (48);
518         player->setup_pieces ();
519         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
520         piece = player->_pieces.front ();
521         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 0).get(), DCPTime::from_seconds(1.50).get());
522         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 36).get(), DCPTime::from_seconds(3.00).get());
523         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 72).get(), DCPTime::from_seconds(4.50).get());
524         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 198).get(), DCPTime::from_seconds(9.75).get());
525
526         /* Position 0, no trim, content rate 48, DCP rate 24
527            Now, for example, a DCPTime position of 3s means 3s at 24fps.  Since we run the video
528            with skipped frames in this case, 3 * 48 frames of content video will
529            be used to make 3 * 24 frames of DCP video.
530         */
531         content->set_position (film, DCPTime());
532         content->set_trim_start(film, ContentTime());
533         content->set_video_frame_rate(film, 48);
534         film->set_video_frame_rate (24);
535         player->setup_pieces ();
536         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
537         piece = player->_pieces.front ();
538         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 0).get(), 0);
539         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 24).get(), DCPTime::from_seconds(0.5).get());
540         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 144).get(), DCPTime::from_seconds(3.0).get());
541
542         /* Position 3s, no trim, content rate 24, DCP rate 48 */
543         content->set_position (film, DCPTime::from_seconds(3));
544         content->set_trim_start(film, ContentTime());
545         content->set_video_frame_rate(film, 48);
546         film->set_video_frame_rate (24);
547         player->setup_pieces ();
548         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
549         piece = player->_pieces.front ();
550         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 0).get(), DCPTime::from_seconds(3.00).get());
551         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 72).get(), DCPTime::from_seconds(4.50).get());
552         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 324).get(), DCPTime::from_seconds(9.75).get());
553
554         /* Position 3s, 1.5s trim, content rate 24, DCP rate 48 */
555         content->set_position (film, DCPTime::from_seconds(3));
556         content->set_trim_start(film, ContentTime::from_seconds(1.5));
557         content->set_video_frame_rate(film, 48);
558         film->set_video_frame_rate (24);
559         player->setup_pieces ();
560         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
561         piece = player->_pieces.front ();
562         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 0).get(), DCPTime::from_seconds(1.50).get());
563         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 72).get(), DCPTime::from_seconds(3.00).get());
564         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 144).get(), DCPTime::from_seconds(4.50).get());
565         BOOST_CHECK_EQUAL (player->content_video_to_dcp(piece, 396).get(), DCPTime::from_seconds(9.75).get());
566 }
567
568 /** Test Player::dcp_to_content_audio */
569 BOOST_AUTO_TEST_CASE (player_time_calculation_test3)
570 {
571         auto film = new_test_film ("player_time_calculation_test3");
572
573         auto doc = make_shared<cxml::Document>();
574         doc->read_string (xml);
575
576         list<string> notes;
577         auto content = make_shared<FFmpegContent>(doc, film->state_version(), notes);
578         auto stream = content->audio->streams().front();
579         film->set_sequence (false);
580         film->add_content (content);
581
582         auto player = make_shared<Player>(film, Image::Alignment::COMPACT);
583
584         /* Position 0, no trim, video/audio content rate = video/audio DCP rate */
585         content->set_position (film, DCPTime());
586         content->set_trim_start(film, ContentTime());
587         content->set_video_frame_rate(film, 24);
588         film->set_video_frame_rate (24);
589         stream->_frame_rate = 48000;
590         player->setup_pieces ();
591         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
592         auto piece = player->_pieces.front ();
593         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime ()), 0);
594         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (0.5)),  24000);
595         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (3.0)), 144000);
596
597         /* Position 3s, no trim, video/audio content rate = video/audio DCP rate */
598         content->set_position (film, DCPTime::from_seconds (3));
599         content->set_trim_start(film, ContentTime());
600         content->set_video_frame_rate(film, 24);
601         film->set_video_frame_rate (24);
602         stream->_frame_rate = 48000;
603         player->setup_pieces ();
604         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
605         piece = player->_pieces.front ();
606         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime ()), 0);
607         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (0.50)),      0);
608         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (3.00)),      0);
609         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (4.50)),  72000);
610         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (9.75)), 324000);
611
612         /* Position 3s, 1.5s trim, video/audio content rate = video/audio DCP rate */
613         content->set_position (film, DCPTime::from_seconds (3));
614         content->set_trim_start(film, ContentTime::from_seconds(1.5));
615         content->set_video_frame_rate(film, 24);
616         film->set_video_frame_rate (24);
617         stream->_frame_rate = 48000;
618         player->setup_pieces ();
619         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
620         piece = player->_pieces.front ();
621         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime ()), 0);
622         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (0.50)),      0);
623         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (3.00)),  72000);
624         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (4.50)), 144000);
625         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (9.75)), 396000);
626
627         /* Position 0, no trim, content video rate 24, DCP video rate 25, both audio rates still 48k */
628         content->set_position (film, DCPTime());
629         content->set_trim_start(film, ContentTime());
630         content->set_video_frame_rate(film, 24);
631         film->set_video_frame_rate (25);
632         stream->_frame_rate = 48000;
633         player->setup_pieces ();
634         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
635         piece = player->_pieces.front ();
636         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime ()), 0);
637         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (0.6)),  28800);
638         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (3.0)), 144000);
639
640         /* Position 3s, no trim, content video rate 24, DCP rate 25, both audio rates still 48k. */
641         content->set_position (film, DCPTime::from_seconds(3));
642         content->set_trim_start(film, ContentTime());
643         content->set_video_frame_rate(film, 24);
644         film->set_video_frame_rate (25);
645         stream->_frame_rate = 48000;
646         player->setup_pieces ();
647         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
648         piece = player->_pieces.front ();
649         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime ()), 0);
650         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (0.60)),      0);
651         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (3.00)),      0);
652         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (4.60)),  76800);
653         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (9.75)), 324000);
654
655         /* Position 3s, 1.6s trim, content rate 24, DCP rate 25, both audio rates still 48k.
656            1s of content is 46080 samples after resampling.
657         */
658         content->set_position (film, DCPTime::from_seconds(3));
659         content->set_trim_start(film, ContentTime::from_seconds(1.6));
660         content->set_video_frame_rate(film, 24);
661         film->set_video_frame_rate (25);
662         stream->_frame_rate = 48000;
663         player->setup_pieces ();
664         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
665         piece = player->_pieces.front ();
666         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime ()), 0);
667         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (0.60)),      0);
668         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (3.00)),  72960);
669         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (4.60)), 149760);
670         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (9.75)), 396960);
671
672         /* Position 0, no trim, content rate 24, DCP rate 48, both audio rates still 48k.
673            Now, for example, a DCPTime position of 3s means 3s at 48fps.  Since we run the video
674            with repeated frames in this case, audio samples will map straight through.
675            The results should be the same as the content rate = DCP rate case.
676         */
677         content->set_position (film, DCPTime());
678         content->set_trim_start(film, ContentTime());
679         content->set_video_frame_rate(film, 24);
680         film->set_video_frame_rate (48);
681         stream->_frame_rate = 48000;
682         player->setup_pieces ();
683         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
684         piece = player->_pieces.front ();
685         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime ()), 0);
686         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (0.5)),  24000);
687         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (3.0)), 144000);
688
689         /* Position 3s, no trim, content rate 24, DCP rate 48 */
690         content->set_position (film, DCPTime::from_seconds(3));
691         content->set_trim_start(film, ContentTime());
692         content->set_video_frame_rate(film, 24);
693         film->set_video_frame_rate (24);
694         stream->_frame_rate = 48000;
695         player->setup_pieces ();
696         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
697         piece = player->_pieces.front ();
698         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime ()), 0);
699         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (0.50)),      0);
700         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (3.00)),      0);
701         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (4.50)),  72000);
702         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (9.75)), 324000);
703
704         /* Position 3s, 1.5s trim, content rate 24, DCP rate 48 */
705         content->set_position (film, DCPTime::from_seconds(3));
706         content->set_trim_start(film, ContentTime::from_seconds(1.5));
707         content->set_video_frame_rate(film, 24);
708         film->set_video_frame_rate (24);
709         stream->_frame_rate = 48000;
710         player->setup_pieces ();
711         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
712         piece = player->_pieces.front ();
713         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime ()), 0);
714         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (0.50)),   0);
715         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (3.00)),  72000);
716         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (4.50)), 144000);
717         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (9.75)), 396000);
718
719         /* Position 0, no trim, content rate 48, DCP rate 24
720            Now, for example, a DCPTime position of 3s means 3s at 24fps.  Since we run the video
721            with skipped frames in this case, audio samples should map straight through.
722         */
723         content->set_position (film, DCPTime());
724         content->set_trim_start(film, ContentTime());
725         content->set_video_frame_rate(film, 24);
726         film->set_video_frame_rate (48);
727         stream->_frame_rate = 48000;
728         player->setup_pieces ();
729         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
730         piece = player->_pieces.front ();
731         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime ()), 0);
732         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (0.5)),  24000);
733         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (3.0)), 144000);
734
735         /* Position 3s, no trim, content rate 24, DCP rate 48 */
736         content->set_position (film, DCPTime::from_seconds(3));
737         content->set_trim_start(film, ContentTime());
738         content->set_video_frame_rate(film, 24);
739         film->set_video_frame_rate (24);
740         stream->_frame_rate = 48000;
741         player->setup_pieces ();
742         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
743         piece = player->_pieces.front ();
744         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime ()), 0);
745         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (0.50)),      0);
746         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (3.00)),      0);
747         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (4.50)),  72000);
748         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (9.75)), 324000);
749
750         /* Position 3s, 1.5s trim, content rate 24, DCP rate 48 */
751         content->set_position (film, DCPTime::from_seconds(3));
752         content->set_trim_start(film, ContentTime::from_seconds(1.5));
753         content->set_video_frame_rate(film, 24);
754         film->set_video_frame_rate (24);
755         stream->_frame_rate = 48000;
756         player->setup_pieces ();
757         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
758         piece = player->_pieces.front ();
759         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime ()), 0);
760         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (0.50)),   0);
761         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (3.00)),  72000);
762         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (4.50)), 144000);
763         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (9.75)), 396000);
764
765         /* Position 0, no trim, video content rate = video DCP rate, content audio rate = 44.1k */
766         content->set_position (film, DCPTime());
767         content->set_trim_start(film, ContentTime());
768         content->set_video_frame_rate(film, 24);
769         film->set_video_frame_rate (24);
770         stream->_frame_rate = 44100;
771         player->setup_pieces ();
772         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
773         piece = player->_pieces.front ();
774         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime ()), 0);
775         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (0.5)),  24000);
776         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (3.0)), 144000);
777
778         /* Position 3s, no trim, video content rate = video DCP rate, content audio rate = 44.1k */
779         content->set_position (film, DCPTime::from_seconds(3));
780         content->set_trim_start(film, ContentTime());
781         content->set_video_frame_rate(film, 24);
782         film->set_video_frame_rate (24);
783         stream->_frame_rate = 44100;
784         player->setup_pieces ();
785         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
786         piece = player->_pieces.front ();
787         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime ()), 0);
788         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (0.50)),      0);
789         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (3.00)),      0);
790         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (4.50)),  72000);
791         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (9.75)), 324000);
792
793         /* Position 3s, 1.5s trim, video content rate = video DCP rate, content audio rate = 44.1k */
794         content->set_position (film, DCPTime::from_seconds(3));
795         content->set_trim_start(film, ContentTime::from_seconds(1.5));
796         content->set_video_frame_rate(film, 24);
797         film->set_video_frame_rate (24);
798         stream->_frame_rate = 44100;
799         player->setup_pieces ();
800         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
801         piece = player->_pieces.front ();
802         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime ()), 0);
803         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (0.50)),      0);
804         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (3.00)),  72000);
805         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (4.50)), 144000);
806         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime::from_seconds (9.75)), 396000);
807
808         /* Check with a large start trim */
809         content->set_position (film, DCPTime::from_seconds(0));
810         content->set_trim_start(film, ContentTime::from_seconds(54143));
811         content->set_video_frame_rate(film, 24);
812         film->set_video_frame_rate (24);
813         stream->_frame_rate = 48000;
814         player->setup_pieces ();
815         BOOST_REQUIRE_EQUAL (player->_pieces.size(), 1U);
816         piece = player->_pieces.front ();
817         BOOST_CHECK_EQUAL (player->dcp_to_resampled_audio (piece, DCPTime ()), 54143LL * 48000);
818 }