27 #include <libopenraw/cameraids.h> 28 #include <libopenraw/debug.h> 30 #include "rawdata.hpp" 32 #include "io/memstream.hpp" 33 #include "jfifcontainer.hpp" 34 #include "ljpegdecompressor.hpp" 37 #include "ifdentry.hpp" 38 #include "dngfile.hpp" 40 using namespace Debug;
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 QS-1 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
57 OR_TYPEID_PENTAX_QS1_DNG) },
58 {
"PENTAX K-x ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
59 OR_TYPEID_PENTAX_KX_DNG) },
60 {
"PENTAX K-r ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
61 OR_TYPEID_PENTAX_KR_DNG) },
62 {
"PENTAX K-01 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
63 OR_TYPEID_PENTAX_K01_DNG) },
64 {
"PENTAX K-1 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
65 OR_TYPEID_PENTAX_K1_DNG) },
66 {
"PENTAX K-30 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
67 OR_TYPEID_PENTAX_K30_DNG) },
68 {
"PENTAX K-5 II s ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
69 OR_TYPEID_PENTAX_K5_IIS_DNG) },
70 {
"PENTAX K-50 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
71 OR_TYPEID_PENTAX_K50_DNG) },
72 {
"PENTAX K-500 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
73 OR_TYPEID_PENTAX_K500_DNG) },
74 {
"PENTAX K-3 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
75 OR_TYPEID_PENTAX_K3_DNG) },
76 {
"PENTAX K-3 II ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
77 OR_TYPEID_PENTAX_K3_II_DNG) },
78 {
"PENTAX K-70 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
79 OR_TYPEID_PENTAX_K70_DNG) },
80 {
"PENTAX K-S1 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
81 OR_TYPEID_PENTAX_KS1_DNG) },
82 {
"PENTAX KP ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
83 OR_TYPEID_PENTAX_KP_DNG) },
84 {
"PENTAX MX-1 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,
85 OR_TYPEID_PENTAX_MX1_DNG) },
86 {
"R9 - Digital Back DMR", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
87 OR_TYPEID_LEICA_DMR) },
88 {
"M8 Digital Camera", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
89 OR_TYPEID_LEICA_M8) },
90 {
"M9 Digital Camera", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
91 OR_TYPEID_LEICA_M9) },
92 {
"M Monochrom", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
93 OR_TYPEID_LEICA_M_MONOCHROM) },
94 {
"LEICA M (Typ 240)", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
95 OR_TYPEID_LEICA_M_TYP240) },
96 {
"LEICA M10", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
97 OR_TYPEID_LEICA_M10) },
98 {
"LEICA X1 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
99 OR_TYPEID_LEICA_X1) },
100 {
"LEICA X2", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
101 OR_TYPEID_LEICA_X2) },
102 {
"Leica S2", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
103 OR_TYPEID_LEICA_S2) },
104 {
"LEICA X VARIO (Typ 107)", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
105 OR_TYPEID_LEICA_X_VARIO) },
106 {
"LEICA X (Typ 113)", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
107 OR_TYPEID_LEICA_X_TYP113) },
108 {
"LEICA SL (Typ 601)", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
109 OR_TYPEID_LEICA_SL_TYP601) },
110 {
"LEICA T (Typ 701)", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
111 OR_TYPEID_LEICA_T_TYP701) },
112 {
"LEICA Q (Typ 116)", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,
113 OR_TYPEID_LEICA_Q_TYP116) },
114 {
"GR DIGITAL 2 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_RICOH,
115 OR_TYPEID_RICOH_GR2) },
117 OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_RICOH,
118 OR_TYPEID_RICOH_GR) },
119 {
"GXR ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_RICOH,
120 OR_TYPEID_RICOH_GXR) },
122 OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_RICOH, OR_TYPEID_RICOH_GXR_A16) },
123 {
"SAMSUNG GX10 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_SAMSUNG,
124 OR_TYPEID_SAMSUNG_GX10) },
125 {
"Pro 815 ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_SAMSUNG,
126 OR_TYPEID_SAMSUNG_PRO815) },
127 {
"M1", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_XIAOYI,
128 OR_TYPEID_XIAOYI_M1) },
129 {
"iPhone 6s Plus", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_APPLE,
130 OR_TYPEID_APPLE_IPHONE_6SPLUS) },
131 {
"iPhone 7 Plus", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_APPLE,
132 OR_TYPEID_APPLE_IPHONE_7PLUS) },
133 { 0, OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_ADOBE,
134 OR_TYPEID_ADOBE_DNG_GENERIC) }
137 RawFile *DngFile::factory(
const IO::Stream::Ptr &s)
139 return new DngFile(s);
143 DngFile::DngFile(
const IO::Stream::Ptr &s)
144 : TiffEpFile(s, OR_RAWFILE_TYPE_DNG)
155 ::or_error ret = OR_ERROR_NONE;
156 const IfdDir::Ref & _cfaIfd = cfaIfd();
158 LOGDBG1(
"_getRawData()\n");
161 LOGDBG1(
"cfaIfd is NULL: not found\n");
162 return OR_ERROR_NOT_FOUND;
164 ret = _getRawDataFromDir(data, _cfaIfd);
166 if(ret != OR_ERROR_NONE) {
167 LOGERR(
"couldn't find raw data\n");
171 auto result = _cfaIfd->getValue<uint16_t>(IFD::EXIF_TAG_COMPRESSION);
172 if (result.ok() && (result.unwrap() == IFD::COMPRESS_LJPEG)) {
174 if ((options & OR_OPTIONS_DONT_DECOMPRESS) == 0) {
176 std::make_shared<IO::MemStream>(data.data(),
179 std::unique_ptr<JfifContainer> jfif(
new JfifContainer(s, 0));
191 uint32_t crop_x, crop_y, crop_w, crop_h;
192 IfdEntry::Ref e = _cfaIfd->getEntry(IFD::DNG_TAG_DEFAULT_CROP_ORIGIN);
194 crop_x = e->getIntegerArrayItem(0);
195 crop_y = e->getIntegerArrayItem(1);
200 e = _cfaIfd->getEntry(IFD::DNG_TAG_DEFAULT_CROP_SIZE);
202 crop_w = e->getIntegerArrayItem(0);
203 crop_h = e->getIntegerArrayItem(1);
206 crop_w = data.width();
207 crop_h = data.height();
209 data.setRoi(crop_x, crop_y, crop_w, crop_h);
214 void DngFile::_identifyId()
216 TiffEpFile::_identifyId();
219 if (OR_GET_FILE_TYPEID_CAMERA(_typeId()) == 0) {
220 const IfdDir::Ref & _mainIfd = mainIfd();
222 auto uniqueCameraModel =
223 _mainIfd->getValue<std::string>(IFD::DNG_TAG_UNIQUE_CAMERA_MODEL);
224 if (uniqueCameraModel.ok()) {
228 OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_ADOBE,
229 OR_TYPEID_ADOBE_DNG_GENERIC));
CIFF is the container for CRW files. It is an attempt from Canon to make this a standard. I guess it failed.
virtual RawDataPtr decompress() override
std::shared_ptr< IfdEntry > Ref
const CfaPattern * cfaPattern() const
void setDataType(DataType _type)
virtual ::or_error _getRawData(RawData &data, uint32_t options) override