Home | History | Annotate | Download | only in source
      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 
     42 class 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