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