1 | /*****************************************************************************/ |
2 | // Copyright 2006-2008 Adobe Systems Incorporated |
3 | // All Rights Reserved. |
4 | // |
5 | // NOTICE: Adobe permits you to use, modify, and distribute this file in |
6 | // accordance with the terms of the Adobe license agreement accompanying it. |
7 | /*****************************************************************************/ |
8 | |
9 | /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_exif.h#2 $ */ |
10 | /* $DateTime: 2012/07/11 10:36:56 $ */ |
11 | /* $Change: 838485 $ */ |
12 | /* $Author: tknoll $ */ |
13 | |
14 | /** \file |
15 | * EXIF read access support. See the \ref spec_exif "EXIF specification" for full |
16 | * description of tags. |
17 | */ |
18 | |
19 | /*****************************************************************************/ |
20 | |
21 | #ifndef __dng_exif__ |
22 | #define __dng_exif__ |
23 | |
24 | /*****************************************************************************/ |
25 | |
26 | #include "dng_classes.h" |
27 | #include "dng_date_time.h" |
28 | #include "dng_fingerprint.h" |
29 | #include "dng_types.h" |
30 | #include "dng_matrix.h" |
31 | #include "dng_rational.h" |
32 | #include "dng_string.h" |
33 | #include "dng_stream.h" |
34 | #include "dng_sdk_limits.h" |
35 | |
36 | /*****************************************************************************/ |
37 | |
38 | /// \brief Container class for parsing and holding EXIF tags. |
39 | /// |
40 | /// Public member fields are documented in \ref spec_exif "EXIF specification." |
41 | |
42 | class dng_exif |
43 | { |
44 | |
45 | public: |
46 | |
47 | dng_string fImageDescription; |
48 | dng_string fMake; |
49 | dng_string fModel; |
50 | dng_string fSoftware; |
51 | dng_string fArtist; |
52 | dng_string fCopyright; |
53 | dng_string fCopyright2; |
54 | dng_string ; |
55 | |
56 | dng_date_time_info fDateTime; |
57 | dng_date_time_storage_info fDateTimeStorageInfo; |
58 | |
59 | dng_date_time_info fDateTimeOriginal; |
60 | dng_date_time_storage_info fDateTimeOriginalStorageInfo; |
61 | |
62 | dng_date_time_info fDateTimeDigitized; |
63 | dng_date_time_storage_info fDateTimeDigitizedStorageInfo; |
64 | |
65 | uint32 fTIFF_EP_StandardID; |
66 | uint32 fExifVersion; |
67 | uint32 fFlashPixVersion; |
68 | |
69 | dng_urational fExposureTime; |
70 | dng_urational fFNumber; |
71 | dng_srational fShutterSpeedValue; |
72 | dng_urational fApertureValue; |
73 | dng_srational fBrightnessValue; |
74 | dng_srational fExposureBiasValue; |
75 | dng_urational fMaxApertureValue; |
76 | dng_urational fFocalLength; |
77 | dng_urational fDigitalZoomRatio; |
78 | dng_urational fExposureIndex; |
79 | dng_urational fSubjectDistance; |
80 | dng_urational fGamma; |
81 | |
82 | dng_urational fBatteryLevelR; |
83 | dng_string fBatteryLevelA; |
84 | |
85 | uint32 fExposureProgram; |
86 | uint32 fMeteringMode; |
87 | uint32 fLightSource; |
88 | uint32 fFlash; |
89 | uint32 fFlashMask; |
90 | uint32 fSensingMethod; |
91 | uint32 fColorSpace; |
92 | uint32 fFileSource; |
93 | uint32 fSceneType; |
94 | uint32 fCustomRendered; |
95 | uint32 fExposureMode; |
96 | uint32 fWhiteBalance; |
97 | uint32 fSceneCaptureType; |
98 | uint32 fGainControl; |
99 | uint32 fContrast; |
100 | uint32 fSaturation; |
101 | uint32 fSharpness; |
102 | uint32 fSubjectDistanceRange; |
103 | uint32 fSelfTimerMode; |
104 | uint32 fImageNumber; |
105 | |
106 | uint32 fFocalLengthIn35mmFilm; |
107 | |
108 | uint32 fISOSpeedRatings [3]; // EXIF 2.3: PhotographicSensitivity. |
109 | |
110 | // Sensitivity tags added in EXIF 2.3. |
111 | |
112 | uint32 fSensitivityType; |
113 | uint32 fStandardOutputSensitivity; |
114 | uint32 fRecommendedExposureIndex; |
115 | uint32 fISOSpeed; |
116 | uint32 fISOSpeedLatitudeyyy; |
117 | uint32 fISOSpeedLatitudezzz; |
118 | |
119 | uint32 fSubjectAreaCount; |
120 | uint32 fSubjectArea [4]; |
121 | |
122 | uint32 fComponentsConfiguration; |
123 | |
124 | dng_urational fCompresssedBitsPerPixel; |
125 | |
126 | uint32 fPixelXDimension; |
127 | uint32 fPixelYDimension; |
128 | |
129 | dng_urational fFocalPlaneXResolution; |
130 | dng_urational fFocalPlaneYResolution; |
131 | |
132 | uint32 fFocalPlaneResolutionUnit; |
133 | |
134 | uint32 fCFARepeatPatternRows; |
135 | uint32 fCFARepeatPatternCols; |
136 | |
137 | uint8 fCFAPattern [kMaxCFAPattern] [kMaxCFAPattern]; |
138 | |
139 | dng_fingerprint fImageUniqueID; |
140 | |
141 | uint32 fGPSVersionID; |
142 | dng_string fGPSLatitudeRef; |
143 | dng_urational fGPSLatitude [3]; |
144 | dng_string fGPSLongitudeRef; |
145 | dng_urational fGPSLongitude [3]; |
146 | uint32 fGPSAltitudeRef; |
147 | dng_urational fGPSAltitude; |
148 | dng_urational fGPSTimeStamp [3]; |
149 | dng_string fGPSSatellites; |
150 | dng_string fGPSStatus; |
151 | dng_string fGPSMeasureMode; |
152 | dng_urational fGPSDOP; |
153 | dng_string fGPSSpeedRef; |
154 | dng_urational fGPSSpeed; |
155 | dng_string fGPSTrackRef; |
156 | dng_urational fGPSTrack; |
157 | dng_string fGPSImgDirectionRef; |
158 | dng_urational fGPSImgDirection; |
159 | dng_string fGPSMapDatum; |
160 | dng_string fGPSDestLatitudeRef; |
161 | dng_urational fGPSDestLatitude [3]; |
162 | dng_string fGPSDestLongitudeRef; |
163 | dng_urational fGPSDestLongitude [3]; |
164 | dng_string fGPSDestBearingRef; |
165 | dng_urational fGPSDestBearing; |
166 | dng_string fGPSDestDistanceRef; |
167 | dng_urational fGPSDestDistance; |
168 | dng_string fGPSProcessingMethod; |
169 | dng_string fGPSAreaInformation; |
170 | dng_string fGPSDateStamp; |
171 | uint32 fGPSDifferential; |
172 | dng_urational fGPSHPositioningError; |
173 | |
174 | dng_string fInteroperabilityIndex; |
175 | |
176 | uint32 fInteroperabilityVersion; |
177 | |
178 | dng_string fRelatedImageFileFormat; |
179 | |
180 | uint32 fRelatedImageWidth; |
181 | uint32 fRelatedImageLength; |
182 | |
183 | dng_string fCameraSerialNumber; // EXIF 2.3: BodySerialNumber. |
184 | |
185 | dng_urational fLensInfo [4]; // EXIF 2.3: LensSpecification. |
186 | |
187 | dng_string fLensID; |
188 | dng_string fLensMake; |
189 | dng_string fLensName; // EXIF 2.3: LensModel. |
190 | dng_string fLensSerialNumber; |
191 | |
192 | // Was the lens name field read from a LensModel tag? |
193 | |
194 | bool fLensNameWasReadFromExif; |
195 | |
196 | // Private field to hold the approximate focus distance of the lens, in |
197 | // meters. This value is often coarsely measured/reported and hence should be |
198 | // interpreted only as a rough estimate of the true distance from the plane |
199 | // of focus (in object space) to the focal plane. It is still useful for the |
200 | // purposes of applying lens corrections. |
201 | |
202 | dng_urational fApproxFocusDistance; |
203 | |
204 | dng_srational fFlashCompensation; |
205 | |
206 | dng_string fOwnerName; // EXIF 2.3: CameraOwnerName. |
207 | dng_string fFirmware; |
208 | |
209 | public: |
210 | |
211 | dng_exif (); |
212 | |
213 | virtual ~dng_exif (); |
214 | |
215 | /// Make clone. |
216 | |
217 | virtual dng_exif * Clone () const; |
218 | |
219 | /// Clear all EXIF fields. |
220 | |
221 | void SetEmpty (); |
222 | |
223 | /// Copy all GPS-related fields. |
224 | /// \param exif Source object from which to copy GPS fields. |
225 | |
226 | void CopyGPSFrom (const dng_exif &exif); |
227 | |
228 | /// Utility to fix up common errors and rounding issues with EXIF exposure |
229 | /// times. |
230 | |
231 | static real64 SnapExposureTime (real64 et); |
232 | |
233 | /// Set exposure time and shutter speed fields. Optionally fix up common |
234 | /// errors and rounding issues with EXIF exposure times. |
235 | /// \param et Exposure time in seconds. |
236 | /// \param snap Set to true to fix up common errors and rounding issues with |
237 | /// EXIF exposure times. |
238 | |
239 | void SetExposureTime (real64 et, |
240 | bool snap = true); |
241 | |
242 | /// Set shutter speed value (APEX units) and exposure time. |
243 | /// \param Shutter speed in APEX units. |
244 | |
245 | void SetShutterSpeedValue (real64 ss); |
246 | |
247 | /// Utility to encode f-number as a rational. |
248 | /// \param fs The f-number to encode. |
249 | |
250 | static dng_urational EncodeFNumber (real64 fs); |
251 | |
252 | /// Set the FNumber and ApertureValue fields. |
253 | /// \param fs The f-number to set. |
254 | |
255 | void SetFNumber (real64 fs); |
256 | |
257 | /// Set the FNumber and ApertureValue fields. |
258 | /// \param av The aperture value (APEX units). |
259 | |
260 | void SetApertureValue (real64 av); |
261 | |
262 | /// Utility to convert aperture value (APEX units) to f-number. |
263 | /// \param av The aperture value (APEX units) to convert. |
264 | |
265 | static real64 ApertureValueToFNumber (real64 av); |
266 | |
267 | /// Utility to convert aperture value (APEX units) to f-number. |
268 | /// \param av The aperture value (APEX units) to convert. |
269 | |
270 | static real64 ApertureValueToFNumber (const dng_urational &av); |
271 | |
272 | /// Utility to convert f-number to aperture value (APEX units). |
273 | /// \param fNumber The f-number to convert. |
274 | |
275 | static real64 FNumberToApertureValue (real64 fNumber); |
276 | |
277 | /// Utility to convert f-number to aperture value (APEX units). |
278 | /// \param fNumber The f-number to convert. |
279 | |
280 | static real64 FNumberToApertureValue (const dng_urational &fNumber); |
281 | |
282 | /// Set the DateTime field. |
283 | /// \param dt The DateTime value. |
284 | |
285 | void UpdateDateTime (const dng_date_time_info &dt); |
286 | |
287 | /// Returns true iff the EXIF version is at least 2.3. |
288 | |
289 | bool AtLeastVersion0230 () const; |
290 | |
291 | virtual bool ParseTag (dng_stream &stream, |
292 | dng_shared &shared, |
293 | uint32 parentCode, |
294 | bool isMainIFD, |
295 | uint32 tagCode, |
296 | uint32 tagType, |
297 | uint32 tagCount, |
298 | uint64 tagOffset); |
299 | |
300 | virtual void PostParse (dng_host &host, |
301 | dng_shared &shared); |
302 | |
303 | protected: |
304 | |
305 | virtual bool Parse_ifd0 (dng_stream &stream, |
306 | dng_shared &shared, |
307 | uint32 parentCode, |
308 | uint32 tagCode, |
309 | uint32 tagType, |
310 | uint32 tagCount, |
311 | uint64 tagOffset); |
312 | |
313 | virtual bool Parse_ifd0_main (dng_stream &stream, |
314 | dng_shared &shared, |
315 | uint32 parentCode, |
316 | uint32 tagCode, |
317 | uint32 tagType, |
318 | uint32 tagCount, |
319 | uint64 tagOffset); |
320 | |
321 | virtual bool Parse_ifd0_exif (dng_stream &stream, |
322 | dng_shared &shared, |
323 | uint32 parentCode, |
324 | uint32 tagCode, |
325 | uint32 tagType, |
326 | uint32 tagCount, |
327 | uint64 tagOffset); |
328 | |
329 | virtual bool Parse_gps (dng_stream &stream, |
330 | dng_shared &shared, |
331 | uint32 parentCode, |
332 | uint32 tagCode, |
333 | uint32 tagType, |
334 | uint32 tagCount, |
335 | uint64 tagOffset); |
336 | |
337 | virtual bool Parse_interoperability (dng_stream &stream, |
338 | dng_shared &shared, |
339 | uint32 parentCode, |
340 | uint32 tagCode, |
341 | uint32 tagType, |
342 | uint32 tagCount, |
343 | uint64 tagOffset); |
344 | |
345 | }; |
346 | |
347 | /*****************************************************************************/ |
348 | |
349 | #endif |
350 | |
351 | /*****************************************************************************/ |
352 | |