10b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
20b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// Copyright 2006-2008 Adobe Systems Incorporated
30b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// All Rights Reserved.
40b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener//
50b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// NOTICE:  Adobe permits you to use, modify, and distribute this file in
60b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// accordance with the terms of the Adobe license agreement accompanying it.
70b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
80b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
90b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_exif.h#2 $ */
100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $DateTime: 2012/07/11 10:36:56 $ */
110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Change: 838485 $ */
120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Author: tknoll $ */
130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/** \file
150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener * EXIF read access support. See the \ref spec_exif "EXIF specification" for full
160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener * description of tags.
170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener */
180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#ifndef __dng_exif__
220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#define __dng_exif__
230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_classes.h"
270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_date_time.h"
280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_fingerprint.h"
290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_types.h"
300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_matrix.h"
310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_rational.h"
320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_string.h"
330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_stream.h"
340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_sdk_limits.h"
350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief Container class for parsing and holding EXIF tags.
390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener///
400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// Public member fields are documented in \ref spec_exif "EXIF specification."
410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_exif
430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fImageDescription;
480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fMake;
490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fModel;
500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fSoftware;
510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fArtist;
520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fCopyright;
530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fCopyright2;
540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fUserComment;
550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_date_time_info         fDateTime;
570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_date_time_storage_info fDateTimeStorageInfo;
580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_date_time_info		   fDateTimeOriginal;
600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_date_time_storage_info fDateTimeOriginalStorageInfo;
610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_date_time_info 		   fDateTimeDigitized;
630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_date_time_storage_info fDateTimeDigitizedStorageInfo;
640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fTIFF_EP_StandardID;
660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fExifVersion;
670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fFlashPixVersion;
680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fExposureTime;
700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fFNumber;
710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_srational fShutterSpeedValue;
720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fApertureValue;
730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_srational fBrightnessValue;
740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_srational fExposureBiasValue;
750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fMaxApertureValue;
760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fFocalLength;
770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fDigitalZoomRatio;
780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fExposureIndex;
790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fSubjectDistance;
800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fGamma;
810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fBatteryLevelR;
830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string    fBatteryLevelA;
840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fExposureProgram;
860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fMeteringMode;
870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fLightSource;
880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fFlash;
890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fFlashMask;
900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fSensingMethod;
910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fColorSpace;
920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fFileSource;
930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fSceneType;
940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fCustomRendered;
950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fExposureMode;
960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fWhiteBalance;
970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fSceneCaptureType;
980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fGainControl;
990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fContrast;
1000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fSaturation;
1010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fSharpness;
1020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fSubjectDistanceRange;
1030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fSelfTimerMode;
1040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fImageNumber;
1050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fFocalLengthIn35mmFilm;
1070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fISOSpeedRatings [3];		 // EXIF 2.3: PhotographicSensitivity.
1090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// Sensitivity tags added in EXIF 2.3.
1110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fSensitivityType;
1130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fStandardOutputSensitivity;
1140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fRecommendedExposureIndex;
1150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fISOSpeed;
1160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fISOSpeedLatitudeyyy;
1170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fISOSpeedLatitudezzz;
1180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fSubjectAreaCount;
1200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fSubjectArea [4];
1210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fComponentsConfiguration;
1230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fCompresssedBitsPerPixel;
1250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fPixelXDimension;
1270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fPixelYDimension;
1280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fFocalPlaneXResolution;
1300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fFocalPlaneYResolution;
1310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fFocalPlaneResolutionUnit;
1330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fCFARepeatPatternRows;
1350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fCFARepeatPatternCols;
1360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint8 fCFAPattern [kMaxCFAPattern] [kMaxCFAPattern];
1380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_fingerprint fImageUniqueID;
1400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 	      fGPSVersionID;
1420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string    fGPSLatitudeRef;
1430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fGPSLatitude [3];
1440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string    fGPSLongitudeRef;
1450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fGPSLongitude [3];
1460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32	      fGPSAltitudeRef;
1470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fGPSAltitude;
1480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fGPSTimeStamp [3];
1490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string    fGPSSatellites;
1500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string    fGPSStatus;
1510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string    fGPSMeasureMode;
1520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fGPSDOP;
1530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string    fGPSSpeedRef;
1540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fGPSSpeed;
1550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string    fGPSTrackRef;
1560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fGPSTrack;
1570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string    fGPSImgDirectionRef;
1580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fGPSImgDirection;
1590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string    fGPSMapDatum;
1600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string    fGPSDestLatitudeRef;
1610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fGPSDestLatitude [3];
1620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string    fGPSDestLongitudeRef;
1630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fGPSDestLongitude [3];
1640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string    fGPSDestBearingRef;
1650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fGPSDestBearing;
1660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string    fGPSDestDistanceRef;
1670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fGPSDestDistance;
1680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string    fGPSProcessingMethod;
1690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string    fGPSAreaInformation;
1700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string    fGPSDateStamp;
1710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 	      fGPSDifferential;
1720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fGPSHPositioningError;
1730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fInteroperabilityIndex;
1750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fInteroperabilityVersion;
1770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fRelatedImageFileFormat;
1790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fRelatedImageWidth;
1810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fRelatedImageLength;
1820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fCameraSerialNumber;		 // EXIF 2.3: BodySerialNumber.
1840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fLensInfo [4];		 // EXIF 2.3: LensSpecification.
1860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fLensID;
1880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fLensMake;
1890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fLensName;				 // EXIF 2.3: LensModel.
1900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fLensSerialNumber;
1910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// Was the lens name field read from a LensModel tag?
1930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		bool fLensNameWasReadFromExif;
1950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// Private field to hold the approximate focus distance of the lens, in
1970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// meters. This value is often coarsely measured/reported and hence should be
1980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// interpreted only as a rough estimate of the true distance from the plane
1990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// of focus (in object space) to the focal plane. It is still useful for the
2000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// purposes of applying lens corrections.
2010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_urational fApproxFocusDistance;
2030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_srational fFlashCompensation;
2050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fOwnerName;				 // EXIF 2.3: CameraOwnerName.
2070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_string fFirmware;
2080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
2100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_exif ();
2120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual ~dng_exif ();
2140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Make clone.
2160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual dng_exif * Clone () const;
2180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Clear all EXIF fields.
2200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetEmpty ();
2220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Copy all GPS-related fields.
2240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param exif Source object from which to copy GPS fields.
2250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void CopyGPSFrom (const dng_exif &exif);
2270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Utility to fix up common errors and rounding issues with EXIF exposure
2290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// times.
2300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		static real64 SnapExposureTime (real64 et);
2320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Set exposure time and shutter speed fields. Optionally fix up common
2340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// errors and rounding issues with EXIF exposure times.
2350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param et Exposure time in seconds.
2360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param snap Set to true to fix up common errors and rounding issues with
2370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// EXIF exposure times.
2380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetExposureTime (real64 et,
2400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							  bool snap = true);
2410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Set shutter speed value (APEX units) and exposure time.
2430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param Shutter speed in APEX units.
2440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetShutterSpeedValue (real64 ss);
2460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Utility to encode f-number as a rational.
2480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param fs The f-number to encode.
2490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		static dng_urational EncodeFNumber (real64 fs);
2510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Set the FNumber and ApertureValue fields.
2530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param fs The f-number to set.
2540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetFNumber (real64 fs);
2560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Set the FNumber and ApertureValue fields.
2580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param av The aperture value (APEX units).
2590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetApertureValue (real64 av);
2610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Utility to convert aperture value (APEX units) to f-number.
2630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param av The aperture value (APEX units) to convert.
2640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		static real64 ApertureValueToFNumber (real64 av);
2660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Utility to convert aperture value (APEX units) to f-number.
2680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param av The aperture value (APEX units) to convert.
2690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		static real64 ApertureValueToFNumber (const dng_urational &av);
2710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Utility to convert f-number to aperture value (APEX units).
2730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param fNumber The f-number to convert.
2740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		static real64 FNumberToApertureValue (real64 fNumber);
2760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Utility to convert f-number to aperture value (APEX units).
2780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param fNumber The f-number to convert.
2790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		static real64 FNumberToApertureValue (const dng_urational &fNumber);
2810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Set the DateTime field.
2830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param dt The DateTime value.
2840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void UpdateDateTime (const dng_date_time_info &dt);
2860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Returns true iff the EXIF version is at least 2.3.
2880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		bool AtLeastVersion0230 () const;
2900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual bool ParseTag (dng_stream &stream,
2920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							   dng_shared &shared,
2930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							   uint32 parentCode,
2940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							   bool isMainIFD,
2950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							   uint32 tagCode,
2960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							   uint32 tagType,
2970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							   uint32 tagCount,
2980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							   uint64 tagOffset);
2990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void PostParse (dng_host &host,
3010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								dng_shared &shared);
3020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
3040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual bool Parse_ifd0 (dng_stream &stream,
3060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							     dng_shared &shared,
3070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							 	 uint32 parentCode,
3080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							 	 uint32 tagCode,
3090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							 	 uint32 tagType,
3100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							 	 uint32 tagCount,
3110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							 	 uint64 tagOffset);
3120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual bool Parse_ifd0_main (dng_stream &stream,
3140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							          dng_shared &shared,
3150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 		 	  uint32 parentCode,
3160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 		 	  uint32 tagCode,
3170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 		 	  uint32 tagType,
3180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 		 	  uint32 tagCount,
3190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 		 	  uint64 tagOffset);
3200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual bool Parse_ifd0_exif (dng_stream &stream,
3220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							          dng_shared &shared,
3230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 		 	  uint32 parentCode,
3240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 		 	  uint32 tagCode,
3250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 		 	  uint32 tagType,
3260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 		 	  uint32 tagCount,
3270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 		 	  uint64 tagOffset);
3280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual bool Parse_gps (dng_stream &stream,
3300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							    dng_shared &shared,
3310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 		uint32 parentCode,
3320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 		uint32 tagCode,
3330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 		uint32 tagType,
3340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 		uint32 tagCount,
3350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 		uint64 tagOffset);
3360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual bool Parse_interoperability (dng_stream &stream,
3380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							    			 dng_shared &shared,
3390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 					 uint32 parentCode,
3400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener											 uint32 tagCode,
3410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener											 uint32 tagType,
3420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener											 uint32 tagCount,
3430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener											 uint64 tagOffset);
3440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
3460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
3480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#endif
3500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
352