X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fverify.cc;h=db65595451347145ff56f60c1dc2f5a758eb16e1;hb=9f75a44df591954519ac828a1b50b6d5ebd2a3a1;hp=76d7c18d401a4c27f72f0177e419abea61d41854;hpb=623e1979815d1282b4a4ce5fadf8e8a6e93a8368;p=libdcp.git diff --git a/src/verify.cc b/src/verify.cc index 76d7c18d..db655954 100644 --- a/src/verify.cc +++ b/src/verify.cc @@ -33,19 +33,58 @@ #include "verify.h" #include "dcp.h" +#include "cpl.h" +#include "reel.h" +#include "reel_picture_asset.h" +#include "reel_sound_asset.h" #include "exceptions.h" #include #include #include +#include using std::list; using std::vector; +using std::string; +using std::cout; using boost::shared_ptr; +using boost::optional; +using boost::function; using namespace dcp; +enum Result { + RESULT_GOOD, + RESULT_CPL_PKL_DIFFER, + RESULT_BAD +}; + +static Result +verify_asset (shared_ptr dcp, shared_ptr reel_asset, function progress) +{ + string const actual_hash = reel_asset->asset_ref()->hash(progress); + + shared_ptr pkl = dcp->pkl(); + /* We've read this DCP in so it must have a PKL */ + DCP_ASSERT (pkl); + + shared_ptr asset = reel_asset->asset_ref().asset(); + string const pkl_hash = pkl->hash (reel_asset->asset_ref()->id()); + + optional cpl_hash = reel_asset->hash(); + if (cpl_hash && *cpl_hash != pkl_hash) { + return RESULT_CPL_PKL_DIFFER; + } + + if (actual_hash != pkl_hash) { + return RESULT_BAD; + } + + return RESULT_GOOD; +} + list -dcp::verify (vector directories) +dcp::verify (vector directories, function)> stage, function progress) { list notes; @@ -54,14 +93,50 @@ dcp::verify (vector directories) dcps.push_back (shared_ptr (new DCP (i))); } - BOOST_FOREACH (shared_ptr i, dcps) { + BOOST_FOREACH (shared_ptr dcp, dcps) { + stage ("Checking DCP", dcp->directory()); DCP::ReadErrors errors; try { - i->read (true, &errors); + dcp->read (true, &errors); } catch (DCPReadError& e) { - notes.push_back (VerificationNote (VerificationNote::ERROR, e.what ())); + notes.push_back (VerificationNote (VerificationNote::VERIFY_ERROR, e.what ())); } catch (XMLError& e) { - notes.push_back (VerificationNote (VerificationNote::ERROR, e.what ())); + notes.push_back (VerificationNote (VerificationNote::VERIFY_ERROR, e.what ())); + } + + BOOST_FOREACH (shared_ptr cpl, dcp->cpls()) { + stage ("Checking CPL", cpl->file()); + BOOST_FOREACH (shared_ptr reel, cpl->reels()) { + stage ("Checking reel", optional()); + if (reel->main_picture()) { + stage ("Checking picture asset hash", reel->main_picture()->asset()->file()); + Result const r = verify_asset (dcp, reel->main_picture(), progress); + switch (r) { + case RESULT_BAD: + notes.push_back (VerificationNote (VerificationNote::VERIFY_ERROR, "Picture asset hash is incorrect.")); + break; + case RESULT_CPL_PKL_DIFFER: + notes.push_back (VerificationNote (VerificationNote::VERIFY_ERROR, "PKL and CPL hashes differ for picture asset.")); + break; + default: + break; + } + } + if (reel->main_sound()) { + stage ("Checking sound asset hash", reel->main_sound()->asset()->file()); + Result const r = verify_asset (dcp, reel->main_sound(), progress); + switch (r) { + case RESULT_BAD: + notes.push_back (VerificationNote (VerificationNote::VERIFY_ERROR, "Sound asset hash is incorrect.")); + break; + case RESULT_CPL_PKL_DIFFER: + notes.push_back (VerificationNote (VerificationNote::VERIFY_ERROR, "PKL and CPL hashes differ for sound asset.")); + break; + default: + break; + } + } + } } }