Try to fix failure to load files with non-ASCII filenames into ImageMagick.
[dcpomatic.git] / src / lib / image_examiner.cc
1 /*
2     Copyright (C) 2013-2015 Carl Hetherington <cth@carlh.net>
3
4     This file is part of DCP-o-matic.
5
6     DCP-o-matic is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     DCP-o-matic is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
18
19 */
20
21 #include "image_content.h"
22 #include "image_examiner.h"
23 #include "film.h"
24 #include "job.h"
25 #include "exceptions.h"
26 #include "config.h"
27 #include "cross.h"
28 #include "compose.hpp"
29 #include "magick_image_proxy.h"
30 #include "image.h"
31 #include <dcp/openjpeg_image.h>
32 #include <dcp/exceptions.h>
33 #include <dcp/j2k.h>
34 #include <Magick++.h>
35 #include <iostream>
36
37 #include "i18n.h"
38
39 using std::cout;
40 using std::list;
41 using std::sort;
42 using boost::shared_ptr;
43 using boost::optional;
44
45 ImageExaminer::ImageExaminer (shared_ptr<const Film> film, shared_ptr<const ImageContent> content, shared_ptr<Job>)
46         : _film (film)
47         , _image_content (content)
48 {
49 #ifdef DCPOMATIC_HAVE_MAGICKCORE_NAMESPACE
50         using namespace MagickCore;
51 #endif
52         boost::filesystem::path path = content->path(0).string ();
53         if (valid_j2k_file (path)) {
54                 boost::uintmax_t size = boost::filesystem::file_size (path);
55                 FILE* f = fopen_boost (path, "rb");
56                 if (!f) {
57                         throw FileError ("Could not open file for reading", path);
58                 }
59                 uint8_t* buffer = new uint8_t[size];
60                 fread (buffer, 1, size, f);
61                 fclose (f);
62                 try {
63                         _video_size = dcp::decompress_j2k (buffer, size, 0)->size ();
64                 } catch (dcp::DCPReadError& e) {
65                         delete[] buffer;
66                         throw DecodeError (String::compose (_("Could not decode JPEG2000 file %1 (%2)"), path, e.what ()));
67                 }
68                 delete[] buffer;
69         } else {
70                 MagickImageProxy proxy(content->path(0));
71                 _video_size = proxy.image().first->size();
72         }
73
74         if (content->still ()) {
75                 _video_length = Config::instance()->default_still_length() * video_frame_rate().get_value_or (film->video_frame_rate ());
76         } else {
77                 _video_length = _image_content->number_of_paths ();
78         }
79 }
80
81 dcp::Size
82 ImageExaminer::video_size () const
83 {
84         return _video_size.get ();
85 }
86
87 optional<double>
88 ImageExaminer::video_frame_rate () const
89 {
90         if (_image_content->video_frame_rate()) {
91                 /* The content already knows what frame rate it should be */
92                 return _image_content->video_frame_rate().get();
93         }
94
95         /* Don't know */
96         return optional<double> ();
97 }
98
99 bool
100 ImageExaminer::yuv () const
101 {
102         /* We never convert ImageSource from YUV to RGB (though maybe sometimes we should)
103            so it makes sense to just say they are never YUV so the option of a conversion
104            to RGB is not offered.
105         */
106         return false;
107 }