Basic J2K hash checking.
authorCarl Hetherington <cth@carlh.net>
Tue, 25 Sep 2012 00:20:58 +0000 (01:20 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 25 Sep 2012 00:20:58 +0000 (01:20 +0100)
src/lib/check_hashes_job.cc [new file with mode: 0644]
src/lib/check_hashes_job.h [new file with mode: 0644]
src/lib/dcp_video_frame.cc
src/lib/film.cc
src/lib/transcode_job.cc
src/lib/util.h
src/lib/wscript

diff --git a/src/lib/check_hashes_job.cc b/src/lib/check_hashes_job.cc
new file mode 100644 (file)
index 0000000..87eb40d
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+    Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
+
+    This program 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.
+
+    This program 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 this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <fstream>
+#include <boost/lexical_cast.hpp>
+#include <boost/filesystem.hpp>
+#include "check_hashes_job.h"
+#include "film_state.h"
+#include "options.h"
+#include "log.h"
+
+using namespace std;
+using namespace boost;
+
+CheckHashesJob::CheckHashesJob (shared_ptr<const FilmState> s, shared_ptr<const Options> o, Log* l)
+       : Job (s, o, l)
+       , _bad (0)
+{
+
+}
+
+string
+CheckHashesJob::name () const
+{
+       stringstream s;
+       s << "Check hashes of " << _fs->name;
+       return s.str ();
+}
+
+void
+CheckHashesJob::run ()
+{
+       _bad = 0;
+       
+       for (int i = 0; i < _fs->length; ++i) {
+               string const j2k_file = _opt->frame_out_path (i, false);
+               string const hash_file = j2k_file + ".md5";
+
+               ifstream ref (hash_file.c_str ());
+               string hash;
+               ref >> hash;
+
+               if (hash != md5_digest (j2k_file)) {
+                       _log->log ("Frame " + lexical_cast<string> (i) + " has wrong hash; deleting.");
+                       filesystem::remove (j2k_file);
+                       filesystem::remove (hash_file);
+                       ++_bad;
+               }
+
+               set_progress (float (i) / _fs->length);
+       }
+
+       set_progress (1);
+       set_state (FINISHED_OK);
+}
+
+string
+CheckHashesJob::status () const
+{
+       stringstream s;
+       s << Job::status () << "; " << _bad << " bad frames found";
+       return s.str ();
+}
diff --git a/src/lib/check_hashes_job.h b/src/lib/check_hashes_job.h
new file mode 100644 (file)
index 0000000..b59cf03
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+    Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
+
+    This program 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.
+
+    This program 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 this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "job.h"
+
+class CheckHashesJob : public Job
+{
+public:
+       CheckHashesJob (boost::shared_ptr<const FilmState> s, boost::shared_ptr<const Options> o, Log* l);
+
+       std::string name () const;
+       void run ();
+       std::string status () const;
+
+private:
+       int _bad;
+};
index 96c40358a46176385ae67624cccd38e41c014808..da7133c4ba2a7f6552d76819dd7acc01ab22cac8 100644 (file)
@@ -36,6 +36,7 @@
 #include <iomanip>
 #include <sstream>
 #include <iostream>
+#include <fstream>
 #include <unistd.h>
 #include <errno.h>
 #include <boost/array.hpp>
@@ -344,8 +345,16 @@ EncodedData::write (shared_ptr<const Options> opt, int frame)
        fwrite (_data, 1, _size, f);
        fclose (f);
 
+       string const real_j2k = opt->frame_out_path (frame, false);
+
        /* Rename the file from foo.j2c.tmp to foo.j2c now that it is complete */
-       filesystem::rename (tmp_j2k, opt->frame_out_path (frame, false));
+       filesystem::rename (tmp_j2k, real_j2k);
+
+       /* Write a file containing the hash */
+       string const hash = real_j2k + ".md5";
+       ofstream h (hash.c_str());
+       h << md5_digest (_data, _size) << "\n";
+       h.close ();
 }
 
 /** Send this data to a socket.
index d1334130e5eb57ffc25ccd887d3d349c23972445..583a15e19cc472af6ae2ecca5c73077b174ecd17 100644 (file)
@@ -48,6 +48,7 @@
 #include "scaler.h"
 #include "decoder_factory.h"
 #include "config.h"
+#include "check_hashes_job.h"
 
 using namespace std;
 using namespace boost;
@@ -544,7 +545,8 @@ Film::make_dcp (bool transcode, int freq)
                        JobManager::instance()->add (shared_ptr<Job> (new TranscodeJob (fs, o, log ())));
                }
        }
-       
+
+       JobManager::instance()->add (shared_ptr<Job> (new CheckHashesJob (fs, o, log ())));
        JobManager::instance()->add (shared_ptr<Job> (new MakeDCPJob (fs, o, log ())));
 }
 
index c910589739bf0433e1e4ddd9187a5d060b3c63d2..2de6e90ca850e76769f5907c6839d4a955b63846 100644 (file)
@@ -78,7 +78,6 @@ TranscodeJob::run ()
                _log->log (s.str ());
 
                throw;
-
        }
 }
 
index 03d04b852c3a859edc611d05bf4847aab2bb72ef..bc5a00fc47e2a63b8d8edd3db5f18fd4f52d65c6 100644 (file)
@@ -46,14 +46,13 @@ extern double seconds (struct timeval);
 extern void dvdomatic_setup ();
 extern std::vector<std::string> split_at_spaces_considering_quotes (std::string);
 extern std::string md5_digest (std::string);
+extern std::string md5_digest (void const *, int);
 
 enum ContentType {
        STILL,
        VIDEO
 };
 
-extern std::string md5_hash (void const *, int);
-
 /** @class Size
  *  @brief Representation of the size of something */
 struct Size
index 803ffd9ee058e40a77bd62d1309be91ca19e49a8..c809226ce59adbb8a5377d8bcd8b500b205953b9 100644 (file)
@@ -8,6 +8,7 @@ def build(bld):
     obj.source = """
                 ab_transcode_job.cc
                 ab_transcoder.cc
+                 check_hashes_job.cc
                 config.cc
                 copy_from_dvd_job.cc
                  cross.cc