Hand-apply 71a4c0f5440688a38a2bb34170a3ccf9b1ea598f from 1.x;
authorCarl Hetherington <cth@carlh.net>
Tue, 17 Feb 2015 23:43:23 +0000 (23:43 +0000)
committerCarl Hetherington <cth@carlh.net>
Tue, 17 Feb 2015 23:43:23 +0000 (23:43 +0000)
correctly sort image sequences.

TO_PORT
src/lib/image_content.cc
src/lib/image_filename_sorter.cc [new file with mode: 0644]
test/image_filename_sorter_test.cc [new file with mode: 0644]
test/wscript

diff --git a/TO_PORT b/TO_PORT
index 25d41bda0f9767e4c95e9b429ca7458144db1d37..691d087e063e4417a87fec21c2aa487850bcf091 100644 (file)
--- a/TO_PORT
+++ b/TO_PORT
@@ -1,4 +1,3 @@
-31894d178c8f6a3378b1c25c7ea1971f78759156
 bb2bdf010dd2ea813f9ac7af5023ce39cf14f572
 c065accc4b4c6ed268e7fccea77a958473be7785
 7ba9dcdbfe8f0d94ad9887843995c152c45dfe9e
index eb8b35210efd4a2a65cd4a4e02380438b3f05ba1..a9cb148c2447920a1db51a8964937fc12d8cffa0 100644 (file)
@@ -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 (file)
index 0000000..72f67e6
--- /dev/null
@@ -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);
+       }
+};
diff --git a/test/image_filename_sorter_test.cc b/test/image_filename_sorter_test.cc
new file mode 100644 (file)
index 0000000..57dd407
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+    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 <boost/test/unit_test.hpp>
+
+#include "lib/image_filename_sorter.cc"
+
+BOOST_AUTO_TEST_CASE (image_filename_sorter_test)
+{
+       ImageFilenameSorter x;
+       BOOST_ASSERT (x ("abc0000000001", "abc0000000002"));
+       BOOST_ASSERT (x ("1", "2"));
+       BOOST_ASSERT (x ("1", "0002"));
+       BOOST_ASSERT (x ("0001", "2"));
+       BOOST_ASSERT (x ("1", "999"));
+       BOOST_ASSERT (x ("00057.tif", "00166.tif"));
+       BOOST_ASSERT (x ("/my/numeric999/path/00057.tif", "/my/numeric999/path/00166.tif"));
+
+       BOOST_ASSERT (!x ("abc0000000002", "abc0000000001"));
+       BOOST_ASSERT (!x ("2", "1"));
+       BOOST_ASSERT (!x ("0002", "1"));
+       BOOST_ASSERT (!x ("2", "0001"));
+       BOOST_ASSERT (!x ("999", "1"));
+       BOOST_ASSERT (!x ("/my/numeric999/path/00166.tif", "/my/numeric999/path/00057.tif"));
+}
index 8831b6391d162840e4dd5e4d4b4c148a15a18e35..16e84f2314c1765802ae036833cb5f9f788939a8 100644 (file)
@@ -39,6 +39,7 @@ def build(bld):
                  file_log_test.cc
                  film_metadata_test.cc
                  frame_rate_test.cc
+                 image_filename_sorter_test.cc
                  image_test.cc
                  import_dcp_test.cc
                  isdcf_name_test.cc