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;
40 using namespace dcpomatic;
43 static string const xml = "<Content>"
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>"
65 "<InputTransferFunction>"
66 "<Type>ModifiedGamma</Type>"
67 "<Power>2.222222222222222</Power>"
68 "<Threshold>0.081</Threshold>"
71 "</InputTransferFunction>"
74 "<GreenX>0.3</GreenX>"
75 "<GreenY>0.6</GreenY>"
78 "<WhiteX>0.3127</WhiteX>"
79 "<WhiteY>0.329</WhiteY>"
80 "<OutputGamma>2.6</OutputGamma>"
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>"
93 "<Selected>1</Selected>"
94 "<Name>und; 2 channels</Name>"
96 "<FrameRate>44100</FrameRate>"
97 "<Length>44100</Length>"
98 "<Channels>2</Channels>"
99 "<FirstAudio>0</FirstAudio>"
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>"
129 "<FirstVideo>0</FirstVideo>"
133 BOOST_AUTO_TEST_CASE (ffmpeg_time_calculation_test)
135 auto film = new_test_film ("ffmpeg_time_calculation_test");
137 auto doc = make_shared<cxml::Document>();
138 doc->read_string (xml);
141 auto content = make_shared<FFmpegContent>(doc, film->state_version(), notes);
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());
159 /* Make the content audio-only */
160 content->video.reset ();
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());
186 /** Test Player::dcp_to_content_video */
187 BOOST_AUTO_TEST_CASE (player_time_calculation_test1)
189 auto film = new_test_film ("player_time_calculation_test1");
191 auto doc = make_shared<cxml::Document>();
192 doc->read_string (xml);
195 auto content = make_shared<FFmpegContent>(doc, film->state_version(), notes);
196 film->set_sequence (false);
197 film->add_content (content);
199 auto player = make_shared<Player>(film, Image::Alignment::COMPACT);
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);
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);
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);
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.
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);
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);
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.
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);
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.
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);
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);
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);
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.
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);
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);
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);
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);
392 /** Test Player::content_video_to_dcp */
393 BOOST_AUTO_TEST_CASE (player_time_calculation_test2)
395 auto film = new_test_film ("player_time_calculation_test2");
397 auto doc = make_shared<cxml::Document>();
398 doc->read_string (xml);
401 auto content = make_shared<FFmpegContent>(doc, film->state_version(), notes);
402 film->set_sequence (false);
403 film->add_content (content);
405 auto player = make_shared<Player>(film, Image::Alignment::COMPACT);
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());
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());
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());
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.
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());
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());
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);
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.
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());
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());
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());
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.
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());
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());
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());
568 /** Test Player::dcp_to_content_audio */
569 BOOST_AUTO_TEST_CASE (player_time_calculation_test3)
571 auto film = new_test_film ("player_time_calculation_test3");
573 auto doc = make_shared<cxml::Document>();
574 doc->read_string (xml);
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);
582 auto player = make_shared<Player>(film, Image::Alignment::COMPACT);
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);
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);
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);
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);
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);
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.
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);
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.
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);
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);
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);
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.
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);
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);
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);
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);
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);
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);
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);