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