summaryrefslogtreecommitdiff
path: root/src/lib/dcp_decoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2020-06-19 13:30:02 +0200
committerCarl Hetherington <cth@carlh.net>2020-06-19 15:07:30 +0200
commitca981c8cfa23111e92be329f1c2dfbe3a07b4247 (patch)
tree2a0ceab2864691f910c9c7d70127542868f9f8e5 /src/lib/dcp_decoder.cc
parentcabe0934c60fb6e74bf4c3023bdcb5c68753e5d9 (diff)
Make Atmos content work more like other content. Now its MXFsv2.15.82
are re-written, meaning that they can be encrypted. This (along with the libdcp update) also fixes assorted Atmos bugs.
Diffstat (limited to 'src/lib/dcp_decoder.cc')
-rw-r--r--src/lib/dcp_decoder.cc22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/lib/dcp_decoder.cc b/src/lib/dcp_decoder.cc
index ab724cd6c..30e337252 100644
--- a/src/lib/dcp_decoder.cc
+++ b/src/lib/dcp_decoder.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2014-2019 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2014-2020 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
@@ -18,6 +18,7 @@
*/
+#include "atmos_decoder.h"
#include "dcp_decoder.h"
#include "dcp_content.h"
#include "audio_content.h"
@@ -47,6 +48,7 @@
#include <dcp/sound_asset_reader.h>
#include <dcp/subtitle_image.h>
#include <dcp/decrypted_kdm.h>
+#include <dcp/reel_atmos_asset.h>
#include <boost/foreach.hpp>
#include <iostream>
@@ -76,6 +78,9 @@ DCPDecoder::DCPDecoder (shared_ptr<const Film> film, shared_ptr<const DCPContent
/* XXX: this time here should be the time of the first subtitle, not 0 */
text.push_back (shared_ptr<TextDecoder> (new TextDecoder (this, i, ContentTime())));
}
+ if (c->atmos) {
+ atmos.reset (new AtmosDecoder (this, c));
+ }
}
/* We try to avoid re-scanning the DCP's files every time we make a new DCPDecoder; we do this
@@ -215,6 +220,11 @@ DCPDecoder::pass ()
audio->emit (film(), _dcp_content->audio->stream(), data, ContentTime::from_frames (_offset, vfr) + _next);
}
+ if (_atmos_reader) {
+ DCPOMATIC_ASSERT (_atmos_metadata);
+ atmos->emit (film(), _atmos_reader->get_frame(frame), frame, *_atmos_metadata);
+ }
+
_next += ContentTime::from_frames (1, vfr);
if ((*_reel)->main_picture ()) {
@@ -341,6 +351,7 @@ DCPDecoder::get_readers ()
_mono_reader.reset ();
_stereo_reader.reset ();
_sound_reader.reset ();
+ _atmos_reader.reset ();
return;
}
@@ -366,6 +377,15 @@ DCPDecoder::get_readers ()
} else {
_sound_reader.reset ();
}
+
+ if ((*_reel)->atmos()) {
+ shared_ptr<dcp::AtmosAsset> asset = (*_reel)->atmos()->asset();
+ _atmos_reader = asset->start_read();
+ _atmos_metadata = AtmosMetadata (asset);
+ } else {
+ _atmos_reader.reset ();
+ _atmos_metadata = boost::none;
+ }
}
void