/*****************************************************************************/
// Copyright 2006-2008 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in
// accordance with the terms of the Adobe license agreement accompanying it.
/*****************************************************************************/
/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_exif.h#2 $ */
/* $DateTime: 2012/07/11 10:36:56 $ */
/* $Change: 838485 $ */
/* $Author: tknoll $ */
/** \file
* EXIF read access support. See the \ref spec_exif "EXIF specification" for full
* description of tags.
*/
/*****************************************************************************/
#ifndef __dng_exif__
#define __dng_exif__
/*****************************************************************************/
#include "dng_classes.h"
#include "dng_date_time.h"
#include "dng_fingerprint.h"
#include "dng_types.h"
#include "dng_matrix.h"
#include "dng_rational.h"
#include "dng_string.h"
#include "dng_stream.h"
#include "dng_sdk_limits.h"
/*****************************************************************************/
/// \brief Container class for parsing and holding EXIF tags.
///
/// Public member fields are documented in \ref spec_exif "EXIF specification."
class dng_exif
{
public:
dng_string fImageDescription;
dng_string fMake;
dng_string fModel;
dng_string fSoftware;
dng_string fArtist;
dng_string fCopyright;
dng_string fCopyright2;
dng_string fUserComment;
dng_date_time_info fDateTime;
dng_date_time_storage_info fDateTimeStorageInfo;
dng_date_time_info fDateTimeOriginal;
dng_date_time_storage_info fDateTimeOriginalStorageInfo;
dng_date_time_info fDateTimeDigitized;
dng_date_time_storage_info fDateTimeDigitizedStorageInfo;
uint32 fTIFF_EP_StandardID;
uint32 fExifVersion;
uint32 fFlashPixVersion;
dng_urational fExposureTime;
dng_urational fFNumber;
dng_srational fShutterSpeedValue;
dng_urational fApertureValue;
dng_srational fBrightnessValue;
dng_srational fExposureBiasValue;
dng_urational fMaxApertureValue;
dng_urational fFocalLength;
dng_urational fDigitalZoomRatio;
dng_urational fExposureIndex;
dng_urational fSubjectDistance;
dng_urational fGamma;
dng_urational fBatteryLevelR;
dng_string fBatteryLevelA;
uint32 fExposureProgram;
uint32 fMeteringMode;
uint32 fLightSource;
uint32 fFlash;
uint32 fFlashMask;
uint32 fSensingMethod;
uint32 fColorSpace;
uint32 fFileSource;
uint32 fSceneType;
uint32 fCustomRendered;
uint32 fExposureMode;
uint32 fWhiteBalance;
uint32 fSceneCaptureType;
uint32 fGainControl;
uint32 fContrast;
uint32 fSaturation;
uint32 fSharpness;
uint32 fSubjectDistanceRange;
uint32 fSelfTimerMode;
uint32 fImageNumber;
uint32 fFocalLengthIn35mmFilm;
uint32 fISOSpeedRatings [3]; // EXIF 2.3: PhotographicSensitivity.
// Sensitivity tags added in EXIF 2.3.
uint32 fSensitivityType;
uint32 fStandardOutputSensitivity;
uint32 fRecommendedExposureIndex;
uint32 fISOSpeed;
uint32 fISOSpeedLatitudeyyy;
uint32 fISOSpeedLatitudezzz;
uint32 fSubjectAreaCount;
uint32 fSubjectArea [4];
uint32 fComponentsConfiguration;
dng_urational fCompresssedBitsPerPixel;
uint32 fPixelXDimension;
uint32 fPixelYDimension;
dng_urational fFocalPlaneXResolution;
dng_urational fFocalPlaneYResolution;
uint32 fFocalPlaneResolutionUnit;
uint32 fCFARepeatPatternRows;
uint32 fCFARepeatPatternCols;
uint8 fCFAPattern [kMaxCFAPattern] [kMaxCFAPattern];
dng_fingerprint fImageUniqueID;
uint32 fGPSVersionID;
dng_string fGPSLatitudeRef;
dng_urational fGPSLatitude [3];
dng_string fGPSLongitudeRef;
dng_urational fGPSLongitude [3];
uint32 fGPSAltitudeRef;
dng_urational fGPSAltitude;
dng_urational fGPSTimeStamp [3];
dng_string fGPSSatellites;
dng_string fGPSStatus;
dng_string fGPSMeasureMode;
dng_urational fGPSDOP;
dng_string fGPSSpeedRef;
dng_urational fGPSSpeed;
dng_string fGPSTrackRef;
dng_urational fGPSTrack;
dng_string fGPSImgDirectionRef;
dng_urational fGPSImgDirection;
dng_string fGPSMapDatum;
dng_string fGPSDestLatitudeRef;
dng_urational fGPSDestLatitude [3];
dng_string fGPSDestLongitudeRef;
dng_urational fGPSDestLongitude [3];
dng_string fGPSDestBearingRef;
dng_urational fGPSDestBearing;
dng_string fGPSDestDistanceRef;
dng_urational fGPSDestDistance;
dng_string fGPSProcessingMethod;
dng_string fGPSAreaInformation;
dng_string fGPSDateStamp;
uint32 fGPSDifferential;
dng_urational fGPSHPositioningError;
dng_string fInteroperabilityIndex;
uint32 fInteroperabilityVersion;
dng_string fRelatedImageFileFormat;
uint32 fRelatedImageWidth;
uint32 fRelatedImageLength;
dng_string fCameraSerialNumber; // EXIF 2.3: BodySerialNumber.
dng_urational fLensInfo [4]; // EXIF 2.3: LensSpecification.
dng_string fLensID;
dng_string fLensMake;
dng_string fLensName; // EXIF 2.3: LensModel.
dng_string fLensSerialNumber;
// Was the lens name field read from a LensModel tag?
bool fLensNameWasReadFromExif;
// Private field to hold the approximate focus distance of the lens, in
// meters. This value is often coarsely measured/reported and hence should be
// interpreted only as a rough estimate of the true distance from the plane
// of focus (in object space) to the focal plane. It is still useful for the
// purposes of applying lens corrections.
dng_urational fApproxFocusDistance;
dng_srational fFlashCompensation;
dng_string fOwnerName; // EXIF 2.3: CameraOwnerName.
dng_string fFirmware;
public:
dng_exif ();
virtual ~dng_exif ();
/// Make clone.
virtual dng_exif * Clone () const;
/// Clear all EXIF fields.
void SetEmpty ();
/// Copy all GPS-related fields.
/// \param exif Source object from which to copy GPS fields.
void CopyGPSFrom (const dng_exif &exif);
/// Utility to fix up common errors and rounding issues with EXIF exposure
/// times.
static real64 SnapExposureTime (real64 et);
/// Set exposure time and shutter speed fields. Optionally fix up common
/// errors and rounding issues with EXIF exposure times.
/// \param et Exposure time in seconds.
/// \param snap Set to true to fix up common errors and rounding issues with
/// EXIF exposure times.
void SetExposureTime (real64 et,
bool snap = true);
/// Set shutter speed value (APEX units) and exposure time.
/// \param Shutter speed in APEX units.
void SetShutterSpeedValue (real64 ss);
/// Utility to encode f-number as a rational.
/// \param fs The f-number to encode.
static dng_urational EncodeFNumber (real64 fs);
/// Set the FNumber and ApertureValue fields.
/// \param fs The f-number to set.
void SetFNumber (real64 fs);
/// Set the FNumber and ApertureValue fields.
/// \param av The aperture value (APEX units).
void SetApertureValue (real64 av);
/// Utility to convert aperture value (APEX units) to f-number.
/// \param av The aperture value (APEX units) to convert.
static real64 ApertureValueToFNumber (real64 av);
/// Utility to convert aperture value (APEX units) to f-number.
/// \param av The aperture value (APEX units) to convert.
static real64 ApertureValueToFNumber (const dng_urational &av);
/// Utility to convert f-number to aperture value (APEX units).
/// \param fNumber The f-number to convert.
static real64 FNumberToApertureValue (real64 fNumber);
/// Utility to convert f-number to aperture value (APEX units).
/// \param fNumber The f-number to convert.
static real64 FNumberToApertureValue (const dng_urational &fNumber);
/// Set the DateTime field.
/// \param dt The DateTime value.
void UpdateDateTime (const dng_date_time_info &dt);
/// Returns true iff the EXIF version is at least 2.3.
bool AtLeastVersion0230 () const;
virtual bool ParseTag (dng_stream &stream,
dng_shared &shared,
uint32 parentCode,
bool isMainIFD,
uint32 tagCode,
uint32 tagType,
uint32 tagCount,
uint64 tagOffset);
virtual void PostParse (dng_host &host,
dng_shared &shared);
protected:
virtual bool Parse_ifd0 (dng_stream &stream,
dng_shared &shared,
uint32 parentCode,
uint32 tagCode,
uint32 tagType,
uint32 tagCount,
uint64 tagOffset);
virtual bool Parse_ifd0_main (dng_stream &stream,
dng_shared &shared,
uint32 parentCode,
uint32 tagCode,
uint32 tagType,
uint32 tagCount,
uint64 tagOffset);
virtual bool Parse_ifd0_exif (dng_stream &stream,
dng_shared &shared,
uint32 parentCode,
uint32 tagCode,
uint32 tagType,
uint32 tagCount,
uint64 tagOffset);
virtual bool Parse_gps (dng_stream &stream,
dng_shared &shared,
uint32 parentCode,
uint32 tagCode,
uint32 tagType,
uint32 tagCount,
uint64 tagOffset);
virtual bool Parse_interoperability (dng_stream &stream,
dng_shared &shared,
uint32 parentCode,
uint32 tagCode,
uint32 tagType,
uint32 tagCount,
uint64 tagOffset);
};
/*****************************************************************************/
#endif
/*****************************************************************************/