libopenraw
dngfile.cpp
1 /*
2  * libopenraw - dngfile.cpp
3  *
4  * Copyright (C) 2006-2016 Hubert Figuiere
5  * Copyright (C) 2008 Novell, Inc.
6  *
7  * This library is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public License
9  * as published by the Free Software Foundation, either version 3 of
10  * the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library. If not, see
19  * <http://www.gnu.org/licenses/>.
20  */
21 
22 #include <stddef.h>
23 
24 #include <string>
25 #include <memory>
26 
27 #include <libopenraw/cameraids.h>
28 #include <libopenraw/debug.h>
29 
30 #include "rawdata.hpp"
31 #include "trace.hpp"
32 #include "io/memstream.hpp"
33 #include "jfifcontainer.hpp"
34 #include "ljpegdecompressor.hpp"
35 #include "ifd.hpp"
36 #include "ifddir.hpp"
37 #include "ifdentry.hpp"
38 #include "dngfile.hpp"
39 
40 using namespace Debug;
41 
42 namespace OpenRaw {
43 namespace Internals {
44 
45 const IfdFile::camera_ids_t DngFile::s_def[] = {
46  { "PENTAX K10D ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
47  OR_TYPEID_PENTAX_K10D_DNG) },
48  { "PENTAX Q ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
49  OR_TYPEID_PENTAX_Q_DNG) },
50  { "PENTAX K200D ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
51  OR_TYPEID_PENTAX_K200D_DNG) },
52  { "PENTAX Q10 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
53  OR_TYPEID_PENTAX_Q10_DNG) },
54  { "PENTAX Q7 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
55  OR_TYPEID_PENTAX_Q7_DNG) },
56  { "PENTAX K-x ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
57  OR_TYPEID_PENTAX_KX_DNG) },
58  { "PENTAX K-r ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
59  OR_TYPEID_PENTAX_KR_DNG) },
60  { "PENTAX K-01 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
61  OR_TYPEID_PENTAX_K01_DNG) },
62  { "PENTAX K-30 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
63  OR_TYPEID_PENTAX_K30_DNG) },
64  { "PENTAX K-5 II s ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
65  OR_TYPEID_PENTAX_K5_IIS_DNG) },
66  { "PENTAX K-50 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
67  OR_TYPEID_PENTAX_K50_DNG) },
68  { "PENTAX K-500 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
69  OR_TYPEID_PENTAX_K500_DNG) },
70  { "PENTAX K-3 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
71  OR_TYPEID_PENTAX_K3_DNG) },
72  { "PENTAX K-3 II ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
73  OR_TYPEID_PENTAX_K3_II_DNG) },
74  { "PENTAX MX-1 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
75  OR_TYPEID_PENTAX_MX1_DNG) },
76  { "R9 - Digital Back DMR", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
77  OR_TYPEID_LEICA_DMR) },
78  { "M8 Digital Camera", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
79  OR_TYPEID_LEICA_M8) },
80  { "M9 Digital Camera", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
81  OR_TYPEID_LEICA_M9) },
82  { "M Monochrom", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
83  OR_TYPEID_LEICA_M_MONOCHROM) },
84  { "LEICA M (Typ 240)", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
85  OR_TYPEID_LEICA_M_TYP240) },
86  { "LEICA X1 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
87  OR_TYPEID_LEICA_X1) },
88  { "LEICA X2", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
89  OR_TYPEID_LEICA_X2) },
90  { "Leica S2", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
91  OR_TYPEID_LEICA_S2) },
92  { "LEICA X VARIO (Typ 107)", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
93  OR_TYPEID_LEICA_X_VARIO) },
94  { "LEICA X (Typ 113)", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
95  OR_TYPEID_LEICA_X_TYP113) },
96  { "LEICA T (Typ 701)", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
97  OR_TYPEID_LEICA_T_TYP701) },
98  { "LEICA Q (Typ 116)", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
99  OR_TYPEID_LEICA_Q_TYP116) },
100  { "GR DIGITAL 2 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_RICOH,
101  OR_TYPEID_RICOH_GR2) },
102  { "GR ",
103  OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_RICOH,
104  OR_TYPEID_RICOH_GR) },
105  { "GXR ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_RICOH,
106  OR_TYPEID_RICOH_GXR) },
107  { "GXR A16 ",
108  OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_RICOH, OR_TYPEID_RICOH_GXR_A16) },
109  { "SAMSUNG GX10 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_SAMSUNG,
110  OR_TYPEID_SAMSUNG_GX10) },
111  { "Pro 815 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_SAMSUNG,
112  OR_TYPEID_SAMSUNG_PRO815) },
113  { 0, OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_ADOBE,
114  OR_TYPEID_ADOBE_DNG_GENERIC) }
115 };
116 
117 RawFile *DngFile::factory(const IO::Stream::Ptr &s)
118 {
119  return new DngFile(s);
120 }
121 
122 
123 DngFile::DngFile(const IO::Stream::Ptr &s)
124  : TiffEpFile(s, OR_RAWFILE_TYPE_DNG)
125 {
126  _setIdMap(s_def);
127 }
128 
129 DngFile::~DngFile()
130 {
131 }
132 
133 ::or_error DngFile::_getRawData(RawData & data, uint32_t options)
134 {
135  ::or_error ret = OR_ERROR_NONE;
136  const IfdDir::Ref & _cfaIfd = cfaIfd();
137 
138  Trace(DEBUG1) << "_getRawData()\n";
139 
140  if (!_cfaIfd) {
141  Trace(DEBUG1) << "cfaIfd is NULL: not found\n";
142  return OR_ERROR_NOT_FOUND;
143  }
144  ret = _getRawDataFromDir(data, _cfaIfd);
145 
146  if(ret != OR_ERROR_NONE) {
147  Trace(ERROR) << "couldn't find raw data\n";
148  return ret;
149  }
150 
151  uint16_t compression = 0;
152  if (_cfaIfd->getValue(IFD::EXIF_TAG_COMPRESSION, compression) &&
153  compression == IFD::COMPRESS_LJPEG) {
154  // if the option is not set, decompress
155  if ((options & OR_OPTIONS_DONT_DECOMPRESS) == 0) {
156  IO::Stream::Ptr s(
157  std::make_shared<IO::MemStream>(data.data(),
158  data.size()));
159  s->open(); // TODO check success
160  std::unique_ptr<JfifContainer> jfif(new JfifContainer(s, 0));
161  LJpegDecompressor decomp(s.get(), jfif.get());
162  RawData *dData = decomp.decompress();
163  if (dData != NULL) {
164  dData->setCfaPattern(data.cfaPattern());
165  data.swap(*dData);
166  delete dData;
167  }
168  }
169  }
170  else {
171  data.setDataType(OR_DATA_TYPE_RAW);
172  }
173  uint32_t crop_x, crop_y, crop_w, crop_h;
174  IfdEntry::Ref e = _cfaIfd->getEntry(IFD::DNG_TAG_DEFAULT_CROP_ORIGIN);
175  if(e) {
176  crop_x = e->getIntegerArrayItem(0);
177  crop_y = e->getIntegerArrayItem(1);
178  }
179  else {
180  crop_x = crop_y = 0;
181  }
182  e = _cfaIfd->getEntry(IFD::DNG_TAG_DEFAULT_CROP_SIZE);
183  if(e) {
184  crop_w = e->getIntegerArrayItem(0);
185  crop_h = e->getIntegerArrayItem(1);
186  }
187  else {
188  crop_w = data.width();
189  crop_h = data.height();
190  }
191  data.setRoi(crop_x, crop_y, crop_w, crop_h);
192 
193  return ret;
194 }
195 
196 void DngFile::_identifyId()
197 {
198  TiffEpFile::_identifyId();
199  if (_typeId() == 0) {
200  const IfdDir::Ref & _mainIfd = mainIfd();
201 
202  std::string uniqueCameraModel;
203  if (_mainIfd->getValue(IFD::DNG_TAG_UNIQUE_CAMERA_MODEL,
204  uniqueCameraModel)) {
205  // set a generic DNG type if we found a
206  // unique camera model
207  _setTypeId(
208  OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_ADOBE,
209  OR_TYPEID_ADOBE_DNG_GENERIC));
210  }
211  }
212 }
213 
214 }
215 }
216 /*
217  Local Variables:
218  mode:c++
219  c-file-style:"stroustrup"
220  c-file-offsets:((innamespace . 0))
221  indent-tabs-mode:nil
222  fill-column:80
223  End:
224 */
CIFF is the container for CRW files. It is an attempt from Canon to make this a standard. I guess it failed.
Definition: arwfile.cpp:30
size_t size() const
Definition: bitmapdata.cpp:129
void swap(RawData &with)
Definition: rawdata.cpp:245
std::shared_ptr< IfdEntry > Ref
Definition: ifdentry.hpp:178
Definition: trace.cpp:30
const CfaPattern * cfaPattern() const
Definition: rawdata.cpp:287
void setDataType(DataType _type)
Definition: bitmapdata.cpp:100
virtual ::or_error _getRawData(RawData &data, uint32_t options) override
Definition: dngfile.cpp:133