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 fUserComment;
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