2 Copyright (C) 2015-2021 Carl Hetherington <cth@carlh.net>
4 This file is part of DCP-o-matic.
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.
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.
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/>.
22 /** @file test/time_calculation_test.cc
23 * @brief Test calculation of timings when frame rates change.
29 #include "lib/ffmpeg_content.h"
30 #include "lib/video_content.h"
31 #include "lib/player.h"
32 #include "lib/audio_content.h"
34 #include <boost/test/unit_test.hpp>
38 using std::make_shared;
39 using std::shared_ptr;
41 using namespace dcpomatic;
44 static string const xml = "<Content>"
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>"
66 "<InputTransferFunction>"
67 "<Type>ModifiedGamma</Type>"
68 "<Power>2.222222222222222</Power>"
69 "<Threshold>0.081</Threshold>"
72 "</InputTransferFunction>"
75 "<GreenX>0.3</GreenX>"
76 "<GreenY>0.6</GreenY>"
79 "<WhiteX>0.3127</WhiteX>"
80 "<WhiteY>0.329</WhiteY>"
81 "<OutputGamma>2.6</OutputGamma>"
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>"
94 "<Selected>1</Selected>"
95 "<Name>und; 2 channels</Name>"
97 "<FrameRate>44100</FrameRate>"
98 "<Length>44100</Length>"
99 "<Channels>2</Channels>"
100 "<FirstAudio>0</FirstAudio>"
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>"
130 "<FirstVideo>0</FirstVideo>"
134 BOOST_AUTO_TEST_CASE (ffmpeg_time_calculation_test)
136 auto film = new_test_film ("ffmpeg_time_calculation_test");
138 auto doc = make_shared<cxml::Document>();
139 doc->read_string (xml);
142 auto content = make_shared<FFmpegContent>(doc, film->state_version(), notes);
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());
160 /* Make the content audio-only */
161 content->video.reset ();
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());
187 /** Test Player::dcp_to_content_video */
188 BOOST_AUTO_TEST_CASE (player_time_calculation_test1)
190 auto film = new_test_film ("player_time_calculation_test1");
192 auto doc = make_shared<cxml::Document>();
193 doc->read_string (xml);
196 auto content = make_shared<FFmpegContent>(doc, film->state_version(), notes);
197 film->set_sequence (false);
198 film->add_content (content);
200 auto player = make_shared<Player>(film);
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);
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);
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);
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.
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);
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);
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.
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);
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.
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);
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);
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);
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.
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);
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);
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);
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);
393 /** Test Player::content_video_to_dcp */
394 BOOST_AUTO_TEST_CASE (player_time_calculation_test2)
396 auto film = new_test_film ("player_time_calculation_test2");
398 auto doc = make_shared<cxml::Document>();
399 doc->read_string (xml);
402 auto content = make_shared<FFmpegContent>(doc, film->state_version(), notes);
403 film->set_sequence (false);
404 film->add_content (content);
406 auto player = make_shared<Player>(film);
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());
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());
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());
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.
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());
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());
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);
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.
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());
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());
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());
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.
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());
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());
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());
569 /** Test Player::dcp_to_content_audio */
570 BOOST_AUTO_TEST_CASE (player_time_calculation_test3)
572 auto film = new_test_film ("player_time_calculation_test3");
574 auto doc = make_shared<cxml::Document>();
575 doc->read_string (xml);
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);
583 auto player = make_shared<Player>(film);
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);
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);
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);
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);
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);
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.
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);
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.
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);
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);
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);
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.
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);
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);
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);
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);
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);
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);
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);