Remove DCP class and replace its functionality with a plain method in libdcp.
authorCarl Hetherington <cth@carlh.net>
Mon, 3 Jan 2022 00:10:43 +0000 (00:10 +0000)
committerCarl Hetherington <cth@carlh.net>
Tue, 4 Jan 2022 20:56:40 +0000 (20:56 +0000)
12 files changed:
cscript
src/lib/dcp.cc [deleted file]
src/lib/dcp.h [deleted file]
src/lib/dcp_content.cc
src/lib/dcp_decoder.cc
src/lib/dcp_decoder.h
src/lib/dcp_examiner.cc
src/lib/dcp_examiner.h
src/lib/dcp_transcode_job.cc
src/lib/wscript
src/tools/dcpomatic_player.cc
src/wx/content_menu.cc

diff --git a/cscript b/cscript
index b77448ac319bddd8986b106bf31ddf44453a8f18..1a6f00b67f0f5059d812cc2759f192b719bcbf06 100644 (file)
--- a/cscript
+++ b/cscript
@@ -432,8 +432,8 @@ def dependencies(target, options):
         # Use distro-provided FFmpeg on Arch
         deps = []
 
-    deps.append(('libdcp', 'v1.8.5'))
-    deps.append(('libsub', 'v1.6.5'))
+    deps.append(('libdcp', '81c6fcb'))
+    deps.append(('libsub', '3c541fa'))
     deps.append(('leqm-nrt', '93ae9e6'))
     deps.append(('rtaudio', 'f619b76'))
     # We get our OpenSSL libraries from the environment, but we
diff --git a/src/lib/dcp.cc b/src/lib/dcp.cc
deleted file mode 100644 (file)
index abdfc7f..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
-    Copyright (C) 2014-2021 Carl Hetherington <cth@carlh.net>
-
-    This file is part of DCP-o-matic.
-
-    DCP-o-matic is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    DCP-o-matic is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-
-#include "compose.hpp"
-#include "dcp.h"
-#include "dcp_content.h"
-#include "dcpomatic_log.h"
-#include "log.h"
-#include "util.h"
-#include <dcp/dcp.h>
-#include <dcp/decrypted_kdm.h>
-#include <dcp/exceptions.h>
-
-#include "i18n.h"
-
-
-using std::list;
-using std::string;
-using std::shared_ptr;
-using std::make_shared;
-using std::dynamic_pointer_cast;
-using std::vector;
-
-
-/** Find all the CPLs in our directories, cross-add assets and return the CPLs */
-list<shared_ptr<dcp::CPL>>
-DCP::cpls () const
-{
-       list<shared_ptr<dcp::DCP>> dcps;
-       list<shared_ptr<dcp::CPL>> cpls;
-
-       /** We accept and ignore some warnings / errors but everything else is bad */
-       vector<dcp::VerificationNote::Code> ignore = {
-               dcp::VerificationNote::Code::EMPTY_ASSET_PATH,
-               dcp::VerificationNote::Code::EXTERNAL_ASSET,
-               dcp::VerificationNote::Code::THREED_ASSET_MARKED_AS_TWOD,
-       };
-
-       LOG_GENERAL ("Reading %1 DCP directories", _dcp_content->directories().size());
-       for (auto i: _dcp_content->directories()) {
-               auto dcp = make_shared<dcp::DCP>(i);
-               vector<dcp::VerificationNote> notes;
-               dcp->read (&notes, true);
-               if (!_tolerant) {
-                       for (auto j: notes) {
-                               if (std::find(ignore.begin(), ignore.end(), j.code()) != ignore.end()) {
-                                       LOG_WARNING("Ignoring: %1", dcp::note_to_string(j));
-                               } else {
-                                       boost::throw_exception(dcp::ReadError(dcp::note_to_string(j)));
-                               }
-                       }
-               }
-               dcps.push_back (dcp);
-               LOG_GENERAL ("Reading DCP %1: %2 CPLs", i.string(), dcp->cpls().size());
-               for (auto i: dcp->cpls()) {
-                       cpls.push_back (i);
-               }
-       }
-
-       for (auto i: dcps) {
-               for (auto j: dcps) {
-                       if (i != j) {
-                               i->resolve_refs(j->assets());
-                       }
-               }
-       }
-
-       if (_dcp_content->kdm ()) {
-               auto k = decrypt_kdm_with_helpful_error (_dcp_content->kdm().get());
-               for (auto i: dcps) {
-                       i->add (k);
-               }
-       }
-
-       return cpls;
-}
diff --git a/src/lib/dcp.h b/src/lib/dcp.h
deleted file mode 100644 (file)
index d8e0aec..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
-    Copyright (C) 2014-2016 Carl Hetherington <cth@carlh.net>
-
-    This file is part of DCP-o-matic.
-
-    DCP-o-matic is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    DCP-o-matic is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-
-#ifndef DCPOMATIC_DCP_H
-#define DCPOMATIC_DCP_H
-
-
-#include <list>
-#include <memory>
-
-
-namespace dcp {
-       class CPL;
-}
-
-
-class DCPContent;
-
-
-class DCP
-{
-public:
-       std::list<std::shared_ptr<dcp::CPL>> cpls () const;
-
-protected:
-       explicit DCP (std::shared_ptr<const DCPContent> content, bool tolerant)
-               : _dcp_content (content)
-               , _tolerant (tolerant)
-       {}
-
-       std::shared_ptr<const DCPContent> _dcp_content;
-
-private:
-       bool _tolerant;
-};
-
-
-#endif
index eb1c5f42c2a3a5b525da1f01fe219fc72ef8e7fd..de71c1257c3e61046b5bedfaeaadea9f5bb29ade 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014-2020 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2022 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
index 9973cb663db45bb191a1405b052eb0c78731eca1..df3d9ed1c0abdb2f89040308baeefd1c2ff97034 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014-2021 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2022 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -44,6 +44,7 @@
 #include <dcp/reel_picture_asset.h>
 #include <dcp/reel_sound_asset.h>
 #include <dcp/reel_subtitle_asset.h>
