# 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
+++ /dev/null
-/*
- 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 (¬es, 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;
-}
+++ /dev/null
-/*
- 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
#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>
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) {
_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."));
/* 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 ();
#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>
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
);
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;
#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>
DCPExaminer::DCPExaminer (shared_ptr<const DCPContent> content, bool tolerant)
- : DCP (content, tolerant)
{
shared_ptr<dcp::CPL> cpl;
_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;
}
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()) {
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 ();
#include "audio_examiner.h"
-#include "dcp.h"
#include "dcp_text_track.h"
#include "dcpomatic_assert.h"
#include "video_examiner.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);
crypto.cc
curl_uploader.cc
datasat_ap2x.cc
- dcp.cc
dcp_content.cc
dcp_content_type.cc
dcp_decoder.cc
#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>
/* 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())
{
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;
#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>
_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;
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."));
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()));