Remove DCP class and replace its functionality with a plain method in libdcp.
authorCarl Hetherington <cth@carlh.net>
Wed, 20 Apr 2022 19:17:54 +0000 (21:17 +0200)
committerCarl Hetherington <cth@carlh.net>
Wed, 20 Apr 2022 19:17:54 +0000 (21:17 +0200)
cscript
src/lib/dcp.cc [deleted file]
src/lib/dcp.h [deleted file]
src/lib/dcp_decoder.cc
src/lib/dcp_decoder.h
src/lib/dcp_examiner.cc
src/lib/dcp_examiner.h
src/lib/wscript
src/tools/dcpomatic_player.cc
src/wx/content_menu.cc

diff --git a/cscript b/cscript
index a12771488867a045acea19a7c63da28bc6234d1e..9fe44e228670c263dc6b4a8f6e3af5d5bb37e3a5 100644 (file)
--- a/cscript
+++ b/cscript
@@ -424,8 +424,8 @@ def dependencies(target, options):
         # Use distro-provided FFmpeg on Arch
         deps = []
 
-    deps.append(('libdcp', 'v1.8.13'))
-    deps.append(('libsub', 'v1.6.14'))
+    deps.append(('libdcp', 'v1.8.14'))
+    deps.append(('libsub', 'v1.6.15'))
     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 8fb27db..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(true));
-                       }
-               }
-       }
-
-       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 85c5d3297d0d6a8acb704f523bf70d01524446e4..542a8ff7c3a66f70db4737c4a44f71da28b0f47c 100644 (file)
@@ -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>
@@ -68,8 +69,8 @@ using namespace dcpomatic;
 
 
 DCPDecoder::DCPDecoder (shared_ptr<const Film> film, shared_ptr<const DCPContent> content, bool fast, bool tolerant, shared_ptr<DCPDecoder> old)
-       : DCP (content, tolerant)
-       , Decoder (film)
+       : Decoder (film)
+       , _dcp_content (content)
 {
        if (content->can_be_played()) {
                if (content->video) {
@@ -101,7 +102,7 @@ DCPDecoder::DCPDecoder (shared_ptr<const Film> film, shared_ptr<const DCPContent
                _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,7 +119,11 @@ 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 cf4835c062057fd99b278882737001e9b1d7c15c..f2ec68bddd8786a9a73f6258dc8d757c8600b50b 100644 (file)
@@ -39,6 +39,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.h>
 #include <dcp/sound_asset.h>
 #include <dcp/sound_asset_reader.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 68508847f4125dce5c33936bd11072085cb1d9db..a5bf2434e8d23ca28a510bc762a4409cb65c105f 100644 (file)
@@ -25,7 +25,6 @@
 
 
 #include "audio_examiner.h"
-#include "dcp.h"
 #include "dcp_text_track.h"
 #include "dcpomatic_assert.h"
 #include "video_examiner.h"
@@ -36,7 +35,7 @@
 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 6515ebf9fa4926a2beb65b01af27cf5909ec0e5f..86b7561be84d8b4f67d0ec9765ed016b76705d59 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 18251b4ecc5934c84972f4bd8fad09e093deaa60..4d4531eeed035a9c94f04f0187a24b82c354b5c5 100644 (file)
@@ -61,6 +61,7 @@
 #include <dcp/dcp.h>
 #include <dcp/raw_convert.h>
 #include <dcp/exceptions.h>
+#include <dcp/search.h>
 #include <wx/cmdline.h>
 #include <wx/display.h>
 #include <wx/preferences.h>
@@ -437,9 +438,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())
@@ -694,11 +694,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 6c635db0b02c7ac6e5c29de9cea8aa95433aad1e..137ef97dca981f1b4081ad0163225ec914c7568d 100644 (file)
@@ -42,6 +42,7 @@
 #include <dcp/cpl.h>
 #include <dcp/exceptions.h>
 #include <dcp/decrypted_kdm.h>
+#include <dcp/search.h>
 #include <wx/wx.h>
 #include <wx/dirdlg.h>
 #include <iostream>
@@ -145,8 +146,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;
@@ -437,16 +437,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."));
@@ -517,8 +510,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()));