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;
47 const IfdFile::camera_ids_t DngFile::s_def[] = {
49 OR_TYPEID_PENTAX_645Z_DNG) },
51 OR_TYPEID_PENTAX_645D_DNG) },
53 OR_TYPEID_PENTAX_K10D_DNG) },
55 OR_TYPEID_PENTAX_Q_DNG) },
57 OR_TYPEID_PENTAX_K200D_DNG) },
59 OR_TYPEID_PENTAX_K2000_DNG) },
61 OR_TYPEID_PENTAX_Q10_DNG) },
63 OR_TYPEID_PENTAX_Q7_DNG) },
65 OR_TYPEID_PENTAX_QS1_DNG) },
67 OR_TYPEID_PENTAX_KX_DNG) },
69 OR_TYPEID_PENTAX_KR_DNG) },
71 OR_TYPEID_PENTAX_K01_DNG) },
73 OR_TYPEID_PENTAX_K1_DNG) },
75 OR_TYPEID_PENTAX_K1_MKII_DNG) },
77 OR_TYPEID_PENTAX_K10D_DNG) },
79 OR_TYPEID_PENTAX_K30_DNG) },
81 OR_TYPEID_PENTAX_K5_II_DNG) },
83 OR_TYPEID_PENTAX_K5_IIS_DNG) },
85 OR_TYPEID_PENTAX_K50_DNG) },
87 OR_TYPEID_PENTAX_K500_DNG) },
89 OR_TYPEID_PENTAX_K3_DNG) },
91 OR_TYPEID_PENTAX_K3_II_DNG) },
93 OR_TYPEID_PENTAX_K3_II_DNG) },
95 OR_TYPEID_PENTAX_K7_DNG) },
97 OR_TYPEID_PENTAX_K70_DNG) },
99 OR_TYPEID_PENTAX_KS1_DNG) },
101 OR_TYPEID_PENTAX_KP_DNG) },
103 OR_TYPEID_PENTAX_MX1_DNG) },
105 OR_TYPEID_LEICA_DMR) },
107 OR_TYPEID_LEICA_M8) },
109 OR_TYPEID_LEICA_M9) },
111 OR_TYPEID_LEICA_M_MONOCHROM) },
113 OR_TYPEID_LEICA_M_TYP240) },
115 OR_TYPEID_LEICA_M_MONOCHROM_TYP246) },
117 OR_TYPEID_LEICA_M10) },
119 OR_TYPEID_LEICA_M10P) },
121 OR_TYPEID_LEICA_M10D) },
123 OR_TYPEID_LEICA_M10R) },
125 OR_TYPEID_LEICA_M10_MONOCHROM) },
127 OR_TYPEID_LEICA_M11) },
129 OR_TYPEID_LEICA_M11_MONOCHROM) },
131 OR_TYPEID_LEICA_X1) },
133 OR_TYPEID_LEICA_X2) },
135 OR_TYPEID_LEICA_S2) },
137 OR_TYPEID_LEICA_X_VARIO) },
139 OR_TYPEID_LEICA_X_TYP113) },
141 OR_TYPEID_LEICA_SL_TYP601) },
143 OR_TYPEID_LEICA_SL2) },
145 OR_TYPEID_LEICA_T_TYP701) },
147 OR_TYPEID_LEICA_TL2) },
149 OR_TYPEID_LEICA_Q_TYP116) },
151 OR_TYPEID_LEICA_Q2) },
153 OR_TYPEID_LEICA_Q3) },
155 OR_TYPEID_LEICA_CL) },
157 OR_TYPEID_LEICA_SL2S) },
159 OR_TYPEID_LEICA_Q2_MONOCHROM) },
161 OR_TYPEID_RICOH_GR2) },
164 OR_TYPEID_RICOH_GR) },
167 OR_TYPEID_RICOH_GRII) },
173 OR_TYPEID_RICOH_GXR) },
179 OR_TYPEID_SAMSUNG_GX10) },
181 OR_TYPEID_SAMSUNG_PRO815) },
183 OR_TYPEID_XIAOYI_M1) },
185 OR_TYPEID_XIAOYI_YDXJ_2) },
187 OR_TYPEID_XIAOYI_YIAC_3) },
189 OR_TYPEID_APPLE_IPHONE_6SPLUS) },
191 OR_TYPEID_APPLE_IPHONE_7PLUS) },
193 OR_TYPEID_APPLE_IPHONE_8) },
195 OR_TYPEID_APPLE_IPHONE_12_PRO) },
197 OR_TYPEID_APPLE_IPHONE_13_PRO) },
199 OR_TYPEID_APPLE_IPHONE_SE) },
201 OR_TYPEID_APPLE_IPHONE_XS) },
204 OR_TYPEID_BLACKMAGIC_POCKET_CINEMA) },
206 OR_TYPEID_SIGMA_FP) },
208 OR_TYPEID_SIGMA_FP_L) },
210 OR_TYPEID_HASSELBLAD_L1D_20C) },
212 OR_TYPEID_HASSELBLAD_L2D_20C) },
214 OR_TYPEID_GOPRO_HERO5_BLACK) },
216 OR_TYPEID_GOPRO_HERO6_BLACK) },
218 OR_TYPEID_GOPRO_HERO7_BLACK) },
220 OR_TYPEID_GOPRO_HERO8_BLACK) },
222 OR_TYPEID_GOPRO_HERO9_BLACK) },
224 OR_TYPEID_GOPRO_HERO10_BLACK) },
226 OR_TYPEID_ZEISS_ZX1) },
228 OR_TYPEID_DJI_FC220) },
230 OR_TYPEID_DJI_FC350) },
232 OR_TYPEID_DJI_FC3582) },
234 OR_TYPEID_DJI_FC6310) },
236 OR_TYPEID_DJI_FC7303) },
238 OR_TYPEID_DJI_OSMO_ACTION) },
243 RawFile *DngFile::factory(
const IO::Stream::Ptr &s)
245 return new DngFile(s);
249 DngFile::DngFile(
const IO::Stream::Ptr &s)
260 DngFile::getColourMatrixOrigin()
const
265 ::or_error DngFile::_enumThumbnailSizes(std::vector<uint32_t>& list)
269 err = TiffEpFile::_enumThumbnailSizes(list);
271 auto makerNote = makerNoteIfd();
273 if (makerNote->getId() ==
"Leica6") {
276 auto e = makerNote->getEntry(MNOTE_LEICA_PREVIEW_IMAGE);
277 _addThumbnailFromEntry(e, makerNote->getMnoteOffset(), list);
288 LOGDBG1(
"_getRawData()\n");
291 LOGDBG1(
"cfaIfd is NULL: not found\n");
294 ret = _getRawDataFromDir(data, _cfaIfd);
297 LOGERR(
"couldn't find raw data\n");
301 auto result = _cfaIfd->getValue<uint16_t>(IFD::EXIF_TAG_COMPRESSION);
302 if (result && (result.value() == IFD::COMPRESS_LJPEG)) {
305 auto s = std::make_shared<IO::MemStream>((
const uint8_t*)data.data(),
308 auto jfif = std::make_unique<JfifContainer>(s, 0);
313 dData->setPhotometricInterpretation(data.getPhotometricInterpretation());
321 uint32_t crop_x, crop_y, crop_w, crop_h;
322 auto e = _cfaIfd->getEntry(IFD::DNG_TAG_ACTIVE_AREA);
324 crop_y = _cfaIfd->getEntryIntegerArrayItemValue(*e, 0);
325 crop_x = _cfaIfd->getEntryIntegerArrayItemValue(*e, 1);
326 crop_h = _cfaIfd->getEntryIntegerArrayItemValue(*e, 2);
327 crop_w = _cfaIfd->getEntryIntegerArrayItemValue(*e, 3);
330 crop_w = data.
width();
334 data.setActiveArea(crop_x, crop_y, crop_w, crop_h);
337 IfdEntry::Ref e = _cfaIfd->getEntry(IFD::DNG_TAG_DEFAULT_CROP_ORIGIN);
339 crop_x = _cfaIfd->getEntryIntegerArrayItemValue(*e, 0);
340 crop_y = _cfaIfd->getEntryIntegerArrayItemValue(*e, 1);
345 e = _cfaIfd->getEntry(IFD::DNG_TAG_DEFAULT_CROP_SIZE);
347 crop_w = _cfaIfd->getEntryIntegerArrayItemValue(*e, 0);
348 crop_h = _cfaIfd->getEntryIntegerArrayItemValue(*e, 1);
351 crop_w = data.
width();
359 void DngFile::_identifyId()
361 TiffEpFile::_identifyId();
369 LOGERR(
"No main IFD to identify.\n");
373 auto uniqueCameraModel =
374 _mainIfd->getValue<std::string>(IFD::DNG_TAG_UNIQUE_CAMERA_MODEL);
375 if (uniqueCameraModel) {
void setDataType(DataType _type)
Set the data type.
uint32_t width() const
Width of the image data.
uint32_t height() const
Height of the image data.
size_t size() const
Get the size of the data.
std::shared_ptr< IfdDir > Ref
Shared ptr of an IfdDir.
std::shared_ptr< IfdEntry > Ref
IfdEntry reference (ie shared pointer)
virtual RawDataPtr decompress() override
Represent camera raw data.
const MosaicInfo * mosaicInfo() const
@ OR_TYPEID_ADOBE_DNG_GENERIC
#define OR_MAKE_FILE_TYPEID(vendor, camera)
Make a or_rawfile_typeid with a vendor and camera.
#define OR_GET_FILE_TYPEID_CAMERA(ftypeid)
Get the camera from the or_rawfile_typeid.
or_colour_matrix_origin
Where the colour matrix comes from. Typically DNG is provided. The others are built-in.
or_error
Error codes returned by libopenraw.
@ OR_OPTIONS_DONT_DECOMPRESS
@ OR_COLOUR_MATRIX_PROVIDED
Global namespace for libopenraw.