summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-02-17 23:43:23 +0000
committerCarl Hetherington <cth@carlh.net>2015-02-17 23:43:23 +0000
commitbd0ddc4da8fa288130dbadd34f84de0ed3368d01 (patch)
treeb549b01ee6f950f1b8ff0ee944e8fd5e68fdb37f /src
parentf2416324fdaef8d75678da751446113fbe19de8a (diff)
Hand-apply 71a4c0f5440688a38a2bb34170a3ccf9b1ea598f from 1.x;
correctly sort image sequences.
Diffstat (limited to 'src')
-rw-r--r--src/lib/image_content.cc4
-rw-r--r--src/lib/image_filename_sorter.cc62
2 files changed, 65 insertions, 1 deletions
diff --git a/src/lib/image_content.cc b/src/lib/image_content.cc
index eb8b35210..a9cb148c2 100644
--- a/src/lib/image_content.cc
+++ b/src/lib/image_content.cc
@@ -29,6 +29,8 @@
#include "i18n.h"
+#include "image_filename_sorter.cc"
+
using std::string;
using std::cout;
using boost::shared_ptr;
@@ -57,7 +59,7 @@ ImageContent::ImageContent (shared_ptr<const Film> f, boost::filesystem::path p)
throw FileError (_("No valid image files were found in the folder."), p);
}
- sort (_paths.begin(), _paths.end());
+ sort (_paths.begin(), _paths.end(), ImageFilenameSorter ());
}
if (have_j2k) {
diff --git a/src/lib/image_filename_sorter.cc b/src/lib/image_filename_sorter.cc
new file mode 100644
index 000000000..72f67e615
--- /dev/null
+++ b/src/lib/image_filename_sorter.cc
@@ -0,0 +1,62 @@
+/*
+ Copyright (C) 2015 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 <iostream>
+#include <boost/filesystem.hpp>
+#include <boost/optional.hpp>
+#include <libdcp/raw_convert.h>
+
+class ImageFilenameSorter
+{
+public:
+ bool operator() (boost::filesystem::path a, boost::filesystem::path b)
+ {
+ boost::optional<int> na = extract_number (a);
+ boost::optional<int> nb = extract_number (b);
+ if (!na || !nb) {
+ std::cout << a << " " << b << " " << (a.string() < b.string()) << "\n";
+ return a.string() < b.string();
+ }
+
+ return na.get() < nb.get();
+ }
+
+private:
+ boost::optional<int> extract_number (boost::filesystem::path p)
+ {
+ p = p.leaf ();
+
+ std::string number;
+ for (size_t i = 0; i < p.string().size(); ++i) {
+ if (isdigit (p.string()[i])) {
+ number += p.string()[i];
+ } else {
+ if (!number.empty ()) {
+ break;
+ }
+ }
+ }
+
+ if (number.empty ()) {
+ return boost::optional<int> ();
+ }
+
+ return libdcp::raw_convert<int> (number);
+ }
+};