From: Carl Hetherington Date: Tue, 23 Feb 2021 19:01:49 +0000 (+0100) Subject: Fix assertion failure in AudioBuffers::copy_from() (#1909) X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=4d8c69b356f770144c59982c4196846d6f1dc0b0 Fix assertion failure in AudioBuffers::copy_from() (#1909) A number of frames N was being split up into two parts which together were bigger than N, meaning a copy of one of the parts failed. --- diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 9ebdd92a3..ad588f0a6 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -306,11 +306,14 @@ Writer::write (shared_ptr audio, DCPTime const time) end - _audio_reel->period().to }; + /* Be careful that part_lengths[0] + part_lengths[1] can't be bigger than audio->frames() */ Frame part_frames[2] = { part_lengths[0].frames_ceil(afr), - part_lengths[1].frames_ceil(afr) + part_lengths[1].frames_floor(afr) }; + DCPOMATIC_ASSERT ((part_frames[0] + part_frames[1]) <= audio->frames()); + if (part_frames[0]) { shared_ptr part (new AudioBuffers(audio, part_frames[0], 0)); _audio_reel->write (part); diff --git a/test/writer_test.cc b/test/writer_test.cc new file mode 100644 index 000000000..dade4d6b4 --- /dev/null +++ b/test/writer_test.cc @@ -0,0 +1,49 @@ +/* + Copyright (C) 2021 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + + +#include "lib/audio_buffers.h" +#include "lib/content.h" +#include "lib/content_factory.h" +#include "lib/film.h" +#include "lib/job.h" +#include "lib/video_content.h" +#include "lib/writer.h" +#include "test.h" +#include +#include + + +using std::make_shared; +using std::shared_ptr; + + +BOOST_AUTO_TEST_CASE (test_write_odd_amount_of_silence) +{ + auto content = content_factory("test/data/flat_red.png").front(); + auto film = new_test_film2 ("test_write_odd_amount_of_silence", {content}); + content->video->set_length(24); + auto writer = make_shared(film, shared_ptr()); + + auto audio = make_shared(6, 48000); + audio->make_silent (); + writer->write (audio, dcpomatic::DCPTime(1)); +} + diff --git a/test/wscript b/test/wscript index cbe2c176c..4303db835 100644 --- a/test/wscript +++ b/test/wscript @@ -138,6 +138,7 @@ def build(bld): video_level_test.cc video_mxf_content_test.cc vf_kdm_test.cc + writer_test.cc zipper_test.cc """