summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2020-01-27 23:19:52 +0000
committerCarl Hetherington <cth@carlh.net>2020-01-28 21:58:47 +0100
commit95f4d8740de74cdecf6658ab2607c0af9732904e (patch)
tree3818062dcfe631dd2bd0b3d7ccfa3187867f948a
parentc93449bb6d866f6ff9cdc94ca9babdfd8b53c870 (diff)
Fix crash with sub-sample push parts in AudioMerger.v2.15.42
Forward-ported from b86b15391074a68149f8c4a51958c7873d74def0 in master.
-rw-r--r--src/lib/audio_merger.cc7
-rw-r--r--test/audio_merger_test.cc46
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<const AudioBuffers> 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 <cth@carlh.net>
+ Copyright (C) 2013-2020 Carl Hetherington <cth@carlh.net>
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 <dcp/raw_convert.h>
#include <boost/test/unit_test.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>
@@ -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<string> tokens;
+ char buf[64];
+ while (fscanf(f, "%63s", buf) == 1) {
+ tokens.push_back (buf);
+ }
+
+ shared_ptr<AudioMerger> merger;
+ list<string>::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<int>(*i++)));
+ } else if (cmd == "clear") {
+ merger->clear ();
+ } else if (cmd == "push") {
+ BOOST_REQUIRE (i != tokens.end());
+ DCPTime time(dcp::raw_convert<DCPTime::Type>(*i++));
+ BOOST_REQUIRE (i != tokens.end());
+ int const frames = dcp::raw_convert<int>(*i++);
+ shared_ptr<AudioBuffers> 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<DCPTime::Type>(*i++));
+ merger->pull (time);
+ }
+ }
+}
+
+