summaryrefslogtreecommitdiff
path: root/src/lib/dcp_decoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2026-02-08 00:52:27 +0100
committerCarl Hetherington <cth@carlh.net>2026-02-12 21:01:59 +0100
commit7b19d27983cb8078e8b35407a25e62da4ec687fe (patch)
tree1d038a938e81eb452dc3c8c970d3e54edd307734 /src/lib/dcp_decoder.cc
parent55c53dd8621a30d3c39858216da6b5d2e6445fb0 (diff)
Re-use assets verbatim if they do not need to change (#448).
Diffstat (limited to 'src/lib/dcp_decoder.cc')
-rw-r--r--src/lib/dcp_decoder.cc17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/lib/dcp_decoder.cc b/src/lib/dcp_decoder.cc
index 27d0f3a94..59dd7c008 100644
--- a/src/lib/dcp_decoder.cc
+++ b/src/lib/dcp_decoder.cc
@@ -28,6 +28,7 @@
#include "dcp_decoder.h"
#include "dcpomatic_log.h"
#include "digester.h"
+#include "film.h"
#include "ffmpeg_image_proxy.h"
#include "frame_interval_checker.h"
#include "image.h"
@@ -146,6 +147,12 @@ DCPDecoder::DCPDecoder(shared_ptr<const Film> film, shared_ptr<const DCPContent>
_font_id_allocator.add_fonts_from_reels(_reels);
_font_id_allocator.allocate();
+
+ _can_reuse_video = _dcp_content->can_reuse_video(film) && !film->reencode_j2k();
+ _can_reuse_audio = _dcp_content->can_reuse_audio(film);
+ for (int i = 0; i < static_cast<int>(TextType::COUNT); ++i) {
+ _can_reuse_text[i] = _dcp_content->can_reuse_text(film, static_cast<TextType>(i));
+ }
}
@@ -176,7 +183,7 @@ DCPDecoder::pass()
*/
pass_texts(_next, picture_asset->size());
- if ((_j2k_mono_reader || _j2k_stereo_reader || _mpeg2_mono_reader) && (_decode_reusable || !_dcp_content->reference_video())) {
+ if ((_j2k_mono_reader || _j2k_stereo_reader || _mpeg2_mono_reader) && (_decode_reusable || !_can_reuse_video)) {
auto const entry_point = (*_reel)->main_picture()->entry_point().get_value_or(0);
if (_j2k_mono_reader) {
video->emit(
@@ -233,7 +240,7 @@ DCPDecoder::pass()
}
}
- if (_sound_reader && (_decode_reusable || !_dcp_content->reference_audio())) {
+ if (_sound_reader && (_decode_reusable || !_can_reuse_audio)) {
auto const entry_point = (*_reel)->main_sound()->entry_point().get_value_or(0);
auto sf = _sound_reader->get_frame(entry_point + frame);
auto from = sf->data();
@@ -331,7 +338,7 @@ DCPDecoder::pass_texts(
auto const asset = reel_asset->asset();
auto const entry_point = reel_asset->entry_point().get_value_or(0);
- if (_decode_reusable || !_dcp_content->reference_text(type)) {
+ if (_decode_reusable || !_can_reuse_text[type]) {
auto subs = asset->texts_during(
dcp::Time(entry_point + frame, vfr, vfr),
dcp::Time(entry_point + frame + 1, vfr, vfr),
@@ -522,10 +529,10 @@ DCPDecoder::set_decode_reusable(bool r)
_decode_reusable = r;
if (video) {
- video->set_ignore(_dcp_content->reference_video() && !_decode_reusable);
+ video->set_ignore(_can_reuse_video && !_decode_reusable);
}
if (audio) {
- audio->set_ignore(_dcp_content->reference_audio() && !_decode_reusable);
+ audio->set_ignore(_can_reuse_audio && !_decode_reusable);
}
}