/src/FreeImage/Source/Metadata/Exif.cpp

https://bitbucket.org/cabalistic/ogredeps/ · C++ · 859 lines · 517 code · 123 blank · 219 comment · 157 complexity · 217e501f0f48472bcf9c61100018106c MD5 · raw file

  1. // ==========================================================
  2. // Metadata functions implementation
  3. // Exif metadata model
  4. //
  5. // Design and implementation by
  6. // - Hervé Drolon (drolon@infonie.fr)
  7. // - Mihail Naydenov (mnaydenov@users.sourceforge.net)
  8. //
  9. // Based on the following implementations:
  10. // - metadata-extractor : http://www.drewnoakes.com/code/exif/
  11. // - jhead : http://www.sentex.net/~mwandel/jhead/
  12. // - ImageMagick : http://www.imagemagick.org/
  13. //
  14. // This file is part of FreeImage 3
  15. //
  16. // COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
  17. // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
  18. // THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
  19. // OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
  20. // CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
  21. // THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
  22. // SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
  23. // PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
  24. // THIS DISCLAIMER.
  25. //
  26. // Use at your own risk!
  27. // ==========================================================
  28. #ifdef _MSC_VER
  29. #pragma warning (disable : 4786) // identifier was truncated to 'number' characters
  30. #endif
  31. #include "FreeImage.h"
  32. #include "Utilities.h"
  33. #include "FreeImageTag.h"
  34. // ==========================================================
  35. // Exif JPEG routines
  36. // ==========================================================
  37. #define EXIF_NUM_FORMATS 12
  38. #define TAG_EXIF_OFFSET 0x8769 // Exif IFD Pointer
  39. #define TAG_GPS_OFFSET 0x8825 // GPS Info IFD Pointer
  40. #define TAG_INTEROP_OFFSET 0xA005 // Interoperability IFD Pointer
  41. #define TAG_MAKER_NOTE 0x927C // Maker note
  42. // CANON cameras have some funny bespoke fields that need further processing...
  43. #define TAG_CANON_CAMERA_STATE_0x01 0x0001 // tags under tag 0x001 (CameraSettings)
  44. #define TAG_CANON_CAMERA_STATE_0x02 0x0002 // tags under tag 0x002 (FocalLength)
  45. #define TAG_CANON_CAMERA_STATE_0x04 0x0004 // tags under tag 0x004 (ShotInfo)
  46. #define TAG_CANON_CAMERA_STATE_0x12 0x0012 // tags under tag 0x012 (AFInfo)
  47. #define TAG_CANON_CAMERA_STATE_0xA0 0x00A0 // tags under tag 0x0A0 (ProcessingInfo)
  48. #define TAG_CANON_CAMERA_STATE_0xE0 0x00E0 // tags under tag 0x0E0 (SensorInfo)
  49. // =====================================================================
  50. // Reimplementation of strnicmp (it is not supported on some systems)
  51. // =====================================================================
  52. /**
  53. Compare characters of two strings without regard to case.
  54. @param s1 Null-terminated string to compare.
  55. @param s2 Null-terminated string to compare.
  56. @param len Number of characters to compare
  57. @return Returns 0 if s1 substring identical to s2 substring
  58. */
  59. static int
  60. FreeImage_strnicmp(const char *s1, const char *s2, size_t len) {
  61. unsigned char c1, c2;
  62. if(!s1 || !s2) return -1;
  63. c1 = 0; c2 = 0;
  64. if(len) {
  65. do {
  66. c1 = *s1; c2 = *s2;
  67. s1++; s2++;
  68. if (!c1)
  69. break;
  70. if (!c2)
  71. break;
  72. if (c1 == c2)
  73. continue;
  74. c1 = (BYTE)tolower(c1);
  75. c2 = (BYTE)tolower(c2);
  76. if (c1 != c2)
  77. break;
  78. } while (--len);
  79. }
  80. return (int)c1 - (int)c2;
  81. }
  82. // ----------------------------------------------------------
  83. // Little Endian / Big Endian io routines
  84. // ----------------------------------------------------------
  85. static short
  86. ReadInt16(BOOL msb_order, const void *buffer) {
  87. short value;
  88. if(msb_order) {
  89. value = (short)((((BYTE*) buffer)[0] << 8) | ((BYTE*) buffer)[1]);
  90. return value;
  91. }
  92. value = (short)((((BYTE*) buffer)[1] << 8) | ((BYTE*) buffer)[0]);
  93. return value;
  94. }
  95. static LONG
  96. ReadInt32(BOOL msb_order, const void *buffer) {
  97. LONG value;
  98. if(msb_order) {
  99. value = (LONG)((((BYTE*) buffer)[0] << 24) | (((BYTE*) buffer)[1] << 16) | (((BYTE*) buffer)[2] << 8) | (((BYTE*) buffer)[3]));
  100. return value;
  101. }
  102. value = (LONG)((((BYTE*) buffer)[3] << 24) | (((BYTE*) buffer)[2] << 16) | (((BYTE*) buffer)[1] << 8 ) | (((BYTE*) buffer)[0]));
  103. return value;
  104. }
  105. static unsigned short
  106. ReadUint16(BOOL msb_order, const void *buffer) {
  107. unsigned short value;
  108. if(msb_order) {
  109. value = (unsigned short) ((((BYTE*) buffer)[0] << 8) | ((BYTE*) buffer)[1]);
  110. return value;
  111. }
  112. value = (unsigned short) ((((BYTE*) buffer)[1] << 8) | ((BYTE*) buffer)[0]);
  113. return value;
  114. }
  115. static DWORD
  116. ReadUint32(BOOL msb_order, const void *buffer) {
  117. return ((DWORD) ReadInt32(msb_order, buffer) & 0xFFFFFFFF);
  118. }
  119. // ----------------------------------------------------------
  120. // Exif JPEG markers routines
  121. // ----------------------------------------------------------
  122. /**
  123. Process a IFD offset
  124. Returns the offset and the metadata model for this tag
  125. */
  126. static void
  127. processIFDOffset(FITAG *tag, char *pval, BOOL msb_order, DWORD *subdirOffset, TagLib::MDMODEL *md_model) {
  128. // get the IFD offset
  129. *subdirOffset = (DWORD) ReadUint32(msb_order, pval);
  130. // select a tag info table
  131. switch(FreeImage_GetTagID(tag)) {
  132. case TAG_EXIF_OFFSET:
  133. *md_model = TagLib::EXIF_EXIF;
  134. break;
  135. case TAG_GPS_OFFSET:
  136. *md_model = TagLib::EXIF_GPS;
  137. break;
  138. case TAG_INTEROP_OFFSET:
  139. *md_model = TagLib::EXIF_INTEROP;
  140. break;
  141. }
  142. }
  143. /**
  144. Process a maker note IFD offset
  145. Returns the offset and the metadata model for this tag
  146. */
  147. static void
  148. processMakerNote(FIBITMAP *dib, char *pval, BOOL msb_order, DWORD *subdirOffset, TagLib::MDMODEL *md_model) {
  149. FITAG *tagMake = NULL;
  150. *subdirOffset = 0;
  151. *md_model = TagLib::UNKNOWN;
  152. // Determine the camera model and makernote format
  153. // WARNING: note that Maker may be NULL sometimes so check its value before using it
  154. // (NULL pointer checking is done by FreeImage_strnicmp)
  155. FreeImage_GetMetadata(FIMD_EXIF_MAIN, dib, "Make", &tagMake);
  156. const char *Maker = (char*)FreeImage_GetTagValue(tagMake);
  157. if((memcmp("OLYMP\x00\x01", pval, 7) == 0) || (memcmp("OLYMP\x00\x02", pval, 7) == 0) || (memcmp("EPSON", pval, 5) == 0) || (memcmp("AGFA", pval, 4) == 0)) {
  158. // Olympus Type 1 Makernote
  159. // Epson and Agfa use Olympus maker note standard,
  160. // see: http://www.ozhiker.com/electronics/pjmt/jpeg_info/
  161. *md_model = TagLib::EXIF_MAKERNOTE_OLYMPUSTYPE1;
  162. *subdirOffset = 8;
  163. }
  164. else if(memcmp("OLYMPUS\x00\x49\x49\x03\x00", pval, 12) == 0) {
  165. // Olympus Type 2 Makernote
  166. // !!! NOT YET SUPPORTED !!!
  167. *subdirOffset = 0;
  168. *md_model = TagLib::UNKNOWN;
  169. }
  170. else if(memcmp("Nikon", pval, 5) == 0) {
  171. /* There are two scenarios here:
  172. * Type 1:
  173. * :0000: 4E 69 6B 6F 6E 00 01 00-05 00 02 00 02 00 06 00 Nikon...........
  174. * :0010: 00 00 EC 02 00 00 03 00-03 00 01 00 00 00 06 00 ................
  175. * Type 3:
  176. * :0000: 4E 69 6B 6F 6E 00 02 00-00 00 4D 4D 00 2A 00 00 Nikon....MM.*...
  177. * :0010: 00 08 00 1E 00 01 00 07-00 00 00 04 30 32 30 30 ............0200
  178. */
  179. if (pval[6] == 1) {
  180. // Nikon type 1 Makernote
  181. *md_model = TagLib::EXIF_MAKERNOTE_NIKONTYPE1;
  182. *subdirOffset = 8;
  183. } else if (pval[6] == 2) {
  184. // Nikon type 3 Makernote
  185. *md_model = TagLib::EXIF_MAKERNOTE_NIKONTYPE3;
  186. *subdirOffset = 18;
  187. } else {
  188. // Unsupported makernote data ignored
  189. *subdirOffset = 0;
  190. *md_model = TagLib::UNKNOWN;
  191. }
  192. } else if(Maker && (FreeImage_strnicmp("NIKON", Maker, 5) == 0)) {
  193. // Nikon type 2 Makernote
  194. *md_model = TagLib::EXIF_MAKERNOTE_NIKONTYPE2;
  195. *subdirOffset = 0;
  196. } else if(Maker && (FreeImage_strnicmp("Canon", Maker, 5) == 0)) {
  197. // Canon Makernote
  198. *md_model = TagLib::EXIF_MAKERNOTE_CANON;
  199. *subdirOffset = 0;
  200. } else if(Maker && (FreeImage_strnicmp("Casio", Maker, 5) == 0)) {
  201. // Casio Makernote
  202. if(memcmp("QVC\x00\x00\x00", pval, 6) == 0) {
  203. // Casio Type 2 Makernote
  204. *md_model = TagLib::EXIF_MAKERNOTE_CASIOTYPE2;
  205. *subdirOffset = 6;
  206. } else {
  207. // Casio Type 1 Makernote
  208. *md_model = TagLib::EXIF_MAKERNOTE_CASIOTYPE1;
  209. *subdirOffset = 0;
  210. }
  211. } else if ((memcmp("FUJIFILM", pval, 8) == 0) || (Maker && (FreeImage_strnicmp("Fujifilm", Maker, 8) == 0))) {
  212. // Fujifile Makernote
  213. // Fujifilm's Makernote always use Intel order altough the Exif section maybe in Intel order or in Motorola order.
  214. // If msb_order == TRUE, the Makernote won't be read:
  215. // the value of ifdStart will be 0x0c000000 instead of 0x0000000c and the MakerNote section will be discarded later
  216. // in jpeg_read_exif_dir because the IFD is too high
  217. *md_model = TagLib::EXIF_MAKERNOTE_FUJIFILM;
  218. DWORD ifdStart = (DWORD) ReadUint32(msb_order, pval + 8);
  219. *subdirOffset = ifdStart;
  220. }
  221. else if(memcmp("KYOCERA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x00\x00\x00", pval, 22) == 0) {
  222. *md_model = TagLib::EXIF_MAKERNOTE_KYOCERA;
  223. *subdirOffset = 22;
  224. }
  225. else if(Maker && (FreeImage_strnicmp("Minolta", Maker, 7) == 0)) {
  226. // Minolta maker note
  227. *md_model = TagLib::EXIF_MAKERNOTE_MINOLTA;
  228. *subdirOffset = 0;
  229. }
  230. else if(memcmp("Panasonic\x00\x00\x00", pval, 12) == 0) {
  231. // Panasonic maker note
  232. *md_model = TagLib::EXIF_MAKERNOTE_PANASONIC;
  233. *subdirOffset = 12;
  234. }
  235. else if(Maker && (FreeImage_strnicmp("LEICA", Maker, 5) == 0)) {
  236. // Leica maker note
  237. if(memcmp("LEICA\x00\x00\x00", pval, 8) == 0) {
  238. // not yet supported makernote data ignored
  239. *subdirOffset = 0;
  240. *md_model = TagLib::UNKNOWN;
  241. }
  242. }
  243. else if(Maker && ((FreeImage_strnicmp("Pentax", Maker, 6) == 0) || (FreeImage_strnicmp("Asahi", Maker, 5) == 0))) {
  244. // Pentax maker note
  245. if(memcmp("AOC\x00", pval, 4) == 0) {
  246. // Type 2 Pentax Makernote
  247. *md_model = TagLib::EXIF_MAKERNOTE_PENTAX;
  248. *subdirOffset = 6;
  249. } else {
  250. // Type 1 Pentax Makernote
  251. *md_model = TagLib::EXIF_MAKERNOTE_ASAHI;
  252. *subdirOffset = 0;
  253. }
  254. }
  255. else if((memcmp("SONY CAM\x20\x00\x00\x00", pval, 12) == 0) || (memcmp("SONY DSC\x20\x00\x00\x00", pval, 12) == 0)) {
  256. *md_model = TagLib::EXIF_MAKERNOTE_SONY;
  257. *subdirOffset = 12;
  258. }
  259. else if((memcmp("SIGMA\x00\x00\x00", pval, 8) == 0) || (memcmp("FOVEON\x00\x00", pval, 8) == 0)) {
  260. FITAG *tagModel = NULL;
  261. FreeImage_GetMetadata(FIMD_EXIF_MAIN, dib, "Model", &tagModel);
  262. const char *Model = (char*)FreeImage_GetTagValue(tagModel);
  263. if(Model && (memcmp("SIGMA SD1\x00", Model, 10) == 0)) {
  264. // Sigma SD1 maker note
  265. *subdirOffset = 10;
  266. *md_model = TagLib::EXIF_MAKERNOTE_SIGMA_SD1;
  267. } else {
  268. // Sigma / Foveon makernote
  269. *subdirOffset = 10;
  270. *md_model = TagLib::EXIF_MAKERNOTE_SIGMA_FOVEON;
  271. }
  272. }
  273. }
  274. /**
  275. Process a Canon maker note tag.
  276. A single Canon tag may contain many other tags within.
  277. */
  278. static BOOL
  279. processCanonMakerNoteTag(FIBITMAP *dib, FITAG *tag) {
  280. char defaultKey[16];
  281. DWORD startIndex = 0;
  282. TagLib& s = TagLib::instance();
  283. WORD tag_id = FreeImage_GetTagID(tag);
  284. int subTagTypeBase = 0;
  285. switch(tag_id) {
  286. case TAG_CANON_CAMERA_STATE_0x01:
  287. subTagTypeBase = 0xC100;
  288. startIndex = 1;
  289. break;
  290. case TAG_CANON_CAMERA_STATE_0x02:
  291. subTagTypeBase = 0xC200;
  292. startIndex = 0;
  293. break;
  294. case TAG_CANON_CAMERA_STATE_0x04:
  295. subTagTypeBase = 0xC400;
  296. startIndex = 1;
  297. break;
  298. case TAG_CANON_CAMERA_STATE_0x12:
  299. subTagTypeBase = 0x1200;
  300. startIndex = 0;
  301. break;
  302. case TAG_CANON_CAMERA_STATE_0xA0:
  303. subTagTypeBase = 0xCA00;
  304. startIndex = 1;
  305. break;
  306. case TAG_CANON_CAMERA_STATE_0xE0:
  307. subTagTypeBase = 0xCE00;
  308. startIndex = 1;
  309. break;
  310. default:
  311. {
  312. // process as a normal tag
  313. // get the tag key and description
  314. const char *key = s.getTagFieldName(TagLib::EXIF_MAKERNOTE_CANON, tag_id, defaultKey);
  315. FreeImage_SetTagKey(tag, key);
  316. const char *description = s.getTagDescription(TagLib::EXIF_MAKERNOTE_CANON, tag_id);
  317. FreeImage_SetTagDescription(tag, description);
  318. // store the tag
  319. if(key) {
  320. FreeImage_SetMetadata(FIMD_EXIF_MAKERNOTE, dib, key, tag);
  321. }
  322. return TRUE;
  323. }
  324. break;
  325. }
  326. WORD *pvalue = (WORD*)FreeImage_GetTagValue(tag);
  327. // create a tag
  328. FITAG *canonTag = FreeImage_CreateTag();
  329. if(!canonTag) return FALSE;
  330. // we intentionally skip the first array member (if needed)
  331. for (DWORD i = startIndex; i < FreeImage_GetTagCount(tag); i++) {
  332. tag_id = (WORD)(subTagTypeBase + i);
  333. FreeImage_SetTagID(canonTag, tag_id);
  334. FreeImage_SetTagType(canonTag, FIDT_SHORT);
  335. FreeImage_SetTagCount(canonTag, 1);
  336. FreeImage_SetTagLength(canonTag, 2);
  337. FreeImage_SetTagValue(canonTag, &pvalue[i]);
  338. // get the tag key and description
  339. const char *key = s.getTagFieldName(TagLib::EXIF_MAKERNOTE_CANON, tag_id, defaultKey);
  340. FreeImage_SetTagKey(canonTag, key);
  341. const char *description = s.getTagDescription(TagLib::EXIF_MAKERNOTE_CANON, tag_id);
  342. FreeImage_SetTagDescription(canonTag, description);
  343. // store the tag
  344. if(key) {
  345. FreeImage_SetMetadata(FIMD_EXIF_MAKERNOTE, dib, key, canonTag);
  346. }
  347. }
  348. // delete the tag
  349. FreeImage_DeleteTag(canonTag);
  350. return TRUE;
  351. }
  352. /**
  353. Process a standard Exif tag
  354. */
  355. static void
  356. processExifTag(FIBITMAP *dib, FITAG *tag, char *pval, BOOL msb_order, TagLib::MDMODEL md_model) {
  357. char defaultKey[16];
  358. int n;
  359. DWORD i;
  360. // allocate a buffer to store the tag value
  361. BYTE *exif_value = (BYTE*)malloc(FreeImage_GetTagLength(tag) * sizeof(BYTE));
  362. if(NULL == exif_value) {
  363. // out of memory ...
  364. return;
  365. }
  366. memset(exif_value, 0, FreeImage_GetTagLength(tag) * sizeof(BYTE));
  367. // get the tag value
  368. switch(FreeImage_GetTagType(tag)) {
  369. case FIDT_SHORT:
  370. {
  371. WORD *value = (WORD*)&exif_value[0];
  372. for(i = 0; i < FreeImage_GetTagCount(tag); i++) {
  373. value[i] = ReadUint16(msb_order, pval + i * sizeof(WORD));
  374. }
  375. FreeImage_SetTagValue(tag, value);
  376. break;
  377. }
  378. case FIDT_SSHORT:
  379. {
  380. short *value = (short*)&exif_value[0];
  381. for(i = 0; i < FreeImage_GetTagCount(tag); i++) {
  382. value[i] = ReadInt16(msb_order, pval + i * sizeof(short));
  383. }
  384. FreeImage_SetTagValue(tag, value);
  385. break;
  386. }
  387. case FIDT_LONG:
  388. {
  389. DWORD *value = (DWORD*)&exif_value[0];
  390. for(i = 0; i < FreeImage_GetTagCount(tag); i++) {
  391. value[i] = ReadUint32(msb_order, pval + i * sizeof(DWORD));
  392. }
  393. FreeImage_SetTagValue(tag, value);
  394. break;
  395. }
  396. case FIDT_SLONG:
  397. {
  398. LONG *value = (LONG*)&exif_value[0];
  399. for(i = 0; i < FreeImage_GetTagCount(tag); i++) {
  400. value[i] = ReadInt32(msb_order, pval + i * sizeof(LONG));
  401. }
  402. FreeImage_SetTagValue(tag, value);
  403. break;
  404. }
  405. case FIDT_RATIONAL:
  406. {
  407. n = sizeof(DWORD);
  408. DWORD *value = (DWORD*)&exif_value[0];
  409. for(i = 0; i < 2 * FreeImage_GetTagCount(tag); i++) {
  410. // read a sequence of (numerator, denominator)
  411. value[i] = ReadUint32(msb_order, n*i + (char*)pval);
  412. }
  413. FreeImage_SetTagValue(tag, value);
  414. break;
  415. }
  416. case FIDT_SRATIONAL:
  417. {
  418. n = sizeof(LONG);
  419. LONG *value = (LONG*)&exif_value[0];
  420. for(i = 0; i < 2 * FreeImage_GetTagCount(tag); i++) {
  421. // read a sequence of (numerator, denominator)
  422. value[i] = ReadInt32(msb_order, n*i + (char*)pval);
  423. }
  424. FreeImage_SetTagValue(tag, value);
  425. break;
  426. }
  427. case FIDT_BYTE:
  428. case FIDT_ASCII:
  429. case FIDT_SBYTE:
  430. case FIDT_UNDEFINED:
  431. case FIDT_FLOAT:
  432. case FIDT_DOUBLE:
  433. default:
  434. FreeImage_SetTagValue(tag, pval);
  435. break;
  436. }
  437. if(md_model == TagLib::EXIF_MAKERNOTE_CANON) {
  438. // A single Canon tag can have multiple values within
  439. processCanonMakerNoteTag(dib, tag);
  440. }
  441. else {
  442. TagLib& s = TagLib::instance();
  443. WORD tag_id = FreeImage_GetTagID(tag);
  444. // get the tag key and description
  445. const char *key = s.getTagFieldName(md_model, tag_id, defaultKey);
  446. FreeImage_SetTagKey(tag, key);
  447. const char *description = s.getTagDescription(md_model, tag_id);
  448. FreeImage_SetTagDescription(tag, description);
  449. // store the tag
  450. if(key) {
  451. FreeImage_SetMetadata(s.getFreeImageModel(md_model), dib, key, tag);
  452. }
  453. }
  454. // free the temporary buffer
  455. free(exif_value);
  456. }
  457. /**
  458. Process Exif directory
  459. @param dib Input FIBITMAP
  460. @param tiffp Pointer to the TIFF header
  461. @param offset 0th IFD offset
  462. @param length Length of the datafile
  463. @param msb_order Endianess order of the datafile
  464. @return
  465. */
  466. static BOOL
  467. jpeg_read_exif_dir(FIBITMAP *dib, const BYTE *tiffp, unsigned long offset, unsigned int length, BOOL msb_order) {
  468. WORD de, nde;
  469. std::stack<WORD> destack; // directory entries stack
  470. std::stack<const BYTE*> ifdstack; // IFD stack
  471. std::stack<TagLib::MDMODEL> modelstack; // metadata model stack
  472. // Keep a list of already visited IFD to avoid stack overflows
  473. // when recursive/cyclic directory structures exist.
  474. // This kind of recursive Exif file was encountered with Kodak images coming from
  475. // KODAK PROFESSIONAL DCS Photo Desk JPEG Export v3.2 W
  476. std::map<DWORD, int> visitedIFD;
  477. /*
  478. "An Image File Directory (IFD) consists of a 2-byte count of the number of directory
  479. entries (i.e. the number of fields), followed by a sequence of 12-byte field
  480. entries, followed by a 4-byte offset of the next IFD (or 0 if none)."
  481. The "next IFD" (1st IFD) is the thumbnail.
  482. */
  483. #define DIR_ENTRY_ADDR(_start, _entry) (_start + 2 + (12 * _entry))
  484. // set the metadata model to Exif
  485. TagLib::MDMODEL md_model = TagLib::EXIF_MAIN;
  486. // set the pointer to the first IFD (0th IFD) and follow it were it leads.
  487. const BYTE *ifd0th = (BYTE*)tiffp + offset;
  488. const BYTE *ifdp = ifd0th;
  489. de = 0;
  490. do {
  491. // if there is anything on the stack then pop it off
  492. if(!destack.empty()) {
  493. ifdp = ifdstack.top(); ifdstack.pop();
  494. de = destack.top(); destack.pop();
  495. md_model = modelstack.top(); modelstack.pop();
  496. }
  497. // remember that we've visited this directory and entry so that we don't visit it again later
  498. DWORD visited = (DWORD)( (((size_t)ifdp & 0xFFFF) << 16) | (size_t)de );
  499. if(visitedIFD.find(visited) != visitedIFD.end()) {
  500. continue;
  501. } else {
  502. visitedIFD[visited] = 1; // processed
  503. }
  504. // determine how many entries there are in the current IFD
  505. nde = ReadUint16(msb_order, ifdp);
  506. for(; de < nde; de++) {
  507. char *pde = NULL; // pointer to the directory entry
  508. char *pval = NULL; // pointer to the tag value
  509. // create a tag
  510. FITAG *tag = FreeImage_CreateTag();
  511. if(!tag) return FALSE;
  512. // point to the directory entry
  513. pde = (char*) DIR_ENTRY_ADDR(ifdp, de);
  514. // get the tag ID
  515. FreeImage_SetTagID(tag, ReadUint16(msb_order, pde));
  516. // get the tag type
  517. WORD tag_type = (WORD)ReadUint16(msb_order, pde + 2);
  518. if((tag_type - 1) >= EXIF_NUM_FORMATS) {
  519. // a problem occured : delete the tag (not free'd after)
  520. FreeImage_DeleteTag(tag);
  521. // break out of the for loop
  522. break;
  523. }
  524. FreeImage_SetTagType(tag, (FREE_IMAGE_MDTYPE)tag_type);
  525. // get number of components
  526. FreeImage_SetTagCount(tag, ReadUint32(msb_order, pde + 4));
  527. // check that tag length (size of the tag value in bytes) will fit in a DWORD
  528. unsigned tag_data_width = FreeImage_TagDataWidth(FreeImage_GetTagType(tag));
  529. if (tag_data_width != 0 && FreeImage_GetTagCount(tag) > ~(DWORD)0 / tag_data_width) {
  530. FreeImage_DeleteTag(tag);
  531. // jump to next entry
  532. continue;
  533. }
  534. FreeImage_SetTagLength(tag, FreeImage_GetTagCount(tag) * tag_data_width);
  535. if(FreeImage_GetTagLength(tag) <= 4) {
  536. // 4 bytes or less and value is in the dir entry itself
  537. pval = pde + 8;
  538. } else {
  539. // if its bigger than 4 bytes, the directory entry contains an offset
  540. // first check if offset exceeds buffer, at this stage FreeImage_GetTagLength may return invalid data
  541. DWORD offset_value = ReadUint32(msb_order, pde + 8);
  542. if(offset_value > length) {
  543. // a problem occured : delete the tag (not free'd after)
  544. FreeImage_DeleteTag(tag);
  545. // jump to next entry
  546. continue;
  547. }
  548. // now check that length does not exceed the buffer size
  549. if(FreeImage_GetTagLength(tag) > length - offset_value){
  550. // a problem occured : delete the tag (not free'd after)
  551. FreeImage_DeleteTag(tag);
  552. // jump to next entry
  553. continue;
  554. }
  555. pval = (char*)(tiffp + offset_value);
  556. }
  557. // check for a IFD offset
  558. BOOL isIFDOffset = FALSE;
  559. switch(FreeImage_GetTagID(tag)) {
  560. case TAG_EXIF_OFFSET:
  561. case TAG_GPS_OFFSET:
  562. case TAG_INTEROP_OFFSET:
  563. case TAG_MAKER_NOTE:
  564. isIFDOffset = TRUE;
  565. break;
  566. }
  567. if(isIFDOffset) {
  568. DWORD sub_offset = 0;
  569. TagLib::MDMODEL next_mdmodel = md_model;
  570. const BYTE *next_ifd = ifdp;
  571. // get offset and metadata model
  572. if (FreeImage_GetTagID(tag) == TAG_MAKER_NOTE) {
  573. processMakerNote(dib, pval, msb_order, &sub_offset, &next_mdmodel);
  574. next_ifd = (BYTE*)pval + sub_offset;
  575. } else {
  576. processIFDOffset(tag, pval, msb_order, &sub_offset, &next_mdmodel);
  577. next_ifd = (BYTE*)tiffp + sub_offset;
  578. }
  579. if((sub_offset < (DWORD) length) && (next_mdmodel != TagLib::UNKNOWN)) {
  580. // push our current directory state onto the stack
  581. ifdstack.push(ifdp);
  582. // bump to the next entry
  583. de++;
  584. destack.push(de);
  585. // push our current metadata model
  586. modelstack.push(md_model);
  587. // push new state onto of stack to cause a jump
  588. ifdstack.push(next_ifd);
  589. destack.push(0);
  590. // select a new metadata model
  591. modelstack.push(next_mdmodel);
  592. // delete the tag as it won't be stored nor deleted in the for() loop
  593. FreeImage_DeleteTag(tag);
  594. break; // break out of the for loop
  595. }
  596. else {
  597. // unsupported camera model, canon maker tag or something unknown
  598. // process as a standard tag
  599. processExifTag(dib, tag, pval, msb_order, md_model);
  600. }
  601. } else {
  602. // process as a standard tag
  603. processExifTag(dib, tag, pval, msb_order, md_model);
  604. }
  605. // delete the tag
  606. FreeImage_DeleteTag(tag);
  607. } // for(nde)
  608. // additional thumbnail data is skipped
  609. } while (!destack.empty());
  610. //
  611. // --- handle thumbnail data ---
  612. //
  613. const WORD entriesCount0th = ReadUint16(msb_order, ifd0th);
  614. DWORD next_offset = ReadUint32(msb_order, DIR_ENTRY_ADDR(ifd0th, entriesCount0th));
  615. if((next_offset == 0) || (next_offset >= length)) {
  616. return TRUE; //< no thumbnail
  617. }
  618. const BYTE* const ifd1st = (BYTE*)tiffp + next_offset;
  619. const WORD entriesCount1st = ReadUint16(msb_order, ifd1st);
  620. unsigned thCompression = 0;
  621. unsigned thOffset = 0;
  622. unsigned thSize = 0;
  623. for(int e = 0; e < entriesCount1st; e++) {
  624. // point to the directory entry
  625. const BYTE* base = DIR_ENTRY_ADDR(ifd1st, e);
  626. // check for buffer overflow
  627. const size_t remaining = (size_t)base + 12 - (size_t)tiffp;
  628. if(remaining >= length) {
  629. // bad IFD1 directory, ignore it
  630. return FALSE;
  631. }
  632. // get the tag ID
  633. WORD tag = ReadUint16(msb_order, base);
  634. // get the tag type
  635. WORD type = ReadUint16(msb_order, base + sizeof(WORD));
  636. // get number of components
  637. DWORD count = ReadUint32(msb_order, base + sizeof(WORD) + sizeof(WORD));
  638. // get the tag value
  639. DWORD offset = ReadUint32(msb_order, base + sizeof(WORD) + sizeof(WORD) + sizeof(DWORD));
  640. switch(tag) {
  641. case TAG_COMPRESSION:
  642. // Tiff Compression Tag (should be COMPRESSION_OJPEG (6), but is not always respected)
  643. thCompression = offset;
  644. break;
  645. case TAG_JPEG_INTERCHANGE_FORMAT:
  646. // Tiff JPEGInterchangeFormat Tag
  647. thOffset = offset;
  648. break;
  649. case TAG_JPEG_INTERCHANGE_FORMAT_LENGTH:
  650. // Tiff JPEGInterchangeFormatLength Tag
  651. thSize = offset;
  652. break;
  653. // ### X and Y Resolution ignored, orientation ignored
  654. case TAG_X_RESOLUTION: // XResolution
  655. case TAG_Y_RESOLUTION: // YResolution
  656. case TAG_RESOLUTION_UNIT: // ResolutionUnit
  657. case TAG_ORIENTATION: // Orientation
  658. break;
  659. default:
  660. break;
  661. }
  662. }
  663. if(/*thCompression != 6 ||*/ thOffset == 0 || thSize == 0) {
  664. return TRUE;
  665. }
  666. if(thOffset + thSize > length) {
  667. return TRUE;
  668. }
  669. // load the thumbnail
  670. const BYTE *thLocation = tiffp + thOffset;
  671. FIMEMORY* hmem = FreeImage_OpenMemory(const_cast<BYTE*>(thLocation), thSize);
  672. FIBITMAP* thumbnail = FreeImage_LoadFromMemory(FIF_JPEG, hmem);
  673. FreeImage_CloseMemory(hmem);
  674. // store the thumbnail
  675. FreeImage_SetThumbnail(dib, thumbnail);
  676. // then delete it
  677. FreeImage_Unload(thumbnail);
  678. return TRUE;
  679. }
  680. /**
  681. Read and decode JPEG_APP1 marker (Exif profile)
  682. @param dib Input FIBITMAP
  683. @param dataptr Pointer to the APP1 marker
  684. @param datalen APP1 marker length
  685. @return Returns TRUE if successful, FALSE otherwise
  686. */
  687. BOOL
  688. jpeg_read_exif_profile(FIBITMAP *dib, const BYTE *dataptr, unsigned int datalen) {
  689. // marker identifying string for Exif = "Exif\0\0"
  690. BYTE exif_signature[6] = { 0x45, 0x78, 0x69, 0x66, 0x00, 0x00 };
  691. BYTE lsb_first[4] = { 0x49, 0x49, 0x2A, 0x00 }; // Intel order
  692. BYTE msb_first[4] = { 0x4D, 0x4D, 0x00, 0x2A }; // Motorola order
  693. unsigned int length = datalen;
  694. BYTE *profile = (BYTE*)dataptr;
  695. // verify the identifying string
  696. if(memcmp(exif_signature, profile, sizeof(exif_signature)) == 0) {
  697. // Exif profile - TIFF header with 2 IFDs. 0th - the image attributes, 1st - may be used for thumbnail
  698. profile += sizeof(exif_signature);
  699. length -= sizeof(exif_signature);
  700. // read the TIFF header (8 bytes)
  701. // check the endianess order
  702. BOOL bMotorolaOrder = TRUE;
  703. if(memcmp(profile, lsb_first, sizeof(lsb_first)) == 0) {
  704. // Exif section in Intel order
  705. bMotorolaOrder = FALSE;
  706. } else {
  707. if(memcmp(profile, msb_first, sizeof(msb_first)) == 0) {
  708. // Exif section in Motorola order
  709. bMotorolaOrder = TRUE;
  710. } else {
  711. // Invalid Exif alignment marker
  712. return FALSE;
  713. }
  714. }
  715. // this is the offset to the first IFD (Image File Directory)
  716. unsigned long first_offset = ReadUint32(bMotorolaOrder, profile + 4);
  717. if (first_offset > length) {
  718. // bad Exif data
  719. return FALSE;
  720. }
  721. /*
  722. Note: as FreeImage 3.14.0, this test is no longer needed for images with similar suspicious offset
  723. => tested with Pentax Optio 230, FujiFilm SP-2500 and Canon EOS 300D
  724. if (first_offset < 8 || first_offset > 16) {
  725. // This is usually set to 8
  726. // but PENTAX Optio 230 has it set differently, and uses it as offset.
  727. FreeImage_OutputMessageProc(FIF_JPEG, "Exif: Suspicious offset of first IFD value");
  728. return FALSE;
  729. }
  730. */
  731. // process Exif directories
  732. return jpeg_read_exif_dir(dib, profile, first_offset, length, bMotorolaOrder);
  733. }
  734. return FALSE;
  735. }