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 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) },
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) },
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) }
117 RawFile *DngFile::factory(
const IO::Stream::Ptr &s)
119 return new DngFile(s);
123 DngFile::DngFile(
const IO::Stream::Ptr &s)
124 : TiffEpFile(s, OR_RAWFILE_TYPE_DNG)
135 ::or_error ret = OR_ERROR_NONE;
136 const IfdDir::Ref & _cfaIfd = cfaIfd();
138 Trace(DEBUG1) <<
"_getRawData()\n";
141 Trace(DEBUG1) <<
"cfaIfd is NULL: not found\n";
142 return OR_ERROR_NOT_FOUND;
144 ret = _getRawDataFromDir(data, _cfaIfd);
146 if(ret != OR_ERROR_NONE) {
147 Trace(ERROR) <<
"couldn't find raw data\n";
151 uint16_t compression = 0;
152 if (_cfaIfd->getValue(IFD::EXIF_TAG_COMPRESSION, compression) &&
153 compression == IFD::COMPRESS_LJPEG) {
155 if ((options & OR_OPTIONS_DONT_DECOMPRESS) == 0) {
157 std::make_shared<IO::MemStream>(data.data(),
160 std::unique_ptr<JfifContainer> jfif(
new JfifContainer(s, 0));
162 RawData *dData = decomp.decompress();
173 uint32_t crop_x, crop_y, crop_w, crop_h;
174 IfdEntry::Ref e = _cfaIfd->getEntry(IFD::DNG_TAG_DEFAULT_CROP_ORIGIN);
176 crop_x = e->getIntegerArrayItem(0);
177 crop_y = e->getIntegerArrayItem(1);
182 e = _cfaIfd->getEntry(IFD::DNG_TAG_DEFAULT_CROP_SIZE);
184 crop_w = e->getIntegerArrayItem(0);
185 crop_h = e->getIntegerArrayItem(1);
188 crop_w = data.width();
189 crop_h = data.height();
191 data.setRoi(crop_x, crop_y, crop_w, crop_h);
196 void DngFile::_identifyId()
198 TiffEpFile::_identifyId();
199 if (_typeId() == 0) {
200 const IfdDir::Ref & _mainIfd = mainIfd();
202 std::string uniqueCameraModel;
203 if (_mainIfd->getValue(IFD::DNG_TAG_UNIQUE_CAMERA_MODEL,
204 uniqueCameraModel)) {
208 OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_ADOBE,
209 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.
std::shared_ptr< IfdEntry > Ref
const CfaPattern * cfaPattern() const
void setDataType(DataType _type)
virtual ::or_error _getRawData(RawData &data, uint32_t options) override