Rename Content::_file to path and support md5sums of directories.
[dcpomatic.git] / src / lib / still_image_content.cc
1 /*
2     Copyright (C) 2013 Carl Hetherington <cth@carlh.net>
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #include <libcxml/cxml.h>
21 #include "still_image_content.h"
22 #include "still_image_examiner.h"
23 #include "config.h"
24 #include "compose.hpp"
25 #include "film.h"
26
27 #include "i18n.h"
28
29 using std::string;
30 using std::cout;
31 using std::stringstream;
32 using boost::shared_ptr;
33
34 StillImageContent::StillImageContent (shared_ptr<const Film> f, boost::filesystem::path p)
35         : Content (f, p)
36         , VideoContent (f, p)
37 {
38
39 }
40
41 StillImageContent::StillImageContent (shared_ptr<const Film> f, shared_ptr<const cxml::Node> node)
42         : Content (f, node)
43         , VideoContent (f, node)
44 {
45         
46 }
47
48 string
49 StillImageContent::summary () const
50 {
51         return String::compose (_("%1 [still]"), path());
52 }
53
54 string
55 StillImageContent::technical_summary () const
56 {
57         return Content::technical_summary() + " - "
58                 + VideoContent::technical_summary() + " - "
59                 + "still";
60 }
61
62 bool
63 StillImageContent::valid_file (boost::filesystem::path f)
64 {
65         string ext = f.extension().string();
66         transform (ext.begin(), ext.end(), ext.begin(), ::tolower);
67         return (ext == ".tif" || ext == ".tiff" || ext == ".jpg" || ext == ".jpeg" || ext == ".png" || ext == ".bmp");
68 }
69
70 void
71 StillImageContent::as_xml (xmlpp::Node* node) const
72 {
73         node->add_child("Type")->add_child_text ("StillImage");
74         Content::as_xml (node);
75         VideoContent::as_xml (node);
76 }
77
78 void
79 StillImageContent::examine (shared_ptr<Job> job)
80 {
81         Content::examine (job);
82
83         shared_ptr<const Film> film = _film.lock ();
84         assert (film);
85         
86         shared_ptr<StillImageExaminer> examiner (new StillImageExaminer (film, shared_from_this()));
87
88         take_from_video_examiner (examiner);
89         set_video_length (Config::instance()->default_still_length() * video_frame_rate());
90 }
91
92 void
93 StillImageContent::set_video_length (VideoContent::Frame len)
94 {
95         {
96                 boost::mutex::scoped_lock lm (_mutex);
97                 _video_length = len;
98         }
99
100         signal_changed (ContentProperty::LENGTH);
101 }
102
103 Time
104 StillImageContent::length () const
105 {
106         shared_ptr<const Film> film = _film.lock ();
107         assert (film);
108         
109         FrameRateConversion frc (video_frame_rate(), film->video_frame_rate ());
110         return video_length() * frc.factor() * TIME_HZ / video_frame_rate();
111 }
112
113 string
114 StillImageContent::identifier () const
115 {
116         stringstream s;
117         s << VideoContent::identifier ();
118         s << "_" << video_length();
119         return s.str ();
120 }