summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2016-05-09 22:44:02 +0100
committerCarl Hetherington <cth@carlh.net>2016-05-09 22:44:02 +0100
commit8d8e9f96ef2023e709cacd263cee608443cecb03 (patch)
tree1880a44a04b5b63ece475444a99454c1424223fa
parent29d0bfcd3a89b68f52ffd4cee40634acbe4640cd (diff)
Factor out checking of a single picture frame's hash.
-rw-r--r--src/lib/reel_writer.cc71
-rw-r--r--src/lib/reel_writer.h1
2 files changed, 37 insertions, 35 deletions
diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc
index 8243056f3..ae06abc4c 100644
--- a/src/lib/reel_writer.cc
+++ b/src/lib/reel_writer.cc
@@ -200,43 +200,11 @@ ReelWriter::check_existing_picture_asset ()
_first_nonexistant_frame = n;
}
- bool ok = false;
-
- while (!ok && _first_nonexistant_frame > 0) {
-
- LOG_GENERAL ("Checking first nonexistant frame %1", _first_nonexistant_frame);
-
- /* Read the data from the info file; for 3D we just check the left
- frames until we find a good one.
- */
- dcp::FrameInfo info = read_frame_info (info_file, _first_nonexistant_frame, _film->three_d () ? EYES_LEFT : EYES_BOTH);
-
- ok = true;
-
- /* Read the data from the asset and hash it */
- dcpomatic_fseek (asset_file, info.offset, SEEK_SET);
- Data data (info.size);
- size_t const read = fread (data.data().get(), 1, data.size(), asset_file);
- LOG_GENERAL ("Read %1 bytes of asset data; wanted %2", read, info.size);
- if (read != static_cast<size_t> (data.size ())) {
- LOG_GENERAL ("Existing frame %1 is incomplete", _first_nonexistant_frame);
- ok = false;
- } else {
- MD5Digester digester;
- digester.add (data.data().get(), data.size());
- LOG_GENERAL ("Hash %1 vs %2", digester.get(), info.hash);
- if (digester.get() != info.hash) {
- LOG_GENERAL ("Existing frame %1 failed hash check", _first_nonexistant_frame);
- ok = false;
- }
- }
-
- if (!ok) {
- --_first_nonexistant_frame;
- }
+ while (!existing_picture_frame_ok(asset_file, info_file) && _first_nonexistant_frame > 0) {
+ --_first_nonexistant_frame;
}
- if (!_film->three_d() && ok) {
+ if (!_film->three_d() && _first_nonexistant_frame > 0) {
/* If we are doing 3D we might have found a good L frame with no R, so only
do this if we're in 2D and we've just found a good B(oth) frame.
*/
@@ -502,3 +470,36 @@ ReelWriter::write (PlayerSubtitles subs)
_subtitle_asset->add (i);
}
}
+
+bool
+ReelWriter::existing_picture_frame_ok (FILE* asset_file, FILE* info_file) const
+{
+ LOG_GENERAL ("Checking existing picture frame %1", _first_nonexistant_frame);
+
+ /* Read the data from the info file; for 3D we just check the left
+ frames until we find a good one.
+ */
+ dcp::FrameInfo const info = read_frame_info (info_file, _first_nonexistant_frame, _film->three_d () ? EYES_LEFT : EYES_BOTH);
+
+ bool ok = true;
+
+ /* Read the data from the asset and hash it */
+ dcpomatic_fseek (asset_file, info.offset, SEEK_SET);
+ Data data (info.size);
+ size_t const read = fread (data.data().get(), 1, data.size(), asset_file);
+ LOG_GENERAL ("Read %1 bytes of asset data; wanted %2", read, info.size);
+ if (read != static_cast<size_t> (data.size ())) {
+ LOG_GENERAL ("Existing frame %1 is incomplete", _first_nonexistant_frame);
+ ok = false;
+ } else {
+ MD5Digester digester;
+ digester.add (data.data().get(), data.size());
+ LOG_GENERAL ("Hash %1 vs %2", digester.get(), info.hash);
+ if (digester.get() != info.hash) {
+ LOG_GENERAL ("Existing frame %1 failed hash check", _first_nonexistant_frame);
+ ok = false;
+ }
+ }
+
+ return ok;
+}
diff --git a/src/lib/reel_writer.h b/src/lib/reel_writer.h
index 64b62fe22..dd98f0c49 100644
--- a/src/lib/reel_writer.h
+++ b/src/lib/reel_writer.h
@@ -87,6 +87,7 @@ private:
void write_frame_info (Frame frame, Eyes eyes, dcp::FrameInfo info) const;
long frame_info_position (Frame frame, Eyes eyes) const;
void check_existing_picture_asset ();
+ bool existing_picture_frame_ok (FILE* asset_file, FILE* info_file) const;
boost::shared_ptr<const Film> _film;