Add dcp::LocalTime::millisecond().
[libdcp.git] / tools / dcpverify.cc
index c26fe7c4d0973e1500b9bd58a8dd81425878b720..b9b3c9974c78168905afe54520d73c14c46fc259 100644 (file)
@@ -37,7 +37,6 @@
 #include <boost/bind.hpp>
 #include <boost/optional.hpp>
 #include <boost/filesystem.hpp>
-#include <boost/foreach.hpp>
 #include <getopt.h>
 #include <iostream>
 #include <cstdlib>
@@ -57,28 +56,10 @@ help (string n)
             << "  -V, --version           show libdcp version\n"
             << "  -h, --help              show this help\n"
             << "  --ignore-missing-assets don't give errors about missing assets\n"
+            << "  --ignore-bv21-smpte     don't give the SMPTE Bv2.1 error about a DCP not being SMPTE\n"
             << "  -q, --quiet             don't report progress\n";
 }
 
-void
-stage (bool quiet, string s, optional<boost::filesystem::path> path)
-{
-       if (quiet) {
-               return;
-       }
-
-       if (path) {
-               cout << s << ": " << path->string() << "\n";
-       } else {
-               cout << s << "\n";
-       }
-}
-
-void
-progress ()
-{
-
-}
 
 int
 main (int argc, char* argv[])
@@ -86,6 +67,7 @@ main (int argc, char* argv[])
        dcp::init ();
 
        bool ignore_missing_assets = false;
+       bool ignore_bv21_smpte = false;
        bool quiet = false;
 
        int option_index = 0;
@@ -94,11 +76,12 @@ main (int argc, char* argv[])
                        { "version", no_argument, 0, 'V' },
                        { "help", no_argument, 0, 'h' },
                        { "ignore-missing-assets", no_argument, 0, 'A' },
+                       { "ignore-bv21-smpte", no_argument, 0, 'B' },
                        { "quiet", no_argument, 0, 'q' },
                        { 0, 0, 0, 0 }
                };
 
-               int c = getopt_long (argc, argv, "VhAq", long_options, &option_index);
+               int c = getopt_long (argc, argv, "VhABq", long_options, &option_index);
 
                if (c == -1) {
                        break;
@@ -114,6 +97,9 @@ main (int argc, char* argv[])
                case 'A':
                        ignore_missing_assets = true;
                        break;
+               case 'B':
+                       ignore_bv21_smpte = true;
+                       break;
                case 'q':
                        quiet = true;
                        break;
@@ -130,28 +116,74 @@ main (int argc, char* argv[])
                exit (EXIT_FAILURE);
        }
 
+       auto stage = [quiet](string s, optional<boost::filesystem::path> path) {
+               if (quiet) {
+                       return;
+               }
+
+               if (path) {
+                       cout << s << ": " << path->string() << "\n";
+               } else {
+                       cout << s << "\n";
+               }
+       };
+
+       auto progress = [quiet](float amount) {
+               if (quiet) {
+                       return;
+               }
+               int const width = 60;
+               int const index = std::rint(amount * width);
+               cout << "[";
+               for (int i = 0; i < width; ++i) {
+                       if (i < index) {
+                               std::cout << "=";
+                       } else if (i == index) {
+                               std::cout << ">";
+                       } else {
+                               std::cout << " ";
+                       }
+               }
+               cout << "] " << std::rint(amount * 100) << "%\r";
+               cout.flush();
+       };
+
        vector<boost::filesystem::path> directories;
        directories.push_back (argv[optind]);
-       list<dcp::VerificationNote> notes = dcp::verify (directories, bind(&stage, quiet, _1, _2), bind(&progress), "xsd");
+       auto notes = dcp::verify(directories, stage, progress);
        dcp::filter_notes (notes, ignore_missing_assets);
 
+       if (!quiet) {
+               cout << "\n";
+       }
+
        bool failed = false;
-       BOOST_FOREACH (dcp::VerificationNote i, notes) {
+       bool bv21_failed = false;
+       bool warned = false;
+       for (auto i: notes) {
+               if (ignore_bv21_smpte && i.code() == dcp::VerificationNote::Code::INVALID_STANDARD) {
+                       continue;
+               }
                switch (i.type()) {
-               case dcp::VerificationNote::VERIFY_ERROR:
+               case dcp::VerificationNote::Type::ERROR:
                        cout << "Error: " << note_to_string(i) << "\n";
                        failed = true;
                        break;
-               case dcp::VerificationNote::VERIFY_BV21_ERROR:
+               case dcp::VerificationNote::Type::BV21_ERROR:
                        cout << "Bv2.1 error: " << note_to_string(i) << "\n";
+                       bv21_failed = true;
                        break;
-               case dcp::VerificationNote::VERIFY_WARNING:
+               case dcp::VerificationNote::Type::WARNING:
                        cout << "Warning: " << note_to_string(i) << "\n";
+                       warned = true;
                        break;
                }
        }
 
        if (!failed && !quiet) {
+               if (bv21_failed || warned) {
+                       cout << "\n";
+               }
                cout << "DCP verified OK.\n";
        }