2004-10-04 Lutz Mueller <lutz@users.sourceforge.net>
[platform/upstream/libexif.git] / libexif / exif-data.c
1 /* exif-data.c
2  *
3  * Copyright © 2001 Lutz Müller <lutz@users.sourceforge.net>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20
21 #include <config.h>
22 #include "exif-mnote-data.h"
23
24 #include "exif-data.h"
25 #include "exif-ifd.h"
26 #include "exif-mnote-data-priv.h"
27 #include "exif-utils.h"
28 #include "exif-loader.h"
29 #include "jpeg-marker.h"
30 #include <libexif/exif-log.h>
31
32 #include <libexif/olympus/exif-mnote-data-olympus.h>
33 #include <libexif/canon/exif-mnote-data-canon.h>
34 #include <libexif/pentax/exif-mnote-data-pentax.h>
35
36 #include <stdlib.h>
37 #include <stdio.h>
38 #include <string.h>
39
40 #undef MAX
41 #define MAX(a, b)  (((a) > (b)) ? (a) : (b))
42
43 /* #define DEBUG */
44
45 static const unsigned char ExifHeader[] = {0x45, 0x78, 0x69, 0x66, 0x00, 0x00};
46
47 struct _ExifDataPrivate
48 {
49         ExifByteOrder order;
50
51         ExifMnoteData *md;
52
53         ExifLog *log;
54         ExifMem *mem;
55
56         unsigned int ref_count;
57
58         /* Temporarily used while loading data */
59         unsigned int offset_mnote;
60 };
61
62 static void *
63 exif_data_alloc (ExifData *data, unsigned int i)
64 {
65         void *d;
66
67         if (!data || !i) return NULL;
68
69         d = exif_mem_alloc (data->priv->mem, i);
70         if (d) return d;
71
72         EXIF_LOG_NO_MEMORY (data->priv->log, "ExifData", i);
73         return NULL;
74 }
75
76 ExifMnoteData *
77 exif_data_get_mnote_data (ExifData *d)
78 {
79         return (d && d->priv) ? d->priv->md : NULL;
80 }
81
82 ExifData *
83 exif_data_new (void)
84 {
85         ExifMem *mem = exif_mem_new_default ();
86         ExifData *d = exif_data_new_mem (mem);
87
88         exif_mem_unref (mem);
89
90         return d;
91 }
92
93 ExifData *
94 exif_data_new_mem (ExifMem *mem)
95 {
96         ExifData *data;
97         unsigned int i;
98
99         if (!mem) return NULL;
100
101         data = exif_mem_alloc (mem, sizeof (ExifData));
102         if (!data) return (NULL);
103         data->priv = exif_mem_alloc (mem, sizeof (ExifDataPrivate));
104         if (!data->priv) { exif_mem_free (mem, data); return (NULL); }
105         data->priv->ref_count = 1;
106
107         data->priv->mem = mem;
108         exif_mem_ref (mem);
109
110         for (i = 0; i < EXIF_IFD_COUNT; i++) {
111                 data->ifd[i] = exif_content_new_mem (data->priv->mem);
112                 if (!data->ifd[i]) {
113                         exif_data_free (data);
114                         return (NULL);
115                 }
116                 data->ifd[i]->parent = data;
117         }
118
119         return (data);
120 }
121
122 ExifData *
123 exif_data_new_from_data (const unsigned char *data, unsigned int size)
124 {
125         ExifData *edata;
126
127         edata = exif_data_new ();
128         exif_data_load_data (edata, data, size);
129         return (edata);
130 }
131
132 static void
133 exif_data_load_data_entry (ExifData *data, ExifEntry *entry,
134                            const unsigned char *d,
135                            unsigned int size, unsigned int offset)
136 {
137         unsigned int s, doff;
138
139         entry->tag        = exif_get_short (d + offset + 0, data->priv->order);
140         entry->format     = exif_get_short (d + offset + 2, data->priv->order);
141         entry->components = exif_get_long  (d + offset + 4, data->priv->order);
142
143         exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
144                   "Loading entry 0x%x ('%s')...", entry->tag,
145                   exif_tag_get_name (entry->tag));
146
147         /*
148          * Size? If bigger than 4 bytes, the actual data is not
149          * in the entry but somewhere else (offset).
150          */
151         s = exif_format_get_size (entry->format) * entry->components;
152         if (!s)
153                 return;
154         if (s > 4)
155                 doff = exif_get_long (d + offset + 8, data->priv->order);
156         else
157                 doff = offset + 8;
158
159         /* Sanity check */
160         if (size < doff + s)
161                 return;
162
163         entry->data = exif_data_alloc (data, s);
164         if (entry->data) {
165                 entry->size = s;
166                 memcpy (entry->data, d + doff, s);
167         }
168
169         /* If this is the MakerNote, remember the offset */
170         if (entry->tag == EXIF_TAG_MAKER_NOTE) {
171                 if (entry->size > 6) exif_log (data->priv->log,
172                           EXIF_LOG_CODE_DEBUG, "ExifData",
173                           "MakerNote found (%02x %02x %02x %02x "
174                           "%02x %02x %02x...).",
175                           entry->data[0], entry->data[1], entry->data[2],
176                           entry->data[3], entry->data[4], entry->data[5],
177                           entry->data[6]);
178                 data->priv->offset_mnote = doff;
179         }
180
181         exif_entry_fix (entry);
182 }
183
184 static void
185 exif_data_save_data_entry (ExifData *data, ExifEntry *e,
186                            unsigned char **d, unsigned int *ds,
187                            unsigned int offset)
188 {
189         unsigned int doff, s;
190
191         if (!data || !data->priv) return;
192
193         /*
194          * Each entry is 12 bytes long. The memory for the entry has
195          * already been allocated.
196          */
197         exif_set_short (*d + 6 + offset + 0,
198                         data->priv->order, (ExifShort) e->tag);
199         exif_set_short (*d + 6 + offset + 2,
200                         data->priv->order, (ExifShort) e->format);
201
202         /* If this is the maker note tag, update it. */
203         if ((e->tag == EXIF_TAG_MAKER_NOTE) && data->priv->md) {
204                 exif_mem_free (data->priv->mem, e->data);
205                 e->data = NULL;
206                 e->size = 0;
207                 exif_mnote_data_set_offset (data->priv->md, *ds - 6);
208                 exif_mnote_data_save (data->priv->md, &e->data, &e->size);
209                 e->components = e->size;
210         }
211
212         exif_set_long  (*d + 6 + offset + 4,
213                         data->priv->order, e->components);
214
215         /*
216          * Size? If bigger than 4 bytes, the actual data is not in
217          * the entry but somewhere else.
218          */
219         s = exif_format_get_size (e->format) * e->components;
220         if (s > 4) {
221                 doff = *ds - 6;
222                 *ds += s;
223                 *d = exif_mem_realloc (data->priv->mem, *d, *ds);
224                 if (!*d) {
225                         EXIF_LOG_NO_MEMORY (data->priv->log, "ExifData", *ds);
226                         return;
227                 }
228                 exif_set_long (*d + 6 + offset + 8,
229                                data->priv->order, doff);
230         } else
231                 doff = offset + 8;
232
233         /* Write the data. Fill unneeded bytes with 0. */
234         memcpy (*d + 6 + doff, e->data, s);
235         if (s < 4) memset (*d + 6 + doff + s, 0, (4 - s));
236 }
237
238 static void
239 exif_data_load_data_thumbnail (ExifData *data, const unsigned char *d,
240                                unsigned int ds, ExifLong offset, ExifLong size)
241 {
242         if (ds < offset + size) {
243                 exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
244                           "Bogus thumbnail offset and size: %i < %i + %i.",
245                           (int) ds, (int) offset, (int) size);
246                 return;
247         }
248         if (data->data) exif_mem_free (data->priv->mem, data->data);
249         data->size = size;
250         data->data = exif_data_alloc (data, data->size);
251         if (!data->data) return;
252         memcpy (data->data, d + offset, data->size);
253 }
254
255 static void
256 exif_data_load_data_content (ExifData *data, ExifContent *ifd,
257                              const unsigned char *d,
258                              unsigned int ds, unsigned int offset)
259 {
260         ExifLong o, thumbnail_offset = 0, thumbnail_length = 0;
261         ExifShort n;
262         ExifEntry *entry;
263         unsigned int i;
264         ExifTag tag;
265
266         if (!data || !data->priv) return;
267
268         /* Read the number of entries */
269         if (offset >= ds - 1) return;
270         n = exif_get_short (d + offset, data->priv->order);
271         exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
272                   "Loading %i entries...", n);
273         offset += 2;
274
275         /* Check if we have enough data. */
276         if (offset + 12 * n > ds) n = (ds - offset) / 12;
277
278         for (i = 0; i < n; i++) {
279
280                 tag = exif_get_short (d + offset + 12 * i, data->priv->order);
281                 switch (tag) {
282                 case EXIF_TAG_EXIF_IFD_POINTER:
283                 case EXIF_TAG_GPS_INFO_IFD_POINTER:
284                 case EXIF_TAG_INTEROPERABILITY_IFD_POINTER:
285                 case EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH:
286                 case EXIF_TAG_JPEG_INTERCHANGE_FORMAT:
287                         o = exif_get_long (d + offset + 12 * i + 8,
288                                            data->priv->order);
289                         switch (tag) {
290                         case EXIF_TAG_EXIF_IFD_POINTER:
291                                 exif_data_load_data_content (data,
292                                         data->ifd[EXIF_IFD_EXIF], d, ds, o);
293                                 break;
294                         case EXIF_TAG_GPS_INFO_IFD_POINTER:
295                                 exif_data_load_data_content (data,
296                                         data->ifd[EXIF_IFD_GPS], d, ds, o);
297                                 break;
298                         case EXIF_TAG_INTEROPERABILITY_IFD_POINTER:
299                                 exif_data_load_data_content (data,
300                                         data->ifd[EXIF_IFD_INTEROPERABILITY], d, ds, o);
301                                 break;
302                         case EXIF_TAG_JPEG_INTERCHANGE_FORMAT:
303 #ifdef DEBUG
304                                 printf ("Thumbnail at %i.\n", (int) o);
305 #endif
306                                 thumbnail_offset = o;
307                                 if (thumbnail_offset && thumbnail_length)
308                                         exif_data_load_data_thumbnail (data, d,
309                                                 ds, thumbnail_offset,
310                                                 thumbnail_length);
311                                 break;
312                         case EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH:
313 #ifdef DEBUG
314                                 printf ("Thumbnail size: %i.\n", (int) o);
315 #endif
316                                 thumbnail_length = o;
317                                 if (thumbnail_offset && thumbnail_length)
318                                         exif_data_load_data_thumbnail (data, d,
319                                                 ds, thumbnail_offset,
320                                                 thumbnail_length);
321                                 break;
322                         default:
323                                 return;
324                         }
325                         break;
326                 default:
327
328                         /*
329                          * If we don't know the tag, changes are high
330                          * that the EXIF data does not follow the standard.
331                          */
332                         if (!exif_tag_get_name (tag)) return;
333                         entry = exif_entry_new_mem (data->priv->mem);
334                         exif_content_add_entry (ifd, entry);
335                         exif_data_load_data_entry (data, entry, d, ds,
336                                                    offset + 12 * i);
337                         exif_entry_unref (entry);
338                         break;
339                 }
340         }
341 }
342
343 static void
344 exif_data_save_data_content (ExifData *data, ExifContent *ifd,
345                              unsigned char **d, unsigned int *ds,
346                              unsigned int offset)
347 {
348         unsigned int j, n_ptr = 0, n_thumb = 0;
349         ExifIfd i;
350
351         if (!data || !data->priv || !ifd || !d || !ds) return;
352
353         for (i = 0; i < EXIF_IFD_COUNT; i++)
354                 if (ifd == data->ifd[i])
355                         break;
356         if (i == EXIF_IFD_COUNT)
357                 return;
358
359         /*
360          * Check if we need some extra entries for pointers or the thumbnail.
361          */
362         switch (i) {
363         case EXIF_IFD_0:
364
365                 /*
366                  * The pointer to IFD_EXIF is in IFD_0. The pointer to
367                  * IFD_INTEROPERABILITY is in IFD_EXIF.
368                  */
369                 if (data->ifd[EXIF_IFD_EXIF]->count ||
370                     data->ifd[EXIF_IFD_INTEROPERABILITY]->count)
371                         n_ptr++;
372
373                 /* The pointer to IFD_GPS is in IFD_0. */
374                 if (data->ifd[EXIF_IFD_GPS]->count)
375                         n_ptr++;
376
377                 break;
378         case EXIF_IFD_1:
379                 if (data->size)
380                         n_thumb = 2;
381                 break;
382         case EXIF_IFD_EXIF:
383                 if (data->ifd[EXIF_IFD_INTEROPERABILITY]->count)
384                         n_ptr++;
385         default:
386                 break;
387         }
388
389         /*
390          * Allocate enough memory for all entries
391          * and the number of entries.
392          */
393         *ds += (2 + (ifd->count + n_ptr + n_thumb) * 12 + 4);
394         *d = exif_mem_realloc (data->priv->mem, *d, *ds);
395         if (!*d) {
396                 EXIF_LOG_NO_MEMORY (data->priv->log, "ExifData", *ds);
397                 return;
398         }
399
400         /* Save the number of entries */
401         exif_set_short (*d + 6 + offset, data->priv->order,
402                         (ExifShort) (ifd->count + n_ptr + n_thumb));
403         offset += 2;
404
405 #ifdef DEBUG
406         printf ("Saving %i entries (IFD '%s', offset: %i)...\n",
407                 ifd->count, exif_ifd_get_name (i), offset);
408 #endif
409
410         /* Save each entry */
411         for (j = 0; j < ifd->count; j++)
412                 exif_data_save_data_entry (data, ifd->entries[j],
413                                 d, ds, offset + 12 * j);
414         offset += 12 * ifd->count;
415
416         /* Now save special entries. */
417         switch (i) {
418         case EXIF_IFD_0:
419
420                 /*
421                  * The pointer to IFD_EXIF is in IFD_0.
422                  * However, the pointer to IFD_INTEROPERABILITY is in IFD_EXIF,
423                  * therefore, if IFD_INTEROPERABILITY is not empty, we need
424                  * IFD_EXIF even if latter is empty.
425                  */
426                 if (data->ifd[EXIF_IFD_EXIF]->count ||
427                     data->ifd[EXIF_IFD_INTEROPERABILITY]->count) {
428                         exif_set_short (*d + 6 + offset + 0, data->priv->order,
429                                         EXIF_TAG_EXIF_IFD_POINTER);
430                         exif_set_short (*d + 6 + offset + 2, data->priv->order,
431                                         EXIF_FORMAT_LONG);
432                         exif_set_long  (*d + 6 + offset + 4, data->priv->order,
433                                         1);
434                         exif_set_long  (*d + 6 + offset + 8, data->priv->order,
435                                         *ds - 6);
436                         exif_data_save_data_content (data,
437                                 data->ifd[EXIF_IFD_EXIF], d, ds, *ds - 6);
438                         offset += 12;
439                 }
440
441                 /* The pointer to IFD_GPS is in IFD_0, too. */
442                 if (data->ifd[EXIF_IFD_GPS]->count) {
443                         exif_set_short (*d + 6 + offset + 0, data->priv->order,
444                                         EXIF_TAG_GPS_INFO_IFD_POINTER);
445                         exif_set_short (*d + 6 + offset + 2, data->priv->order,
446                                         EXIF_FORMAT_LONG);
447                         exif_set_long  (*d + 6 + offset + 4, data->priv->order,
448                                         1);
449                         exif_set_long  (*d + 6 + offset + 8, data->priv->order,
450                                         *ds - 6);
451                         exif_data_save_data_content (data,
452                                 data->ifd[EXIF_IFD_GPS], d, ds, *ds - 6);
453                         offset += 12;
454                 }
455
456                 break;
457         case EXIF_IFD_EXIF:
458
459                 /*
460                  * The pointer to IFD_INTEROPERABILITY is in IFD_EXIF.
461                  * See note above.
462                  */
463                 if (data->ifd[EXIF_IFD_INTEROPERABILITY]->count) {
464                         exif_set_short (*d + 6 + offset + 0, data->priv->order,
465                                         EXIF_TAG_INTEROPERABILITY_IFD_POINTER);
466                         exif_set_short (*d + 6 + offset + 2, data->priv->order,
467                                         EXIF_FORMAT_LONG);
468                         exif_set_long  (*d + 6 + offset + 4, data->priv->order,
469                                         1);
470                         exif_set_long  (*d + 6 + offset + 8, data->priv->order,
471                                         *ds - 6);
472                         exif_data_save_data_content (data,
473                                 data->ifd[EXIF_IFD_INTEROPERABILITY], d, ds,
474                                 *ds - 6);
475                         offset += 12;
476                 }
477
478                 break;
479         case EXIF_IFD_1:
480
481                 /*
482                  * Information about the thumbnail (if any) is saved in
483                  * IFD_1.
484                  */
485                 if (data->size) {
486
487                         /* EXIF_TAG_JPEG_INTERCHANGE_FORMAT */
488                         exif_set_short (*d + 6 + offset + 0, data->priv->order,
489                                         EXIF_TAG_JPEG_INTERCHANGE_FORMAT);
490                         exif_set_short (*d + 6 + offset + 2, data->priv->order,
491                                         EXIF_FORMAT_LONG);
492                         exif_set_long  (*d + 6 + offset + 4, data->priv->order,
493                                         1);
494                         exif_set_long  (*d + 6 + offset + 8, data->priv->order,
495                                         *ds - 6);
496                         *ds += data->size;
497                         *d = exif_mem_realloc (data->priv->mem, *d, *ds);
498                         if (!*d) {
499                                 EXIF_LOG_NO_MEMORY (data->priv->log, "ExifData",
500                                                     *ds);
501                                 return;
502                         }
503                         memcpy (*d + *ds - data->size, data->data, data->size);
504                         offset += 12;
505 #ifdef DEBUG
506                         printf ("Wrote %i bytes of thumbnail data at offset "
507                                 "%i.\n", data->size, *ds - data->size);
508                         printf ("We currently have %i bytes EXIF data.\n", *ds);
509 #endif
510
511                         /* EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH */
512                         exif_set_short (*d + 6 + offset + 0, data->priv->order,
513                                 EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH);
514                         exif_set_short (*d + 6 + offset + 2, data->priv->order,
515                                         EXIF_FORMAT_LONG);
516                         exif_set_long  (*d + 6 + offset + 4, data->priv->order,
517                                         1);
518                         exif_set_long  (*d + 6 + offset + 8, data->priv->order,
519                                         data->size);
520                         offset += 12;
521                 }
522
523                 break;
524         default:
525                 break;
526         }
527
528         /* Correctly terminate the directory */
529         if (i == EXIF_IFD_0 && (data->ifd[EXIF_IFD_1]->count ||
530                                              data->size)) {
531
532                 /*
533                  * We are saving IFD 0. Tell where IFD 1 starts and save
534                  * IFD 1.
535                  */
536                 exif_set_long (*d + 6 + offset, data->priv->order, *ds - 6);
537                 exif_data_save_data_content (data, data->ifd[EXIF_IFD_1], d, ds,
538                                              *ds - 6);
539         } else
540                 exif_set_long (*d + 6 + offset, data->priv->order, 0);
541 }
542
543 void
544 exif_data_load_data (ExifData *data, const unsigned char *d_orig,
545                      unsigned int ds_orig)
546 {
547         unsigned int l;
548         ExifLong offset;
549         ExifShort n;
550         ExifEntry *e, *em;
551         const unsigned char *d = d_orig;
552         unsigned int ds = ds_orig, len;
553
554         if (!data || !data->priv || !d || !ds) return;
555
556         exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
557                   "Parsing %i byte(s) EXIF data...\n", ds);
558
559         /*
560          * It can be that the data starts with the EXIF header. If it does
561          * not, search the EXIF marker.
562          */
563         if (ds < 6) {
564 #ifdef DEBUG
565                 printf ("Size too small.\n");
566 #endif
567                 return;
568         }
569         if (!memcmp (d, ExifHeader, 6)) {
570 #ifdef DEBUG
571                 printf ("Found EXIF header.\n");
572 #endif
573         } else {
574 #ifdef DEBUG
575                 printf ("Data begins with 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x "
576                         "0x%x...\n", d[0], d[1], d[2], d[3], d[4], d[5], d[6]);
577 #endif
578                 while (1) {
579                         while ((d[0] == 0xff) && ds) {
580                                 d++;
581                                 ds--;
582                         }
583
584                         /* JPEG_MARKER_SOI */
585                         if (d[0] == JPEG_MARKER_SOI) {
586                                 d++;
587                                 ds--;
588                                 continue;
589                         }
590
591                         /* JPEG_MARKER_APP0 */
592                         if (d[0] == JPEG_MARKER_APP0) {
593                                 d++;
594                                 ds--;
595                                 l = (d[0] << 8) | d[1];
596                                 if (l > ds)
597                                         return;
598                                 d += l;
599                                 ds -= l;
600                                 continue;
601                         }
602
603                         /* JPEG_MARKER_APP1 */
604                         if (d[0] == JPEG_MARKER_APP1)
605                                 break;
606
607                         /* Unknown marker or data. Give up. */
608 #ifdef DEBUG
609                         printf ("EXIF marker not found.\n");
610 #endif
611                         return;
612                 }
613                 d++;
614                 ds--;
615                 if (ds < 2) {
616 #ifdef DEBUG
617                         printf ("Size too small.\n");
618 #endif
619                         return;
620                 }
621                 len = (d[0] << 8) | d[1];
622 #ifdef DEBUG
623                 printf ("We have to deal with %i byte(s) of EXIF data.\n", len);
624 #endif
625                 d += 2;
626                 ds -= 2;
627         }
628
629         /*
630          * Verify the exif header
631          * (offset 2, length 6).
632          */
633         if (ds < 6) {
634 #ifdef DEBUG
635                 printf ("Size too small.\n");
636 #endif
637                 return;
638         }
639         if (memcmp (d, ExifHeader, 6)) {
640 #ifdef DEBUG
641                 printf ("EXIF header not found.\n");
642 #endif
643                 return;
644         }
645
646 #ifdef DEBUG
647         printf ("Found EXIF header.\n");
648 #endif
649
650         /* Byte order (offset 6, length 2) */
651         if (ds < 12)
652                 return;
653         if (!memcmp (d + 6, "II", 2))
654                 data->priv->order = EXIF_BYTE_ORDER_INTEL;
655         else if (!memcmp (d + 6, "MM", 2))
656                 data->priv->order = EXIF_BYTE_ORDER_MOTOROLA;
657         else
658                 return;
659
660         /* Fixed value */
661         if (exif_get_short (d + 8, data->priv->order) != 0x002a)
662                 return;
663
664         /* IFD 0 offset */
665         offset = exif_get_long (d + 10, data->priv->order);
666 #ifdef DEBUG
667         printf ("IFD 0 at %i.\n", (int) offset);
668 #endif
669
670         /* Parse the actual exif data (offset 14) */
671         exif_data_load_data_content (data, data->ifd[EXIF_IFD_0], d + 6,
672                                      ds - 6, offset);
673
674         /* IFD 1 offset */
675         n = exif_get_short (d + 6 + offset, data->priv->order);
676         offset = exif_get_long (d + 6 + offset + 2 + 12 * n, data->priv->order);
677         if (offset) {
678 #ifdef DEBUG
679                 printf ("IFD 1 at %i.\n", (int) offset);
680 #endif
681
682                 /* Sanity check. */
683                 if (offset > ds - 6) {
684 #ifdef DEBUG
685                         printf ("Bogus offset!\n");
686 #endif
687                         return;
688                 }
689
690                 exif_data_load_data_content (data, data->ifd[EXIF_IFD_1], d + 6,
691                                              ds - 6, offset);
692         }
693
694         /*
695          * If we got an EXIF_TAG_MAKER_NOTE, try to interpret it. Some
696          * cameras use pointers in the maker note tag that point to the
697          * space between IFDs. Here is the only place where we have access
698          * to that data.
699          */
700         e = exif_data_get_entry (data, EXIF_TAG_MAKER_NOTE);
701         if (e) {
702
703             /* Olympus & Nikon */
704             if ((e->size >= 5) && (!memcmp (e->data, "OLYMP", 5) ||
705                                    !memcmp (e->data, "Nikon", 5))) {
706                         data->priv->md = exif_mnote_data_olympus_new (data->priv->mem);
707             } else {
708                         char value[7];
709                         em = exif_data_get_entry (data, EXIF_TAG_MAKE);
710                         /* Pentax & some variant of Nikon */
711                         if ((e->size >= 2) && (e->data[0] == 0x00)
712                                     && (e->data[1] == 0x1b)) {
713                                 if (em && !strncasecmp (exif_entry_get_value (em, value, sizeof(value)), "Nikon", 5)) {
714                                         data->priv->md = exif_mnote_data_olympus_new (data->priv->mem);
715                                 } else {
716                                         data->priv->md = exif_mnote_data_pentax_new (data->priv->mem);
717                                 }
718
719                         } else {
720                                 /* Canon */
721                                 if (em) {
722                 
723                                         if (!strcmp (exif_entry_get_value (em, value, sizeof(value)), "Canon"))
724                                                 data->priv->md = exif_mnote_data_canon_new (data->priv->mem);
725                                 }
726                         }
727                 }
728
729             /* 
730              * If we are able to interpret the maker note, do so.
731              */
732             if (data->priv->md) {
733                     exif_mnote_data_log (data->priv->md, data->priv->log);
734                     exif_mnote_data_set_byte_order (data->priv->md,
735                                                     data->priv->order);
736                     exif_mnote_data_set_offset (data->priv->md,
737                                                 data->priv->offset_mnote);
738                     exif_mnote_data_load (data->priv->md, d, ds);
739             }
740         }
741 }
742
743 void
744 exif_data_save_data (ExifData *data, unsigned char **d, unsigned int *ds)
745 {
746         if (!data || !d || !ds)
747                 return;
748
749         /* Header */
750         *ds = 14;
751         *d = exif_data_alloc (data, *ds);
752         if (!*d) return;
753         memcpy (*d, ExifHeader, 6);
754
755         /* Order (offset 6) */
756         if (data->priv->order == EXIF_BYTE_ORDER_INTEL) {
757                 memcpy (*d + 6, "II", 2);
758         } else {
759                 memcpy (*d + 6, "MM", 2);
760         }
761
762         /* Fixed value (2 bytes, offset 8) */
763         exif_set_short (*d + 8, data->priv->order, 0x002a);
764
765         /*
766          * IFD 0 offset (4 bytes, offset 10).
767          * We will start 8 bytes after the
768          * EXIF header (2 bytes for order, another 2 for the test, and
769          * 4 bytes for the IFD 0 offset make 8 bytes together).
770          */
771         exif_set_long (*d + 10, data->priv->order, 8);
772
773         /* Now save IFD 0. IFD 1 will be saved automatically. */
774 #ifdef DEBUG
775         printf ("Saving IFDs...\n");
776 #endif
777         exif_data_save_data_content (data, data->ifd[EXIF_IFD_0], d, ds,
778                                      *ds - 6);
779
780 #ifdef DEBUG
781         printf ("Saved %i byte(s) EXIF data.\n", *ds);
782 #endif
783 }
784
785 ExifData *
786 exif_data_new_from_file (const char *path)
787 {
788         ExifData *edata;
789         ExifLoader *loader;
790
791         loader = exif_loader_new ();
792         exif_loader_write_file (loader, path);
793         edata = exif_loader_get_data (loader);
794         exif_loader_unref (loader);
795
796         return (edata);
797 }
798
799 void
800 exif_data_ref (ExifData *data)
801 {
802         if (!data)
803                 return;
804
805         data->priv->ref_count++;
806 }
807
808 void
809 exif_data_unref (ExifData *data)
810 {
811         if (!data)
812                 return;
813
814         data->priv->ref_count--;
815         if (!data->priv->ref_count)
816                 exif_data_free (data);
817 }
818
819 void
820 exif_data_free (ExifData *data)
821 {
822         unsigned int i;
823
824         if (!data) return;
825
826         for (i = 0; i < EXIF_IFD_COUNT; i++) {
827                 if (data->ifd[i]) {
828                         exif_content_unref (data->ifd[i]);
829                         data->ifd[i] = NULL;
830                 }
831         }
832
833         if (data->priv) {
834                 ExifMem *mem = data->priv->mem;
835                 if (data->data) {
836                         exif_mem_free (data->priv->mem, data->data);
837                         data->data = NULL;
838                 }
839                 if (data->priv->md) {
840                         exif_mnote_data_unref (data->priv->md);
841                         data->priv->md = NULL;
842                 }
843                 exif_mem_free (mem, data->priv);
844                 exif_mem_free (mem, data);
845                 exif_mem_unref (mem);
846         }
847 }
848
849 void
850 exif_data_dump (ExifData *data)
851 {
852         unsigned int i;
853
854         if (!data)
855                 return;
856
857         for (i = 0; i < EXIF_IFD_COUNT; i++) {
858                 if (data->ifd[i] && data->ifd[i]->count) {
859                         printf ("Dumping IFD '%s'...\n",
860                                 exif_ifd_get_name (i));
861                         exif_content_dump (data->ifd[i], 0);
862                 }
863         }
864
865         if (data->data) {
866                 printf ("%i byte(s) thumbnail data available.", data->size);
867                 if (data->size >= 4) {
868                         printf ("0x%02x 0x%02x ... 0x%02x 0x%02x\n",
869                                 data->data[0], data->data[1],
870                                 data->data[data->size - 2],
871                                 data->data[data->size - 1]);
872                 }
873         }
874 }
875
876 ExifByteOrder
877 exif_data_get_byte_order (ExifData *data)
878 {
879         if (!data)
880                 return (0);
881
882         return (data->priv->order);
883 }
884
885 void
886 exif_data_foreach_content (ExifData *data, ExifDataForeachContentFunc func,
887                            void *user_data)
888 {
889         unsigned int i;
890
891         if (!data || !func)
892                 return;
893
894         for (i = 0; i < EXIF_IFD_COUNT; i++)
895                 func (data->ifd[i], user_data);
896 }
897
898 typedef struct _ByteOrderChangeData ByteOrderChangeData;
899 struct _ByteOrderChangeData {
900         ExifByteOrder old, new;
901 };
902
903 static void
904 entry_set_byte_order (ExifEntry *e, void *data)
905 {
906         ByteOrderChangeData *d = data;
907         unsigned int i;
908         ExifShort s;
909         ExifLong l;
910         ExifSLong sl;
911         ExifRational r;
912         ExifSRational sr;
913
914         if (!e)
915                 return;
916
917         switch (e->format) {
918         case EXIF_FORMAT_SHORT:
919                 for (i = 0; i < e->components; i++) {
920                         s = exif_get_short (e->data +
921                                 (i * exif_format_get_size (e->format)),
922                                 d->old);
923                         exif_set_short (e->data +
924                                 (i * exif_format_get_size (e->format)),
925                                 d->new, s);
926                 }
927                 break;
928         case EXIF_FORMAT_LONG:
929                 for (i = 0; i < e->components; i++) {
930                         l = exif_get_long (e->data +
931                                 (i * exif_format_get_size (e->format)),
932                                 d->old);
933                         exif_set_long (e->data +
934                                 (i * exif_format_get_size (e->format)),
935                                 d->new, l);
936                 }
937                 break;
938         case EXIF_FORMAT_RATIONAL:
939                 for (i = 0; i < e->components; i++) {
940                         r = exif_get_rational (e->data +
941                                 (i * exif_format_get_size (e->format)),
942                                 d->old);
943                         exif_set_rational (e->data +
944                                 (i * exif_format_get_size (e->format)),
945                                 d->new, r);
946                 }
947                 break;
948         case EXIF_FORMAT_SLONG:
949                 for (i = 0; i < e->components; i++) {
950                         sl = exif_get_slong (e->data +
951                                 (i * exif_format_get_size (e->format)),
952                                 d->old);
953                         exif_set_slong (e->data +
954                                 (i * exif_format_get_size (e->format)),
955                                 d->new, sl);
956                 }
957                 break;
958         case EXIF_FORMAT_SRATIONAL:
959                 for (i = 0; i < e->components; i++) {
960                         sr = exif_get_srational (e->data +
961                                 (i * exif_format_get_size (e->format)),
962                                 d->old);
963                         exif_set_srational (e->data +
964                                 (i * exif_format_get_size (e->format)),
965                                 d->new, sr);
966                 }
967                 break;
968         case EXIF_FORMAT_UNDEFINED:
969         case EXIF_FORMAT_BYTE:
970         case EXIF_FORMAT_SBYTE:
971         case EXIF_FORMAT_ASCII:
972         default:
973                 /* Nothing here. */
974                 break;
975         }
976 }
977
978 static void
979 content_set_byte_order (ExifContent *content, void *data)
980 {
981         exif_content_foreach_entry (content, entry_set_byte_order, data);
982 }
983
984 void
985 exif_data_set_byte_order (ExifData *data, ExifByteOrder order)
986 {
987         ByteOrderChangeData d;
988
989         if (!data || (order == data->priv->order))
990                 return;
991
992         d.old = data->priv->order;
993         d.new = order;
994         exif_data_foreach_content (data, content_set_byte_order, &d);
995         data->priv->order = order;
996         if (data->priv->md)
997                 exif_mnote_data_set_byte_order (data->priv->md, order);
998 }
999
1000 void
1001 exif_data_log (ExifData *data, ExifLog *log)
1002 {
1003         if (!data || !data->priv) return;
1004         exif_log_unref (data->priv->log);
1005         data->priv->log = log;
1006         exif_log_ref (log);
1007 }
1008
1009 /* Used internally within libexif */
1010 ExifLog *exif_data_get_log (ExifData *);
1011 ExifLog *
1012 exif_data_get_log (ExifData *data)
1013 {
1014         if (!data || !data->priv) return NULL;
1015         return data->priv->log;
1016 }