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