summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-08-28 13:57:43 +0100
committerCarl Hetherington <cth@carlh.net>2015-08-28 13:57:43 +0100
commit694fa81296e7fc8215f15414bd773354b253e07e (patch)
treefa1b459a668f8b01afbe93ef7849f1ce80993242
parent0939464fbe15fbc9e675819174a868b7ef24921c (diff)
Fix crash on adding a KDM to a DCP (hopefully #645).
-rw-r--r--ChangeLog5
-rw-r--r--src/lib/audio_decoder.cc23
2 files changed, 28 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index cc9b6c36f..474062cf4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2015-08-28 c.hetherington <cth@carlh.net>
+
+ * Fix crash on adding a KDM to DCP content
+ (hopefully fixing #645).
+
2015-08-27 Carl Hetherington <cth@carlh.net>
* Tidy up DCP content colour conversion
diff --git a/src/lib/audio_decoder.cc b/src/lib/audio_decoder.cc
index 0d5591072..a65e5f759 100644
--- a/src/lib/audio_decoder.cc
+++ b/src/lib/audio_decoder.cc
@@ -47,6 +47,29 @@ AudioDecoder::get_audio (AudioStreamPtr stream, Frame frame, Frame length, bool
void
AudioDecoder::audio (AudioStreamPtr stream, shared_ptr<const AudioBuffers> data, ContentTime time)
{
+ if (_streams.find (stream) == _streams.end ()) {
+
+ /* This method can be called with an unknown stream during the following sequence:
+ - Add KDM to some DCP content.
+ - Content gets re-examined.
+ - SingleStreamAudioContent::take_from_audio_examiner creates a new stream.
+ - Some content property change signal is delivered so Player::Changed is emitted.
+ - Film viewer to re-gets the frame.
+ - Player calls DCPDecoder pass which calls this method on the new stream.
+
+ At this point the AudioDecoder does not know about the new stream.
+
+ Then
+ - Some other property change signal is delivered which marks the player's pieces invalid.
+ - Film viewer re-gets again.
+ - Everything is OK.
+
+ In this situation it is fine for us to silently drop the audio.
+ */
+
+ return;
+ }
+
_streams[stream]->audio (data, time);
}