From 95f4d8740de74cdecf6658ab2607c0af9732904e Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 27 Jan 2020 23:19:52 +0000 Subject: [PATCH] Fix crash with sub-sample push parts in AudioMerger. Forward-ported from b86b15391074a68149f8c4a51958c7873d74def0 in master. --- src/lib/audio_merger.cc | 7 +++--- test/audio_merger_test.cc | 46 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/lib/audio_merger.cc b/src/lib/audio_merger.cc index 1cc5ff0a1..667068f8f 100644 --- a/src/lib/audio_merger.cc +++ b/src/lib/audio_merger.cc @@ -138,9 +138,10 @@ AudioMerger::push (boost::shared_ptr audio, DCPTime time) part->copy_from (audio.get(), part->frames(), frames(DCPTime(i.from - time)), 0); if (before == _buffers.end() && after == _buffers.end()) { - /* New buffer */ - DCPOMATIC_ASSERT (part->frames() > 0); - _buffers.push_back (Buffer (part, time, _frame_rate)); + if (part->frames() > 0) { + /* New buffer */ + _buffers.push_back (Buffer (part, time, _frame_rate)); + } } else if (before != _buffers.end() && after == _buffers.end()) { /* We have an existing buffer before this one; append new data to it */ before->audio->append (part); diff --git a/test/audio_merger_test.cc b/test/audio_merger_test.cc index 4a1f689dd..2ac42964a 100644 --- a/test/audio_merger_test.cc +++ b/test/audio_merger_test.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2017 Carl Hetherington + Copyright (C) 2013-2020 Carl Hetherington This file is part of DCP-o-matic. @@ -23,8 +23,12 @@ * @ingroup selfcontained */ +#include "lib/cross.h" #include "lib/audio_merger.h" #include "lib/audio_buffers.h" +#include "lib/dcpomatic_time.h" +#include "test.h" +#include #include #include #include @@ -34,6 +38,7 @@ using std::pair; using std::list; using std::cout; +using std::string; using boost::shared_ptr; using boost::bind; using namespace dcpomatic; @@ -135,3 +140,42 @@ BOOST_AUTO_TEST_CASE (audio_merger_test3) BOOST_CHECK_EQUAL (tb.front().first->data()[0][i], i); } } + +/* Reply a sequence of calls to AudioMerger that resulted in a crash */ +BOOST_AUTO_TEST_CASE (audio_merger_test4) +{ + FILE* f = fopen_boost("test/data/audio_merger_bug1.log", "r"); + BOOST_REQUIRE (f); + list tokens; + char buf[64]; + while (fscanf(f, "%63s", buf) == 1) { + tokens.push_back (buf); + } + + shared_ptr merger; + list::const_iterator i = tokens.begin (); + while (i != tokens.end()) { + BOOST_CHECK (*i++ == "I/AM"); + string const cmd = *i++; + if (cmd == "frame_rate") { + BOOST_REQUIRE (i != tokens.end()); + merger.reset (new AudioMerger(dcp::raw_convert(*i++))); + } else if (cmd == "clear") { + merger->clear (); + } else if (cmd == "push") { + BOOST_REQUIRE (i != tokens.end()); + DCPTime time(dcp::raw_convert(*i++)); + BOOST_REQUIRE (i != tokens.end()); + int const frames = dcp::raw_convert(*i++); + shared_ptr buffers(new AudioBuffers(1, frames)); + BOOST_REQUIRE (merger); + merger->push (buffers, time); + } else if (cmd == "pull") { + BOOST_REQUIRE (i != tokens.end()); + DCPTime time(dcp::raw_convert(*i++)); + merger->pull (time); + } + } +} + + -- 2.30.2