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
42class 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