You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
352 lines
9.6 KiB
352 lines
9.6 KiB
/*****************************************************************************/
|
|
// 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
|
|
|
|
/*****************************************************************************/
|