+#include <dcp/search.h>
 #include <dcp/sound_asset_reader.h>
 #include <dcp/sound_frame.h>
 #include <dcp/stereo_picture_asset.h>
@@ -67,23 +68,23 @@ using boost::optional;
 using namespace dcpomatic;
 
 
-DCPDecoder::DCPDecoder (shared_ptr<const Film> film, shared_ptr<const DCPContent> c, bool fast, bool tolerant, shared_ptr<DCPDecoder> old)
-       : DCP (c, tolerant)
-       , Decoder (film)
+DCPDecoder::DCPDecoder (shared_ptr<const Film> film, shared_ptr<const DCPContent> content, bool fast, bool tolerant, shared_ptr<DCPDecoder> old)
+       : Decoder (film)
+       , _dcp_content (content)
 {
-       if (c->can_be_played()) {
-               if (c->video) {
-                       video = make_shared<VideoDecoder>(this, c);
+       if (content->can_be_played()) {
+               if (content->video) {
+                       video = make_shared<VideoDecoder>(this, content);
                }
-               if (c->audio) {
-                       audio = make_shared<AudioDecoder>(this, c->audio, fast);
+               if (content->audio) {
+                       audio = make_shared<AudioDecoder>(this, content->audio, fast);
                }
-               for (auto i: c->text) {
+               for (auto i: content->text) {
                        /* XXX: this time here should be the time of the first subtitle, not 0 */
                        text.push_back (make_shared<TextDecoder>(this, i, ContentTime()));
                }
-               if (c->atmos) {
-                       atmos = make_shared<AtmosDecoder>(this, c);
+               if (content->atmos) {
+                       atmos = make_shared<AtmosDecoder>(this, content);
                }
        }
 
@@ -95,13 +96,13 @@ DCPDecoder::DCPDecoder (shared_ptr<const Film> film, shared_ptr<const DCPContent
           the same before we re-use _reels.
        */
 
-       _lazy_digest = calculate_lazy_digest (c);
+       _lazy_digest = calculate_lazy_digest (content);
 
        if (old && old->lazy_digest() == _lazy_digest) {
                _reels = old->_reels;
        } else {
 
-               auto cpl_list = cpls ();
+               auto cpl_list = dcp::find_and_resolve_cpls (content->directories(), tolerant);
 
                if (cpl_list.empty()) {
                        throw DCPError (_("No CPLs found in DCP."));
@@ -118,9 +119,12 @@ DCPDecoder::DCPDecoder (shared_ptr<const Film> film, shared_ptr<const DCPContent
                        /* No CPL found; probably an old file that doesn't specify it;
                           just use the first one.
                        */
-                       cpl = cpls().front ();
+                       cpl = cpl_list.front();
                }
 
+               if (content->kdm()) {
+                       cpl->add (decrypt_kdm_with_helpful_error(content->kdm().get()));
+               }
                _reels = cpl->reels ();
        }
 
index a4dfbad4e5304f55d07ce2ff809b719708be162a..0882bfd097784295e299fdd155c46fe681b284cc 100644 (file)
@@ -26,7 +26,6 @@
 
 #include "atmos_metadata.h"
 #include "decoder.h"
-#include "dcp.h"
 #include <dcp/mono_picture_asset_reader.h>
 #include <dcp/stereo_picture_asset_reader.h>
 #include <dcp/sound_asset_reader.h>
@@ -42,12 +41,12 @@ class Log;
 struct dcp_subtitle_within_dcp_test;
 
 
-class DCPDecoder : public DCP, public Decoder
+class DCPDecoder : public Decoder
 {
 public:
        DCPDecoder (
                std::shared_ptr<const Film> film,
-               std::shared_ptr<const DCPContent>,
+               std::shared_ptr<const DCPContent> content,
                bool fast,
                bool tolerant,
                std::shared_ptr<DCPDecoder> old
@@ -87,6 +86,8 @@ private:
                );
        std::string calculate_lazy_digest (std::shared_ptr<const DCPContent>) const;
 
+       std::shared_ptr<const DCPContent> _dcp_content;
+
        /** Time of next thing to return from pass relative to the start of _reel */
        dcpomatic::ContentTime _next;
        std::vector<std::shared_ptr<dcp::Reel>> _reels;
index 219c3ee6ed66e993afd40bcd86922db01575580d..9d196a684f36d8cdf49e1392af81108ec59d5ebb 100644 (file)
 */
 
 
-#include "dcp_examiner.h"
+#include "config.h"
 #include "dcp_content.h"
+#include "dcp_examiner.h"
 #include "dcpomatic_log.h"
 #include "exceptions.h"
 #include "image.h"
-#include "config.h"
 #include "util.h"
+#include <dcp/cpl.h>
 #include <dcp/dcp.h>
 #include <dcp/decrypted_kdm.h>
-#include <dcp/cpl.h>
-#include <dcp/reel.h>
-#include <dcp/reel_picture_asset.h>
-#include <dcp/reel_sound_asset.h>
 #include <dcp/mono_picture_asset.h>
 #include <dcp/mono_picture_asset_reader.h>
 #include <dcp/mono_picture_frame.h>
-#include <dcp/stereo_picture_asset.h>
-#include <dcp/stereo_picture_asset_reader.h>
-#include <dcp/stereo_picture_frame.h>
-#include <dcp/sound_asset.h>
-#include <dcp/sound_asset_reader.h>
-#include <dcp/subtitle_asset.h>
+#include <dcp/reel.h>
 #include <dcp/reel_atmos_asset.h>
-#include <dcp/reel_subtitle_asset.h>
 #include <dcp/reel_closed_caption_asset.h>
 #include <dcp/reel_markers_asset.h>
+#include <dcp/reel_picture_asset.h>
+#include <dcp/reel_sound_asset.h>
+#include <dcp/reel_subtitle_asset.h>
+#include <dcp/search.h>
+#include <dcp/sound_asset.h>
 #include <dcp/sound_asset.h>
+#include <dcp/sound_asset_reader.h>
+#include <dcp/stereo_picture_asset.h>
+#include <dcp/stereo_picture_asset_reader.h>
+#include <dcp/stereo_picture_frame.h>
+#include <dcp/subtitle_asset.h>
 #include <iostream>
 
 #include "i18n.h"
@@ -59,7 +60,6 @@ using boost::optional;
 
 
 DCPExaminer::DCPExaminer (shared_ptr<const DCPContent> content, bool tolerant)
-       : DCP (content, tolerant)
 {
        shared_ptr<dcp::CPL> cpl;
 
@@ -67,9 +67,11 @@ DCPExaminer::DCPExaminer (shared_ptr<const DCPContent> content, bool tolerant)
                _text_count[i] = 0;
        }
 
+       auto cpls = dcp::find_and_resolve_cpls (content->directories(), tolerant);
+
        if (content->cpl ()) {
                /* Use the CPL that the content was using before */
-               for (auto i: cpls()) {
+               for (auto i: cpls) {
                        if (i->id() == content->cpl().get()) {
                                cpl = i;
                        }
@@ -79,7 +81,7 @@ DCPExaminer::DCPExaminer (shared_ptr<const DCPContent> content, bool tolerant)
 
                int least_unsatisfied = INT_MAX;
 
-               for (auto i: cpls()) {
+               for (auto i: cpls) {
                        int unsatisfied = 0;
                        for (auto j: i->reels()) {
                                if (j->main_picture() && !j->main_picture()->asset_ref().resolved()) {
@@ -107,6 +109,10 @@ DCPExaminer::DCPExaminer (shared_ptr<const DCPContent> content, bool tolerant)
                throw DCPError ("No CPLs found in DCP");
        }
 
+       if (content->kdm()) {
+               cpl->add (decrypt_kdm_with_helpful_error(content->kdm().get()));
+       }
+
        _cpl = cpl->id ();
        _name = cpl->content_title_text ();
        _content_kind = cpl->content_kind ();
index fd643a754ff78cfa2caaa7bf80a332173810360f..4098ea3d189bc5a568b206864763f5b29819116a 100644 (file)
  *  @brief DCPExaminer class.
  */
 
-#include "video_examiner.h"
+
 #include "audio_examiner.h"
-#include "dcp.h"
 #include "dcp_text_track.h"
 #include "dcpomatic_assert.h"
+#include "video_examiner.h"
 #include <dcp/dcp_time.h>
 
+
 class DCPContent;
 
-class DCPExaminer : public DCP, public VideoExaminer, public AudioExaminer
+
+class DCPExaminer : public VideoExaminer, public AudioExaminer
 {
 public:
        explicit DCPExaminer (std::shared_ptr<const DCPContent>, bool tolerant);
index c24394b98eb8ffc197d6f198c107493264eabd51..4eb2269b249f7b3eb7c7963471b69dbb4d1acf0f 100644 (file)
 
 
 #include "config.h"
+#include "dcp_content.h"
 #include "dcp_digest_file.h"
-#include "dcp_transcode_job.h"
 #include "film.h"
 #include "job_manager.h"
 #include "upload_job.h"
 #include <dcp/cpl.h>
+#include <dcp/search.h>
 
 
 using std::make_shared;
index 963cf8d4aff694184926ba3be28d3bdcfbe7ce1d..8bf03eeee438504301950df87d35b148fb3f50ef 100644 (file)
@@ -62,7 +62,6 @@ sources = """
           crypto.cc
           curl_uploader.cc
           datasat_ap2x.cc
-          dcp.cc
           dcp_content.cc
           dcp_content_type.cc
           dcp_decoder.cc
index 24f2d73ad194b923a1e20534594b922b996eae06..f6d140db2858f6d14a2000c5a98f44a2057b3c55 100644 (file)
@@ -38,7 +38,6 @@
 #include "lib/config.h"
 #include "lib/cross.h"
 #include "lib/dcp_content.h"
-#include "lib/dcp_examiner.h"
 #include "lib/dcpomatic_log.h"
 #include "lib/dcpomatic_socket.h"
 #include "lib/examine_content_job.h"
@@ -65,6 +64,7 @@
 #include <dcp/cpl.h>
 #include <dcp/dcp.h>
 #include <dcp/exceptions.h>
+#include <dcp/search.h>
 #include <dcp/raw_convert.h>
 #include <wx/cmdline.h>
 #include <wx/display.h>
@@ -440,9 +440,8 @@ public:
                        /* Offer a CPL menu */
                        auto first = dynamic_pointer_cast<DCPContent>(_film->content().front());
                        if (first) {
-                               DCPExaminer ex (first, true);
                                int id = ID_view_cpl;
-                               for (auto i: ex.cpls()) {
+                               for (auto i: dcp::find_and_resolve_cpls(first->directories(), true)) {
                                        auto j = _cpl_menu->AppendRadioItem(
                                                id,
                                                wxString::Format("%s (%s)", std_to_wx(i->annotation_text().get_value_or("")).data(), std_to_wx(i->id()).data())
@@ -735,11 +734,10 @@ private:
        {
                auto dcp = std::dynamic_pointer_cast<DCPContent>(_film->content().front());
                DCPOMATIC_ASSERT (dcp);
-               DCPExaminer ex (dcp, true);
+               auto cpls = dcp::find_and_resolve_cpls (dcp->directories(), true);
                int id = ev.GetId() - ID_view_cpl;
                DCPOMATIC_ASSERT (id >= 0);
-               DCPOMATIC_ASSERT (id < int(ex.cpls().size()));
-               auto cpls = ex.cpls();
+               DCPOMATIC_ASSERT (id < int(cpls.size()));
                auto i = cpls.begin();
                while (id > 0) {
                        ++i;
index 4c0afdf3a05475968dffc26eca6f1b4995360a9d..54306b1a90d3a4f6d73fd71999668bd6409dea08 100644 (file)
@@ -31,7 +31,6 @@
 #include "lib/content_factory.h"
 #include "lib/copy_dcp_details_to_film.h"
 #include "lib/dcp_content.h"
-#include "lib/dcp_examiner.h"
 #include "lib/examine_content_job.h"
 #include "lib/exceptions.h"
 #include "lib/ffmpeg_content.h"
 #include <dcp/cpl.h>
 #include <dcp/decrypted_kdm.h>
 #include <dcp/exceptions.h>
+#include <dcp/search.h>
 #include <wx/dirdlg.h>
 #include <wx/wx.h>
+#include <algorithm>
 #include <iostream>
 
 
@@ -146,8 +147,7 @@ ContentMenu::popup (weak_ptr<Film> film, ContentList c, TimelineContentViewList
                        _ov->Enable (dcp->needs_assets ());
                        _set_dcp_settings->Enable (static_cast<bool>(dcp));
                        try {
-                               DCPExaminer ex (dcp, true);
-                               auto cpls = ex.cpls ();
+                               auto cpls = dcp::find_and_resolve_cpls (dcp->directories(), true);
                                _choose_cpl->Enable (cpls.size() > 1);
                                /* We can't have 0 as a menu item ID on OS X */
                                int id = 1;
@@ -394,16 +394,9 @@ ContentMenu::kdm ()
                        return;
                }
 
-               DCPExaminer ex (dcp, true);
-
-               bool kdm_matches_any_cpl = false;
-               for (auto i: ex.cpls()) {
-                       if (i->id() == kdm->cpl_id()) {
-                               kdm_matches_any_cpl = true;
-                       }
-               }
-
-               bool kdm_matches_selected_cpl = dcp->cpl() || kdm->cpl_id() == dcp->cpl().get();
+               auto cpls = dcp::find_and_resolve_cpls (dcp->directories(), true);
+               bool const kdm_matches_any_cpl = std::any_of(cpls.begin(), cpls.end(), [kdm](shared_ptr<const dcp::CPL> cpl) { return cpl->id() == kdm->cpl_id(); });
+               bool const kdm_matches_selected_cpl = dcp->cpl() || kdm->cpl_id() == dcp->cpl().get();
 
                if (!kdm_matches_any_cpl) {
                        error_dialog (_parent, _("This KDM was not made for this DCP.  You will need a different one."));
@@ -474,8 +467,7 @@ ContentMenu::cpl_selected (wxCommandEvent& ev)
        auto dcp = dynamic_pointer_cast<DCPContent> (_content.front());
        DCPOMATIC_ASSERT (dcp);
 
-       DCPExaminer ex (dcp, true);
-       auto cpls = ex.cpls ();
+       auto cpls = dcp::find_and_resolve_cpls (dcp->directories(), true);
        DCPOMATIC_ASSERT (ev.GetId() > 0);
        DCPOMATIC_ASSERT (ev.GetId() <= int (cpls.size()));