summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2017-06-11 23:05:48 +0100
committerCarl Hetherington <cth@carlh.net>2017-06-11 23:05:48 +0100
commit7a6b206783fd44735679f8c7ea542b42e1a4dbd6 (patch)
treee4469190fd7231b9d350a7da60bc62ca509f48d7
parent8cdd8fe486331d10140a4d38a1fef9efc6fb8283 (diff)
Fix incorrect audio MXFs when writing multiple reels.
-rw-r--r--src/lib/writer.cc16
m---------test/data0
-rw-r--r--test/reels_test.cc19
3 files changed, 26 insertions, 9 deletions
diff --git a/src/lib/writer.cc b/src/lib/writer.cc
index ae00c0122..064c3f0ec 100644
--- a/src/lib/writer.cc
+++ b/src/lib/writer.cc
@@ -247,23 +247,21 @@ Writer::write (shared_ptr<const AudioBuffers> audio)
return;
}
- int32_t const this_time = min (
- audio->frames() - offset,
- (int32_t) (_audio_reel->period().duration().frames_floor(_film->audio_frame_rate()) - _audio_reel->total_written_audio_frames())
- );
+ int32_t const remaining = audio->frames() - offset;
+ int32_t const reel_space = _audio_reel->period().duration().frames_floor(_film->audio_frame_rate()) - _audio_reel->total_written_audio_frames();
- if (this_time == audio->frames()) {
+ if (remaining <= reel_space) {
/* Easy case: we can write all the audio to this reel */
_audio_reel->write (audio);
+ offset += remaining;
} else {
/* Write the part we can */
- shared_ptr<AudioBuffers> part (new AudioBuffers (audio->channels(), this_time));
- part->copy_from (audio.get(), this_time, offset, 0);
+ shared_ptr<AudioBuffers> part (new AudioBuffers (audio->channels(), reel_space));
+ part->copy_from (audio.get(), reel_space, offset, 0);
_audio_reel->write (part);
++_audio_reel;
+ offset += reel_space;
}
-
- offset += this_time;
}
}
diff --git a/test/data b/test/data
-Subproject 8ae9a3a8e7c48c5c0a8c64e6fa2fcc34ee3a1e3
+Subproject 789bd241695300320126152037ae171ec658146
diff --git a/test/reels_test.cc b/test/reels_test.cc
index b53f26ede..6dd40c13e 100644
--- a/test/reels_test.cc
+++ b/test/reels_test.cc
@@ -278,3 +278,22 @@ BOOST_AUTO_TEST_CASE (reels_test5)
BOOST_CHECK (*i++ == DCPTimePeriod (DCPTime(123 + 144000), DCPTime(123 + 192000)));
}
}
+
+/** Check reel split with a muxed video/audio source */
+BOOST_AUTO_TEST_CASE (reels_test6)
+{
+ shared_ptr<Film> film = new_test_film ("reels_test6");
+ film->set_name ("reels_test6");
+ film->set_container (Ratio::from_id ("185"));
+ film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TST"));
+ shared_ptr<FFmpegContent> A (new FFmpegContent (film, "test/data/test2.mp4"));
+ film->examine_and_add_content (A);
+ BOOST_REQUIRE (!wait_for_jobs ());
+
+ film->set_j2k_bandwidth (100000000);
+ film->set_reel_type (REELTYPE_BY_LENGTH);
+ /* This is just over 2.5s at 100Mbit/s; should correspond to 60 frames */
+ film->set_reel_length (31253154);
+ film->make_dcp ();
+ BOOST_REQUIRE (!wait_for_jobs ());
+}