summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2022-04-20 21:17:54 +0200
committerCarl Hetherington <cth@carlh.net>2022-04-20 21:17:54 +0200
commit86eb90b563efb7ef093d5b17a5d6db0fc330e301 (patch)
tree61d19ca8d8222b8191bd12e650bf4f831b42c180 /src
parent3855bfd7991b1d7411934fc564dd5714eca6bc1b (diff)
Remove DCP class and replace its functionality with a plain method in libdcp.
Diffstat (limited to 'src')
-rw-r--r--src/lib/dcp.cc94
-rw-r--r--src/lib/dcp.h56
-rw-r--r--src/lib/dcp_decoder.cc13
-rw-r--r--src/lib/dcp_decoder.h7
-rw-r--r--src/lib/dcp_examiner.cc12
-rw-r--r--src/lib/dcp_examiner.h3
-rw-r--r--src/lib/wscript1
-rw-r--r--src/tools/dcpomatic_player.cc9
-rw-r--r--src/wx/content_menu.cc20
9 files changed, 33 insertions, 182 deletions
diff --git a/src/lib/dcp.cc b/src/lib/dcp.cc
deleted file mode 100644
index 8fb27db57..000000000
--- a/src/lib/dcp.cc
+++ /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
index d8e0aec27..000000000
--- a/src/lib/dcp.h
+++ /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
diff --git a/src/lib/dcp_decoder.cc b/src/lib/dcp_decoder.cc
index 85c5d3297..542a8ff7c 100644
--- a/src/lib/dcp_decoder.cc
+++ b/src/lib/dcp_decoder.cc
@@ -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 ();
diff --git a/src/lib/dcp_decoder.h b/src/lib/dcp_decoder.h
index a4dfbad4e..0882bfd09 100644
--- a/src/lib/dcp_decoder.h
+++ b/src/lib/dcp_decoder.h
@@ -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;
diff --git a/src/lib/dcp_examiner.cc b/src/lib/dcp_examiner.cc
index cf4835c06..f2ec68bdd 100644
--- a/src/lib/dcp_examiner.cc
+++ b/src/lib/dcp_examiner.cc
@@ -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 ();
diff --git a/src/lib/dcp_examiner.h b/src/lib/dcp_examiner.h
index 68508847f..a5bf2434e 100644
--- a/src/lib/dcp_examiner.h
+++ b/src/lib/dcp_examiner.h
@@ -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);
diff --git a/src/lib/wscript b/src/lib/wscript
index 6515ebf9f..86b7561be 100644
--- a/src/lib/wscript
+++ b/src/lib/wscript
@@ -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
diff --git a/src/tools/dcpomatic_player.cc b/src/tools/dcpomatic_player.cc
index 18251b4ec..4d4531eee 100644
--- a/src/tools/dcpomatic_player.cc
+++ b/src/tools/dcpomatic_player.cc
@@ -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;
diff --git a/src/wx/content_menu.cc b/src/wx/content_menu.cc
index 6c635db0b..137ef97dc 100644
--- a/src/wx/content_menu.cc
+++ b/src/wx/content_menu.cc
@@ -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()));