main.html
Main Page
|
classes.html
Alphabetical List
|
annotated.html
Data Structures
|
dirs.html
Directories
|
files.html
File List
|
functions.html
Data Fields
|
globals.html
Globals
dir_000000.html
libexif
exif-data.c
exif-data_8c.html
Go to the documentation of this file.
00001
/* exif-data.c
00002
*
00003
* Copyright ? 2001 Lutz M?ller <lutz@users.sourceforge.net>
00004
*
00005
* This library is free software; you can redistribute it and/or
00006
* modify it under the terms of the GNU Lesser General Public
00007
* License as published by the Free Software Foundation; either
00008
* version 2 of the License, or (at your option) any later version.
00009
*
00010
* This library is distributed in the hope that it will be useful,
00011
* but WITHOUT ANY WARRANTY; without even the implied warranty of
00012
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013
* Lesser General Public License for more details.
00014
*
00015
* You should have received a copy of the GNU Lesser General Public
00016
* License along with this library; if not, write to the
00017
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00018
* Boston, MA 02111-1307, USA.
00019
*/
00020
00021
#include <config.h>
00022
00023
#include <
exif-mnote-data_8h.html
libexif/exif-mnote-data.h
>
00024
#include <
exif-data_8h.html
libexif/exif-data.h
>
00025
#include <
exif-ifd_8h.html
libexif/exif-ifd.h
>
00026
#include <
exif-mnote-data-priv_8h.html
libexif/exif-mnote-data-priv.h
>
00027
#include <
exif-utils_8h.html
libexif/exif-utils.h
>
00028
#include <
exif-loader_8h.html
libexif/exif-loader.h
>
00029
#include <
exif-log_8h.html
libexif/exif-log.h
>
00030
#include <
i18n_8h.html
libexif/i18n.h
>
00031
00032
#include <
exif-mnote-data-olympus_8h.html
libexif/olympus/exif-mnote-data-olympus.h
>
00033
#include <
exif-mnote-data-canon_8h.html
libexif/canon/exif-mnote-data-canon.h
>
00034
#include <
exif-mnote-data-pentax_8h.html
libexif/pentax/exif-mnote-data-pentax.h
>
00035
00036
#include <stdlib.h>
00037
#include <stdio.h>
00038
#include <string.h>
00039
00040
#undef MAX
exif-data_8c.html#a0
00041
#define MAX(a, b)  (((a) > (b)) ? (a) : (b))
00042
00043
#if defined(__WATCOMC__) || defined(_MSC_VER)
00044
#      define strncasecmp strnicmp
00045
#endif
00046
00047
#undef JPEG_MARKER_SOI
exif-data_8c.html#a1
00048
#define JPEG_MARKER_SOI  0xd8
00049
#undef JPEG_MARKER_APP0
exif-data_8c.html#a2
00050
#define JPEG_MARKER_APP0 0xe0
00051
#undef JPEG_MARKER_APP1
exif-data_8c.html#a3
00052
#define JPEG_MARKER_APP1 0xe1
00053
exif-data_8c.html#a6
00054
static
const
unsigned
char
exif-data_8c.html#a6
ExifHeader
[] = {0x45, 0x78, 0x69, 0x66, 0x00, 0x00};
00055
struct__ExifDataPrivate.html
00056
struct
struct__ExifDataPrivate.html
_ExifDataPrivate
00057 {
struct__ExifDataPrivate.html#o0
00058
exif-byte-order_8h.html#a3
ExifByteOrder
struct__ExifDataPrivate.html#o0
order
;
00059
struct__ExifDataPrivate.html#o1
00060
struct__ExifMnoteData.html
ExifMnoteData
*
struct__ExifDataPrivate.html#o1
md
;
00061
struct__ExifDataPrivate.html#o2
00062
struct__ExifLog.html
ExifLog
*
struct__ExifDataPrivate.html#o2
log
;
struct__ExifDataPrivate.html#o3
00063
struct__ExifMem.html
ExifMem
*
struct__ExifDataPrivate.html#o3
mem
;
00064
struct__ExifDataPrivate.html#o4
00065
unsigned
int
struct__ExifDataPrivate.html#o4
ref_count
;
00066
00067
/* Temporarily used while loading data */
struct__ExifDataPrivate.html#o5
00068
unsigned
int
struct__ExifDataPrivate.html#o5
offset_mnote
;
00069
struct__ExifDataPrivate.html#o6
00070
exif-data_8h.html#a28
ExifDataOption
struct__ExifDataPrivate.html#o6
options
;
struct__ExifDataPrivate.html#o7
00071
exif-data-type_8h.html#a5
ExifDataType
struct__ExifDataPrivate.html#o7
data_type
;
00072 };
00073
00074
static
void
*
exif-data_8c.html#a16
00075
exif-data_8c.html#a16
exif_data_alloc
(
struct__ExifData.html
ExifData
*data,
unsigned
int
i)
00076 {
00077
void
*d;
00078
00079
if
(!data || !i)
return
NULL;
00080
00081         d =
exif-mem_8c.html#a7
exif_mem_alloc
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o3
mem
, i);
00082
if
(d)
return
d;
00083
00084
exif-log_8h.html#a0
EXIF_LOG_NO_MEMORY
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
"ExifData"
, i);
00085
return
NULL;
00086 }
00087
00088
struct__ExifMnoteData.html
ExifMnoteData
*
exif-data_8h.html#a17
00089
exif-data_8c.html#a17
exif_data_get_mnote_data
(
struct__ExifData.html
ExifData
*d)
00090 {
00091
return
(d && d->
struct__ExifData.html#o3
priv
) ? d->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o1
md
: NULL;
00092 }
00093
00094
struct__ExifData.html
ExifData
*
exif-data_8h.html#a6
00095
exif-data_8c.html#a18
exif_data_new
(
void
)
00096 {
00097
struct__ExifMem.html
ExifMem
*mem =
exif-mem_8c.html#a9
exif_mem_new_default
();
00098
struct__ExifData.html
ExifData
*d =
exif-data_8c.html#a19
exif_data_new_mem
(mem);
00099
00100
exif-mem_8c.html#a5
exif_mem_unref
(mem);
00101
00102
return
d;
00103 }
00104
00105
struct__ExifData.html
ExifData
*
exif-data_8h.html#a7
00106
exif-data_8c.html#a19
exif_data_new_mem
(
struct__ExifMem.html
ExifMem
*mem)
00107 {
00108
struct__ExifData.html
ExifData
*data;
00109
unsigned
int
i;
00110
00111
if
(!mem)
return
NULL;
00112
00113         data =
exif-mem_8c.html#a7
exif_mem_alloc
(mem,
sizeof
(
struct__ExifData.html
ExifData
));
00114
if
(!data)
return
(NULL);
00115         data->
struct__ExifData.html#o3
priv
=
exif-mem_8c.html#a7
exif_mem_alloc
(mem,
sizeof
(
struct__ExifDataPrivate.html
ExifDataPrivate
));
00116
if
(!data->
struct__ExifData.html#o3
priv
) {
00117
exif-mem_8c.html#a6
exif_mem_free
(mem, data);
00118
return
(NULL);
00119         }
00120         data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o4
ref_count
= 1;
00121
00122         data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o3
mem
= mem;
00123
exif-mem_8c.html#a4
exif_mem_ref
(mem);
00124
00125
for
(i = 0; i <
exif-ifd_8h.html#a7a5
EXIF_IFD_COUNT
; i++) {
00126                 data->
struct__ExifData.html#o0
ifd
[i] =
exif-content_8c.html#a1
exif_content_new_mem
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o3
mem
);
00127
if
(!data->
struct__ExifData.html#o0
ifd
[i]) {
00128
exif-data_8c.html#a35
exif_data_free
(data);
00129
return
(NULL);
00130                 }
00131                 data->
struct__ExifData.html#o0
ifd
[i]->
struct__ExifContent.html#o2
parent
= data;
00132         }
00133
00134
/* Default options */
00135
exif-data_8c.html#a46
exif_data_set_option
(data,
exif-data_8h.html#a28a4
EXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS
);
00136
exif-data_8c.html#a46
exif_data_set_option
(data,
exif-data_8h.html#a28a5
EXIF_DATA_OPTION_FOLLOW_SPECIFICATION
);
00137
00138
/* Default data type: none */
00139
exif-data_8c.html#a50
exif_data_set_data_type
(data,
exif-data-type_8h.html#a5a4
EXIF_DATA_TYPE_COUNT
);
00140
00141
return
(data);
00142 }
00143
00144
struct__ExifData.html
ExifData
*
exif-data_8h.html#a9
00145
exif-data_8c.html#a20
exif_data_new_from_data
(
const
unsigned
char
*data,
unsigned
int
exif-format_8c.html#a2
size
)
00146 {
00147
struct__ExifData.html
ExifData
*edata;
00148
00149         edata =
exif-data_8c.html#a18
exif_data_new
();
00150
exif-data_8c.html#a30
exif_data_load_data
(edata, data, size);
00151
return
(edata);
00152 }
00153
00154
static
void
exif-data_8c.html#a21
00155
exif-data_8c.html#a21
exif_data_load_data_entry
(
struct__ExifData.html
ExifData
*data,
struct__ExifEntry.html
ExifEntry
*entry,
00156
const
unsigned
char
*d,
00157
unsigned
int
exif-format_8c.html#a2
size
,
unsigned
int
offset)
00158 {
00159
unsigned
int
s, doff;
00160
00161         entry->
struct__ExifEntry.html#o0
tag
=
exif-utils_8c.html#a2
exif_get_short
(d + offset + 0, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
);
00162         entry->
struct__ExifEntry.html#o1
format
=
exif-utils_8c.html#a2
exif_get_short
(d + offset + 2, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
);
00163         entry->
struct__ExifEntry.html#o2
components
=
exif-utils_8c.html#a7
exif_get_long
(d + offset + 4, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
);
00164
00165
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a4
EXIF_LOG_CODE_DEBUG
,
"ExifData"
,
00166
"Loading entry 0x%x ('%s')..."
, entry->
struct__ExifEntry.html#o0
tag
,
00167
exif-tag_8c.html#a26
exif_tag_get_name
(entry->
struct__ExifEntry.html#o0
tag
));
00168
00169
/*
00170
* Size? If bigger than 4 bytes, the actual data is not
00171
* in the entry but somewhere else (offset).
00172
*/
00173         s =
exif-format_8c.html#a5
exif_format_get_size
(entry->
struct__ExifEntry.html#o1
format
) * entry->
struct__ExifEntry.html#o2
components
;
00174
if
(!s)
00175
return
;
00176
if
(s > 4)
00177                 doff =
exif-utils_8c.html#a7
exif_get_long
(d + offset + 8, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
);
00178
else
00179                 doff = offset + 8;
00180
00181
/* Sanity check */
00182
if
(size < doff + s)
00183
return
;
00184
00185         entry->
struct__ExifEntry.html#o3
data
=
exif-data_8c.html#a16
exif_data_alloc
(data, s);
00186
if
(entry->
struct__ExifEntry.html#o3
data
) {
00187                 entry->
struct__ExifEntry.html#o4
size
= s;
00188                 memcpy (entry->
struct__ExifEntry.html#o3
data
, d + doff, s);
00189         }
00190
00191
/* If this is the MakerNote, remember the offset */
00192
if
(entry->
struct__ExifEntry.html#o0
tag
==
exif-tag_8h.html#a153a104
EXIF_TAG_MAKER_NOTE
) {
00193
if
(entry->
struct__ExifEntry.html#o4
size
> 6)
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
00194
exif-log_8h.html#a17a4
EXIF_LOG_CODE_DEBUG
,
"ExifData"
,
00195
"MakerNote found (%02x %02x %02x %02x "
00196
"%02x %02x %02x...)."
,
00197                           entry->
struct__ExifEntry.html#o3
data
[0], entry->
struct__ExifEntry.html#o3
data
[1], entry->
struct__ExifEntry.html#o3
data
[2],
00198                           entry->
struct__ExifEntry.html#o3
data
[3], entry->
struct__ExifEntry.html#o3
data
[4], entry->
struct__ExifEntry.html#o3
data
[5],
00199                           entry->
struct__ExifEntry.html#o3
data
[6]);
00200                 data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o5
offset_mnote
= doff;
00201         }
00202 }
00203
00204
static
void
exif-data_8c.html#a22
00205
exif-data_8c.html#a22
exif_data_save_data_entry
(
struct__ExifData.html
ExifData
*data,
struct__ExifEntry.html
ExifEntry
*e,
00206
unsigned
char
**d,
unsigned
int
*ds,
00207
unsigned
int
offset)
00208 {
00209
unsigned
int
doff, s;
00210
00211
if
(!data || !data->
struct__ExifData.html#o3
priv
)
return
;
00212
00213
/*
00214
* Each entry is 12 bytes long. The memory for the entry has
00215
* already been allocated.
00216
*/
00217
exif-utils_8c.html#a4
exif_set_short
(*d + 6 + offset + 0,
00218                         data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
, (
exif-utils_8h.html#a4
ExifShort
) e->
struct__ExifEntry.html#o0
tag
);
00219
exif-utils_8c.html#a4
exif_set_short
(*d + 6 + offset + 2,
00220                         data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
, (
exif-utils_8h.html#a4
ExifShort
) e->
struct__ExifEntry.html#o1
format
);
00221
00222
#ifndef EXIF_DONT_CHANGE_MAKER_NOTE
00223
/* If this is the maker note tag, update it. */
00224
if
((e->
struct__ExifEntry.html#o0
tag
==
exif-tag_8h.html#a153a104
EXIF_TAG_MAKER_NOTE
) && data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o1
md
) {
00225
exif-mem_8c.html#a6
exif_mem_free
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o3
mem
, e->
struct__ExifEntry.html#o3
data
);
00226                 e->
struct__ExifEntry.html#o3
data
= NULL;
00227                 e->
struct__ExifEntry.html#o4
size
= 0;
00228
exif-mnote-data-priv_8h.html#a4
exif_mnote_data_set_offset
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o1
md
, *ds - 6);
00229
exif-mnote-data_8c.html#a5
exif_mnote_data_save
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o1
md
, &e->
struct__ExifEntry.html#o3
data
, &e->
struct__ExifEntry.html#o4
size
);
00230                 e->
struct__ExifEntry.html#o2
components
= e->
struct__ExifEntry.html#o4
size
;
00231         }
00232
#endif
00233
00234
exif-utils_8c.html#a8
exif_set_long
(*d + 6 + offset + 4,
00235                         data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
, e->
struct__ExifEntry.html#o2
components
);
00236
00237
/*
00238
* Size? If bigger than 4 bytes, the actual data is not in
00239
* the entry but somewhere else.
00240
*/
00241         s =
exif-format_8c.html#a5
exif_format_get_size
(e->
struct__ExifEntry.html#o1
format
) * e->
struct__ExifEntry.html#o2
components
;
00242
if
(s > 4) {
00243                 doff = *ds - 6;
00244                 *ds += s;
00245
00246
/*
00247
* According to the TIFF specification,
00248
* the offset must be an even number. If we need to introduce
00249
* a padding byte, we set it to 0.
00250
*/
00251
if
(s & 1) (*ds)++;
00252                 *d =
exif-mem_8c.html#a8
exif_mem_realloc
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o3
mem
, *d, *ds);
00253
if
(!*d) {
00254
exif-log_8h.html#a0
EXIF_LOG_NO_MEMORY
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
"ExifData"
, *ds);
00255
return
;
00256                 }
00257
exif-utils_8c.html#a8
exif_set_long
(*d + 6 + offset + 8, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
, doff);
00258
if
(s & 1) *(*d + *ds - 1) =
'\0'
;
00259
00260         }
else
00261                 doff = offset + 8;
00262
00263
/* Write the data. Fill unneeded bytes with 0. */
00264         memcpy (*d + 6 + doff, e->
struct__ExifEntry.html#o3
data
, s);
00265
if
(s < 4) memset (*d + 6 + doff + s, 0, (4 - s));
00266 }
00267
00268
static
void
exif-data_8c.html#a23
00269
exif-data_8c.html#a23
exif_data_load_data_thumbnail
(
struct__ExifData.html
ExifData
*data,
const
unsigned
char
*d,
00270
unsigned
int
ds,
exif-utils_8h.html#a6
ExifLong
offset,
exif-utils_8h.html#a6
ExifLong
exif-format_8c.html#a2
size
)
00271 {
00272
if
(ds < offset + size) {
00273
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a4
EXIF_LOG_CODE_DEBUG
,
"ExifData"
,
00274
"Bogus thumbnail offset and size: %i < %i + %i."
,
00275                           (
int
) ds, (
int
) offset, (
int
) size);
00276
return
;
00277         }
00278
if
(data->
struct__ExifData.html#o1
data
)
exif-mem_8c.html#a6
exif_mem_free
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o3
mem
, data->
struct__ExifData.html#o1
data
);
00279         data->
struct__ExifData.html#o2
size
= size;
00280         data->
struct__ExifData.html#o1
data
=
exif-data_8c.html#a16
exif_data_alloc
(data, data->
struct__ExifData.html#o2
size
);
00281
if
(!data->
struct__ExifData.html#o1
data
)
return
;
00282         memcpy (data->
struct__ExifData.html#o1
data
, d + offset, data->
struct__ExifData.html#o2
size
);
00283 }
00284
00285
#undef CHECK_REC
exif-data_8c.html#a4
00286
#define CHECK_REC(i)                                    \
00287
if ((i) == ifd) {                               \
00288
exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, \
00289
"ExifData", "Recursive entry in IFD "   \
00290
"'%s' detected. Skipping...",           \
00291
exif_ifd_get_name (i));                 \
00292
break;                                          \
00293
}                                                       \
00294
if (data->ifd[(i)]->count) {                            \
00295
exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, \
00296
"ExifData", "Attemt to load IFD "       \
00297
"'%s' multiple times detected. "        \
00298
"Skipping...",                          \
00299
exif_ifd_get_name (i));                 \
00300
break;                                          \
00301
}
00302
00303
static
void
exif-data_8c.html#a24
00304
exif-data_8c.html#a24
exif_data_load_data_content
(
struct__ExifData.html
ExifData
*data,
exif-ifd_8h.html#a7
ExifIfd
exif-ifd_8c.html#a0
ifd
,
00305
const
unsigned
char
*d,
00306
unsigned
int
ds,
unsigned
int
offset,
unsigned
int
recursion_depth)
00307 {
00308
exif-utils_8h.html#a6
ExifLong
o, thumbnail_offset = 0, thumbnail_length = 0;
00309
exif-utils_8h.html#a4
ExifShort
n;
00310
struct__ExifEntry.html
ExifEntry
*entry;
00311
unsigned
int
i;
00312
exif-tag_8h.html#a153
ExifTag
mnote-canon-tag_8c.html#a0
tag
;
00313
00314
if
(!data || !data->
struct__ExifData.html#o3
priv
)
return
;
00315
if
((ifd < 0) || (ifd >=
exif-ifd_8h.html#a7a5
EXIF_IFD_COUNT
))
return
;
00316
00317
if
(recursion_depth > 150) {
00318
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a6
EXIF_LOG_CODE_CORRUPT_DATA
,
"ExifData"
,
00319
"Deep recursion detected!"
);
00320
return
;
00321         }
00322
00323
/* Read the number of entries */
00324
if
(offset >= ds - 1)
return
;
00325         n =
exif-utils_8c.html#a2
exif_get_short
(d + offset, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
);
00326
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a4
EXIF_LOG_CODE_DEBUG
,
"ExifData"
,
00327
"Loading %i entries..."
, n);
00328         offset += 2;
00329
00330
/* Check if we have enough data. */
00331
if
(offset + 12 * n > ds) n = (ds - offset) / 12;
00332
00333
for
(i = 0; i < n; i++) {
00334
00335                 tag =
exif-utils_8c.html#a2
exif_get_short
(d + offset + 12 * i, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
);
00336
switch
(tag) {
00337
case
exif-tag_8h.html#a153a80
EXIF_TAG_EXIF_IFD_POINTER
:
00338
case
exif-tag_8h.html#a153a84
EXIF_TAG_GPS_INFO_IFD_POINTER
:
00339
case
exif-tag_8h.html#a153a114
EXIF_TAG_INTEROPERABILITY_IFD_POINTER
:
00340
case
exif-tag_8h.html#a153a63
EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH
:
00341
case
exif-tag_8h.html#a153a62
EXIF_TAG_JPEG_INTERCHANGE_FORMAT
:
00342                         o =
exif-utils_8c.html#a7
exif_get_long
(d + offset + 12 * i + 8,
00343                                            data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
);
00344
switch
(tag) {
00345
case
exif-tag_8h.html#a153a80
EXIF_TAG_EXIF_IFD_POINTER
:
00346
exif-data_8c.html#a4
CHECK_REC
(
exif-ifd_8h.html#a7a2
EXIF_IFD_EXIF
);
00347
exif-data_8c.html#a24
exif_data_load_data_content
(data, EXIF_IFD_EXIF, d, ds, o, recursion_depth + 1);
00348
break
;
00349
case
exif-tag_8h.html#a153a84
EXIF_TAG_GPS_INFO_IFD_POINTER
:
00350
exif-data_8c.html#a4
CHECK_REC
(
exif-ifd_8h.html#a7a3
EXIF_IFD_GPS
);
00351
exif-data_8c.html#a24
exif_data_load_data_content
(data,
exif-ifd_8h.html#a7a3
EXIF_IFD_GPS
, d, ds, o, recursion_depth + 1);
00352
break
;
00353
case
exif-tag_8h.html#a153a114
EXIF_TAG_INTEROPERABILITY_IFD_POINTER
:
00354
exif-data_8c.html#a4
CHECK_REC
(
exif-ifd_8h.html#a7a4
EXIF_IFD_INTEROPERABILITY
);
00355
exif-data_8c.html#a24
exif_data_load_data_content
(data,
exif-ifd_8h.html#a7a4
EXIF_IFD_INTEROPERABILITY
, d, ds, o, recursion_depth + 1);
00356
break
;
00357
case
exif-tag_8h.html#a153a62
EXIF_TAG_JPEG_INTERCHANGE_FORMAT
:
00358                                 thumbnail_offset = o;
00359
if
(thumbnail_offset && thumbnail_length)
00360
exif-data_8c.html#a23
exif_data_load_data_thumbnail
(data, d,
00361                                                 ds, thumbnail_offset,
00362                                                 thumbnail_length);
00363
break
;
00364
case
exif-tag_8h.html#a153a63
EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH
:
00365                                 thumbnail_length = o;
00366
if
(thumbnail_offset && thumbnail_length)
00367
exif-data_8c.html#a23
exif_data_load_data_thumbnail
(data, d,
00368                                                 ds, thumbnail_offset,
00369                                                 thumbnail_length);
00370
break
;
00371
default
:
00372
return
;
00373                         }
00374
break
;
00375
default
:
00376
00377
/*
00378
* If we don't know the tag, don't fail. It could be that new
00379
* versions of the standard have defined additional tags. Note that
00380
* 0 is a valid tag in the GPS IFD.
00381
*/
00382
if
(!
exif-tag_8c.html#a22
exif_tag_get_name_in_ifd
(tag, ifd)) {
00383
00384
/*
00385
* Special case: Tag and format 0. That's against specification.
00386
* At least up to 2.2. But Photoshop writes it anyways.
00387
*/
00388
if
(!memcmp (d + offset + 12 * i,
"\0\0\0\0"
, 4)) {
00389
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a4
EXIF_LOG_CODE_DEBUG
,
"ExifData"
,
00390
"Skipping empty entry at position %i in '%s'."
, i,
00391
exif-ifd_8c.html#a3
exif_ifd_get_name
(ifd));
00392
break
;
00393                                 }
00394
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a4
EXIF_LOG_CODE_DEBUG
,
"ExifData"
,
00395
"Unknown tag 0x%04x (entry %i in '%s'). Please report this tag "
00396
"to <libexif-devel@lists.sourceforge.net>."
, tag, i,
00397
exif-ifd_8c.html#a3
exif_ifd_get_name
(ifd));
00398
if
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o6
options
&
exif-data_8h.html#a28a4
EXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS
)
00399
break
;
00400                         }
00401                         entry =
exif-entry_8c.html#a14
exif_entry_new_mem
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o3
mem
);
00402
exif-data_8c.html#a21
exif_data_load_data_entry
(data, entry, d, ds,
00403                                                    offset + 12 * i);
00404
exif-content_8c.html#a6
exif_content_add_entry
(data->
struct__ExifData.html#o0
ifd
[ifd], entry);
00405
exif-entry_8c.html#a16
exif_entry_unref
(entry);
00406
break
;
00407                 }
00408         }
00409 }
00410
00411
static
int
exif-data_8c.html#a25
00412
exif-data_8c.html#a25
cmp_func
(
const
unsigned
char
*p1,
const
unsigned
char
*p2,
exif-byte-order_8h.html#a3
ExifByteOrder
o)
00413 {
00414
exif-utils_8h.html#a4
ExifShort
tag1 =
exif-utils_8c.html#a2
exif_get_short
(p1, o);
00415
exif-utils_8h.html#a4
ExifShort
tag2 =
exif-utils_8c.html#a2
exif_get_short
(p2, o);
00416
00417
return
(tag1 < tag2) ? -1 : (tag1 > tag2) ? 1 : 0;
00418 }
00419
00420
static
int
exif-data_8c.html#a26
00421
exif-data_8c.html#a26
cmp_func_intel
(
const
void
*elem1,
const
void
*elem2)
00422 {
00423
return
exif-data_8c.html#a25
cmp_func
((
const
unsigned
char
*) elem1,
00424                         (
const
unsigned
char
*) elem2,
exif-byte-order_8h.html#a3a1
EXIF_BYTE_ORDER_INTEL
);
00425 }
00426
00427
static
int
exif-data_8c.html#a27
00428
exif-data_8c.html#a27
cmp_func_motorola
(
const
void
*elem1,
const
void
*elem2)
00429 {
00430
return
exif-data_8c.html#a25
cmp_func
((
const
unsigned
char
*) elem1,
00431                         (
const
unsigned
char
*) elem2,
exif-byte-order_8h.html#a3a0
EXIF_BYTE_ORDER_MOTOROLA
);
00432 }
00433
00434
static
void
exif-data_8c.html#a28
00435
exif-data_8c.html#a28
exif_data_save_data_content
(
struct__ExifData.html
ExifData
*data,
struct__ExifContent.html
ExifContent
*
exif-ifd_8c.html#a0
ifd
,
00436
unsigned
char
**d,
unsigned
int
*ds,
00437
unsigned
int
offset)
00438 {
00439
unsigned
int
j, n_ptr = 0, n_thumb = 0;
00440
exif-ifd_8h.html#a7
ExifIfd
i;
00441
00442
if
(!data || !data->
struct__ExifData.html#o3
priv
|| !ifd || !d || !ds)
return
;
00443
00444
for
(i = 0; i <
exif-ifd_8h.html#a7a5
EXIF_IFD_COUNT
; i++)
00445
if
(ifd == data->
struct__ExifData.html#o0
ifd
[i])
00446
break
;
00447
if
(i ==
exif-ifd_8h.html#a7a5
EXIF_IFD_COUNT
)
00448
return
;
00449
00450
/*
00451
* Check if we need some extra entries for pointers or the thumbnail.
00452
*/
00453
switch
(i) {
00454
case
exif-ifd_8h.html#a7a0
EXIF_IFD_0
:
00455
00456
/*
00457
* The pointer to IFD_EXIF is in IFD_0. The pointer to
00458
* IFD_INTEROPERABILITY is in IFD_EXIF.
00459
*/
00460
if
(data->
struct__ExifData.html#o0
ifd
[
exif-ifd_8h.html#a7a2
EXIF_IFD_EXIF
]->count ||
00461                     data->
struct__ExifData.html#o0
ifd
[
exif-ifd_8h.html#a7a4
EXIF_IFD_INTEROPERABILITY
]->count)
00462                         n_ptr++;
00463
00464
/* The pointer to IFD_GPS is in IFD_0. */
00465
if
(data->
struct__ExifData.html#o0
ifd
[
exif-ifd_8h.html#a7a3
EXIF_IFD_GPS
]->count)
00466                         n_ptr++;
00467
00468
break
;
00469
case
exif-ifd_8h.html#a7a1
EXIF_IFD_1
:
00470
if
(data->
struct__ExifData.html#o2
size
)
00471                         n_thumb = 2;
00472
break
;
00473
case
exif-ifd_8h.html#a7a2
EXIF_IFD_EXIF
:
00474
if
(data->
struct__ExifData.html#o0
ifd
[
exif-ifd_8h.html#a7a4
EXIF_IFD_INTEROPERABILITY
]->count)
00475                         n_ptr++;
00476
default
:
00477
break
;
00478         }
00479
00480
/*
00481
* Allocate enough memory for all entries
00482
* and the number of entries.
00483
*/
00484         *ds += (2 + (ifd->
struct__ExifContent.html#o1
count
+ n_ptr + n_thumb) * 12 + 4);
00485         *d =
exif-mem_8c.html#a8
exif_mem_realloc
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o3
mem
, *d, *ds);
00486
if
(!*d) {
00487
exif-log_8h.html#a0
EXIF_LOG_NO_MEMORY
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
"ExifData"
, *ds);
00488
return
;
00489         }
00490
00491
/* Save the number of entries */
00492
exif-utils_8c.html#a4
exif_set_short
(*d + 6 + offset, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00493                         (
exif-utils_8h.html#a4
ExifShort
) (ifd->
struct__ExifContent.html#o1
count
+ n_ptr + n_thumb));
00494         offset += 2;
00495
00496
/* Save each entry */
00497
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a4
EXIF_LOG_CODE_DEBUG
,
"ExifData"
,
00498
"Saving %i entries (IFD '%s', offset: %i)..."
,
00499                   ifd->
struct__ExifContent.html#o1
count
,
exif-ifd_8c.html#a3
exif_ifd_get_name
(i), offset);
00500
for
(j = 0; j < ifd->count; j++)
00501
exif-data_8c.html#a22
exif_data_save_data_entry
(data, ifd->
struct__ExifContent.html#o0
entries
[j], d, ds, offset + 12 * j);
00502
00503         offset += 12 * ifd->
struct__ExifContent.html#o1
count
;
00504
00505
/* Now save special entries. */
00506
switch
(i) {
00507
case
exif-ifd_8h.html#a7a0
EXIF_IFD_0
:
00508
00509
/*
00510
* The pointer to IFD_EXIF is in IFD_0.
00511
* However, the pointer to IFD_INTEROPERABILITY is in IFD_EXIF,
00512
* therefore, if IFD_INTEROPERABILITY is not empty, we need
00513
* IFD_EXIF even if latter is empty.
00514
*/
00515
if
(data->
struct__ExifData.html#o0
ifd
[
exif-ifd_8h.html#a7a2
EXIF_IFD_EXIF
]->count ||
00516                     data->
struct__ExifData.html#o0
ifd
[
exif-ifd_8h.html#a7a4
EXIF_IFD_INTEROPERABILITY
]->count) {
00517
exif-utils_8c.html#a4
exif_set_short
(*d + 6 + offset + 0, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00518
exif-tag_8h.html#a153a80
EXIF_TAG_EXIF_IFD_POINTER
);
00519
exif-utils_8c.html#a4
exif_set_short
(*d + 6 + offset + 2, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00520
exif-format_8h.html#a14a3
EXIF_FORMAT_LONG
);
00521
exif-utils_8c.html#a8
exif_set_long
(*d + 6 + offset + 4, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00522                                         1);
00523
exif-utils_8c.html#a8
exif_set_long
(*d + 6 + offset + 8, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00524                                         *ds - 6);
00525
exif-data_8c.html#a28
exif_data_save_data_content
(data,
00526                                 data->
struct__ExifData.html#o0
ifd
[
exif-ifd_8h.html#a7a2
EXIF_IFD_EXIF
], d, ds, *ds - 6);
00527                         offset += 12;
00528                 }
00529
00530
/* The pointer to IFD_GPS is in IFD_0, too. */
00531
if
(data->
struct__ExifData.html#o0
ifd
[
exif-ifd_8h.html#a7a3
EXIF_IFD_GPS
]->count) {
00532
exif-utils_8c.html#a4
exif_set_short
(*d + 6 + offset + 0, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00533
exif-tag_8h.html#a153a84
EXIF_TAG_GPS_INFO_IFD_POINTER
);
00534
exif-utils_8c.html#a4
exif_set_short
(*d + 6 + offset + 2, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00535
exif-format_8h.html#a14a3
EXIF_FORMAT_LONG
);
00536
exif-utils_8c.html#a8
exif_set_long
(*d + 6 + offset + 4, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00537                                         1);
00538
exif-utils_8c.html#a8
exif_set_long
(*d + 6 + offset + 8, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00539                                         *ds - 6);
00540
exif-data_8c.html#a28
exif_data_save_data_content
(data,
00541                                 data->
struct__ExifData.html#o0
ifd
[
exif-ifd_8h.html#a7a3
EXIF_IFD_GPS
], d, ds, *ds - 6);
00542                         offset += 12;
00543                 }
00544
00545
break
;
00546
case
exif-ifd_8h.html#a7a2
EXIF_IFD_EXIF
:
00547
00548
/*
00549
* The pointer to IFD_INTEROPERABILITY is in IFD_EXIF.
00550
* See note above.
00551
*/
00552
if
(data->
struct__ExifData.html#o0
ifd
[
exif-ifd_8h.html#a7a4
EXIF_IFD_INTEROPERABILITY
]->count) {
00553
exif-utils_8c.html#a4
exif_set_short
(*d + 6 + offset + 0, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00554
exif-tag_8h.html#a153a114
EXIF_TAG_INTEROPERABILITY_IFD_POINTER
);
00555
exif-utils_8c.html#a4
exif_set_short
(*d + 6 + offset + 2, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00556
exif-format_8h.html#a14a3
EXIF_FORMAT_LONG
);
00557
exif-utils_8c.html#a8
exif_set_long
(*d + 6 + offset + 4, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00558                                         1);
00559
exif-utils_8c.html#a8
exif_set_long
(*d + 6 + offset + 8, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00560                                         *ds - 6);
00561
exif-data_8c.html#a28
exif_data_save_data_content
(data,
00562                                 data->
struct__ExifData.html#o0
ifd
[
exif-ifd_8h.html#a7a4
EXIF_IFD_INTEROPERABILITY
], d, ds,
00563                                 *ds - 6);
00564                         offset += 12;
00565                 }
00566
00567
break
;
00568
case
exif-ifd_8h.html#a7a1
EXIF_IFD_1
:
00569
00570
/*
00571
* Information about the thumbnail (if any) is saved in
00572
* IFD_1.
00573
*/
00574
if
(data->
struct__ExifData.html#o2
size
) {
00575
00576
/* EXIF_TAG_JPEG_INTERCHANGE_FORMAT */
00577
exif-utils_8c.html#a4
exif_set_short
(*d + 6 + offset + 0, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00578
exif-tag_8h.html#a153a62
EXIF_TAG_JPEG_INTERCHANGE_FORMAT
);
00579
exif-utils_8c.html#a4
exif_set_short
(*d + 6 + offset + 2, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00580
exif-format_8h.html#a14a3
EXIF_FORMAT_LONG
);
00581
exif-utils_8c.html#a8
exif_set_long
(*d + 6 + offset + 4, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00582                                         1);
00583
exif-utils_8c.html#a8
exif_set_long
(*d + 6 + offset + 8, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00584                                         *ds - 6);
00585                         *ds += data->
struct__ExifData.html#o2
size
;
00586                         *d =
exif-mem_8c.html#a8
exif_mem_realloc
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o3
mem
, *d, *ds);
00587
if
(!*d) {
00588
exif-log_8h.html#a0
EXIF_LOG_NO_MEMORY
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
"ExifData"
,
00589                                                     *ds);
00590
return
;
00591                         }
00592                         memcpy (*d + *ds - data->
struct__ExifData.html#o2
size
, data->
struct__ExifData.html#o1
data
, data->
struct__ExifData.html#o2
size
);
00593                         offset += 12;
00594
00595
/* EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH */
00596
exif-utils_8c.html#a4
exif_set_short
(*d + 6 + offset + 0, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00597
exif-tag_8h.html#a153a63
EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH
);
00598
exif-utils_8c.html#a4
exif_set_short
(*d + 6 + offset + 2, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00599
exif-format_8h.html#a14a3
EXIF_FORMAT_LONG
);
00600
exif-utils_8c.html#a8
exif_set_long
(*d + 6 + offset + 4, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00601                                         1);
00602
exif-utils_8c.html#a8
exif_set_long
(*d + 6 + offset + 8, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
,
00603                                         data->
struct__ExifData.html#o2
size
);
00604                         offset += 12;
00605                 }
00606
00607
break
;
00608
default
:
00609
break
;
00610         }
00611
00612
/* Sort the directory according to TIFF specification */
00613         qsort (*d + 6 + offset - (ifd->
struct__ExifContent.html#o1
count
+ n_ptr + n_thumb) * 12,
00614                         (ifd->
struct__ExifContent.html#o1
count
+ n_ptr + n_thumb), 12,
00615                         (data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
==
exif-byte-order_8h.html#a3a1
EXIF_BYTE_ORDER_INTEL
) ?
exif-data_8c.html#a26
cmp_func_intel
:
exif-data_8c.html#a27
cmp_func_motorola
);
00616
00617
/* Correctly terminate the directory */
00618
if
(i ==
exif-ifd_8h.html#a7a0
EXIF_IFD_0
&& (data->
struct__ExifData.html#o0
ifd
[
exif-ifd_8h.html#a7a1
EXIF_IFD_1
]->count ||
00619                                              data->
struct__ExifData.html#o2
size
)) {
00620
00621
/*
00622
* We are saving IFD 0. Tell where IFD 1 starts and save
00623
* IFD 1.
00624
*/
00625
exif-utils_8c.html#a8
exif_set_long
(*d + 6 + offset, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
, *ds - 6);
00626
exif-data_8c.html#a28
exif_data_save_data_content
(data, data->
struct__ExifData.html#o0
ifd
[
exif-ifd_8h.html#a7a1
EXIF_IFD_1
], d, ds,
00627                                              *ds - 6);
00628         }
else
00629
exif-utils_8c.html#a8
exif_set_long
(*d + 6 + offset, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
, 0);
00630 }
00631
exif-data_8c.html#a52
00632
typedef
enum
{
00633
exif-data_8c.html#a52a12
EXIF_DATA_TYPE_MAKER_NOTE_NONE
= 0,
00634
exif-data_8c.html#a52a13
EXIF_DATA_TYPE_MAKER_NOTE_CANON
= 1,
00635
exif-data_8c.html#a52a14
EXIF_DATA_TYPE_MAKER_NOTE_OLYMPUS
= 2,
00636
exif-data_8c.html#a52a15
EXIF_DATA_TYPE_MAKER_NOTE_PENTAX
= 3
00637 }
exif-data_8c.html#a52
ExifDataTypeMakerNote
;
00638
00639
static
exif-data_8c.html#a52
ExifDataTypeMakerNote
exif-data_8c.html#a29
00640
exif-data_8c.html#a29
exif_data_get_type_maker_note
(
struct__ExifData.html
ExifData
*d)
00641 {
00642
struct__ExifEntry.html
ExifEntry
*e, *em;
00643
char
mnote-canon-entry_8c.html#a5
value
[1024];
00644
00645
if
(!d)
return
exif-data_8c.html#a52a12
EXIF_DATA_TYPE_MAKER_NOTE_NONE
;
00646
00647         e =
exif-data_8h.html#a0
exif_data_get_entry
(d,
exif-tag_8h.html#a153a104
EXIF_TAG_MAKER_NOTE
);
00648
if
(!e)
return
exif-data_8c.html#a52a12
EXIF_DATA_TYPE_MAKER_NOTE_NONE
;
00649
00650
/* Olympus & Nikon */
00651
if
((e->
struct__ExifEntry.html#o4
size
>= 5) && (!memcmp (e->
struct__ExifEntry.html#o3
data
,
"OLYMP"
, 5) ||
00652                                !memcmp (e->
struct__ExifEntry.html#o3
data
,
"Nikon"
, 5)))
00653
return
exif-data_8c.html#a52a14
EXIF_DATA_TYPE_MAKER_NOTE_OLYMPUS
;
00654
00655         em =
exif-data_8h.html#a0
exif_data_get_entry
(d,
exif-tag_8h.html#a153a42
EXIF_TAG_MAKE
);
00656
if
(!em)
return
exif-data_8c.html#a52a12
EXIF_DATA_TYPE_MAKER_NOTE_NONE
;
00657
00658
/* Canon */
00659
if
(!strcmp (
exif-entry_8c.html#a20
exif_entry_get_value
(em, value,
sizeof
(value)),
"Canon"
))
00660
return
exif-data_8c.html#a52a13
EXIF_DATA_TYPE_MAKER_NOTE_CANON
;
00661
00662
/* Pentax & some variant of Nikon */
00663
if
((e->
struct__ExifEntry.html#o4
size
>= 2) && (e->
struct__ExifEntry.html#o3
data
[0] == 0x00) && (e->
struct__ExifEntry.html#o3
data
[1] == 0x1b)) {
00664
if
(!strncasecmp (
00665
exif-entry_8c.html#a20
exif_entry_get_value
(em, value,
sizeof
(value)),
00666
"Nikon"
, 5))
00667
return
exif-data_8c.html#a52a14
EXIF_DATA_TYPE_MAKER_NOTE_OLYMPUS
;
00668
else
00669
return
exif-data_8c.html#a52a15
EXIF_DATA_TYPE_MAKER_NOTE_PENTAX
;
00670         }
00671
00672
return
exif-data_8c.html#a52a12
EXIF_DATA_TYPE_MAKER_NOTE_NONE
;
00673 }
00674
exif-data_8c.html#a5
00675
#define LOG_TOO_SMALL \
00676
exif_log (data->priv->log, EXIF_LOG_CODE_CORRUPT_DATA, "ExifData", \
00677
_("Size of data too small to allow for EXIF data."));
00678
00679
void
exif-data_8h.html#a10
00680
exif-data_8c.html#a30
exif_data_load_data
(
struct__ExifData.html
ExifData
*data,
const
unsigned
char
*d_orig,
00681
unsigned
int
ds_orig)
00682 {
00683
unsigned
int
l;
00684
exif-utils_8h.html#a6
ExifLong
offset;
00685
exif-utils_8h.html#a4
ExifShort
n;
00686
const
unsigned
char
*d = d_orig;
00687
unsigned
int
ds = ds_orig, len;
00688
00689
if
(!data || !data->
struct__ExifData.html#o3
priv
|| !d || !ds)
return
;
00690
00691
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a4
EXIF_LOG_CODE_DEBUG
,
"ExifData"
,
00692
"Parsing %i byte(s) EXIF data...\n"
, ds);
00693
00694
/*
00695
* It can be that the data starts with the EXIF header. If it does
00696
* not, search the EXIF marker.
00697
*/
00698
if
(ds < 6) {
00699
exif-data_8c.html#a5
LOG_TOO_SMALL
;
00700
return
;
00701         }
00702
if
(!memcmp (d,
exif-data_8c.html#a6
ExifHeader
, 6)) {
00703
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a4
EXIF_LOG_CODE_DEBUG
,
"ExifData"
,
00704
"Found EXIF header."
);
00705         }
else
{
00706
while
(1) {
00707
while
((d[0] == 0xff) && ds) {
00708                                 d++;
00709                                 ds--;
00710                         }
00711
00712
/* JPEG_MARKER_SOI */
00713
if
(d[0] ==
exif-data_8c.html#a1
JPEG_MARKER_SOI
) {
00714                                 d++;
00715                                 ds--;
00716
continue
;
00717                         }
00718
00719
/* JPEG_MARKER_APP0 */
00720
if
(d[0] ==
exif-data_8c.html#a2
JPEG_MARKER_APP0
) {
00721                                 d++;
00722                                 ds--;
00723                                 l = (d[0] << 8) | d[1];
00724
if
(l > ds)
00725
return
;
00726                                 d += l;
00727                                 ds -= l;
00728
continue
;
00729                         }
00730
00731
/* JPEG_MARKER_APP1 */
00732
if
(d[0] ==
exif-data_8c.html#a3
JPEG_MARKER_APP1
)
00733
break
;
00734
00735
/* Unknown marker or data. Give up. */
00736
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a6
EXIF_LOG_CODE_CORRUPT_DATA
,
00737
"ExifData"
,
i18n_8h.html#a6
_
(
"EXIF marker not found."
));
00738
return
;
00739                 }
00740                 d++;
00741                 ds--;
00742
if
(ds < 2) {
00743
exif-data_8c.html#a5
LOG_TOO_SMALL
;
00744
return
;
00745                 }
00746                 len = (d[0] << 8) | d[1];
00747
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a4
EXIF_LOG_CODE_DEBUG
,
"ExifData"
,
00748
"We have to deal with %i byte(s) of EXIF data."
,
00749                           len);
00750                 d += 2;
00751                 ds -= 2;
00752         }
00753
00754
/*
00755
* Verify the exif header
00756
* (offset 2, length 6).
00757
*/
00758
if
(ds < 6) {
00759
exif-data_8c.html#a5
LOG_TOO_SMALL
;
00760
return
;
00761         }
00762
if
(memcmp (d,
exif-data_8c.html#a6
ExifHeader
, 6)) {
00763
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a6
EXIF_LOG_CODE_CORRUPT_DATA
,
00764
"ExifData"
,
i18n_8h.html#a6
_
(
"EXIF header not found."
));
00765
return
;
00766         }
00767
00768
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a4
EXIF_LOG_CODE_DEBUG
,
"ExifData"
,
00769
"Found EXIF header."
);
00770
00771
/* Byte order (offset 6, length 2) */
00772
if
(ds < 14)
00773
return
;
00774
if
(!memcmp (d + 6,
"II"
, 2))
00775                 data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
=
exif-byte-order_8h.html#a3a1
EXIF_BYTE_ORDER_INTEL
;
00776
else
if
(!memcmp (d + 6,
"MM"
, 2))
00777                 data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
=
exif-byte-order_8h.html#a3a0
EXIF_BYTE_ORDER_MOTOROLA
;
00778
else
{
00779
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a6
EXIF_LOG_CODE_CORRUPT_DATA
,
00780
"ExifData"
,
i18n_8h.html#a6
_
(
"Unknown encoding."
));
00781
return
;
00782         }
00783
00784
/* Fixed value */
00785
if
(
exif-utils_8c.html#a2
exif_get_short
(d + 8, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
) != 0x002a)
00786
return
;
00787
00788
/* IFD 0 offset */
00789         offset =
exif-utils_8c.html#a7
exif_get_long
(d + 10, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
);
00790
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a4
EXIF_LOG_CODE_DEBUG
,
"ExifData"
,
00791
"IFD 0 at %i."
, (
int
) offset);
00792
00793
/* Parse the actual exif data (usually offset 14 from start) */
00794
exif-data_8c.html#a24
exif_data_load_data_content
(data,
exif-ifd_8h.html#a7a0
EXIF_IFD_0
, d + 6, ds - 6, offset, 0);
00795
00796
/* IFD 1 offset */
00797
if
(offset + 6 + 2 > ds) {
00798
return
;
00799         }
00800         n =
exif-utils_8c.html#a2
exif_get_short
(d + 6 + offset, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
);
00801
if
(offset + 6 + 2 + 12 * n + 4 > ds) {
00802
return
;
00803         }
00804         offset =
exif-utils_8c.html#a7
exif_get_long
(d + 6 + offset + 2 + 12 * n, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
);
00805
if
(offset) {
00806
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a4
EXIF_LOG_CODE_DEBUG
,
"ExifData"
,
00807
"IFD 1 at %i."
, (
int
) offset);
00808
00809
/* Sanity check. */
00810
if
(offset > ds - 6) {
00811
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a6
EXIF_LOG_CODE_CORRUPT_DATA
,
00812
"ExifData"
,
"Bogus offset."
);
00813
return
;
00814                 }
00815
00816
exif-data_8c.html#a24
exif_data_load_data_content
(data,
exif-ifd_8h.html#a7a1
EXIF_IFD_1
, d + 6, ds - 6, offset, 0);
00817         }
00818
00819
/*
00820
* If we got an EXIF_TAG_MAKER_NOTE, try to interpret it. Some
00821
* cameras use pointers in the maker note tag that point to the
00822
* space between IFDs. Here is the only place where we have access
00823
* to that data.
00824
*/
00825
switch
(
exif-data_8c.html#a29
exif_data_get_type_maker_note
(data)) {
00826
case
exif-data_8c.html#a52a14
EXIF_DATA_TYPE_MAKER_NOTE_OLYMPUS
:
00827                 data->priv->md =
exif-mnote-data-olympus_8c.html#a13
exif_mnote_data_olympus_new
(data->priv->mem);
00828
break
;
00829
case
exif-data_8c.html#a52a15
EXIF_DATA_TYPE_MAKER_NOTE_PENTAX
:
00830                 data->priv->md =
exif-mnote-data-pentax_8c.html#a11
exif_mnote_data_pentax_new
(data->priv->mem);
00831
break
;
00832
case
exif-data_8c.html#a52a13
EXIF_DATA_TYPE_MAKER_NOTE_CANON
:
00833                 data->priv->md =
exif-mnote-data-canon_8c.html#a14
exif_mnote_data_canon_new
(data->priv->mem);
00834
break
;
00835
default
:
00836
break
;
00837         }
00838
00839
/*
00840
* If we are able to interpret the maker note, do so.
00841
*/
00842
if
(data->priv->md) {
00843
exif-mnote-data_8c.html#a14
exif_mnote_data_log
(data->priv->md, data->priv->log);
00844
exif-mnote-data-priv_8h.html#a3
exif_mnote_data_set_byte_order
(data->priv->md,
00845                                                 data->priv->order);
00846
exif-mnote-data-priv_8h.html#a4
exif_mnote_data_set_offset
(data->priv->md,
00847                                             data->priv->offset_mnote);
00848
exif-mnote-data_8c.html#a4
exif_mnote_data_load
(data->priv->md, d, ds);
00849         }
00850
00851
if
(data->priv->options &
exif-data_8h.html#a28a5
EXIF_DATA_OPTION_FOLLOW_SPECIFICATION
)
00852
exif-data_8c.html#a49
exif_data_fix
(data);
00853 }
00854
00855
void
exif-data_8h.html#a11
00856
exif-data_8c.html#a31
exif_data_save_data
(
struct__ExifData.html
ExifData
*data,
unsigned
char
**d,
unsigned
int
*ds)
00857 {
00858
if
(!data || !d || !ds)
00859
return
;
00860
00861
/* Header */
00862         *ds = 14;
00863         *d =
exif-data_8c.html#a16
exif_data_alloc
(data, *ds);
00864
if
(!*d)
return
;
00865         memcpy (*d,
exif-data_8c.html#a6
ExifHeader
, 6);
00866
00867
/* Order (offset 6) */
00868
if
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
==
exif-byte-order_8h.html#a3a1
EXIF_BYTE_ORDER_INTEL
) {
00869                 memcpy (*d + 6,
"II"
, 2);
00870         }
else
{
00871                 memcpy (*d + 6,
"MM"
, 2);
00872         }
00873
00874
/* Fixed value (2 bytes, offset 8) */
00875
exif-utils_8c.html#a4
exif_set_short
(*d + 8, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
, 0x002a);
00876
00877
/*
00878
* IFD 0 offset (4 bytes, offset 10).
00879
* We will start 8 bytes after the
00880
* EXIF header (2 bytes for order, another 2 for the test, and
00881
* 4 bytes for the IFD 0 offset make 8 bytes together).
00882
*/
00883
exif-utils_8c.html#a8
exif_set_long
(*d + 10, data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
, 8);
00884
00885
/* Now save IFD 0. IFD 1 will be saved automatically. */
00886
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a4
EXIF_LOG_CODE_DEBUG
,
"ExifData"
,
00887
"Saving IFDs..."
);
00888
exif-data_8c.html#a28
exif_data_save_data_content
(data, data->
struct__ExifData.html#o0
ifd
[
exif-ifd_8h.html#a7a0
EXIF_IFD_0
], d, ds,
00889                                      *ds - 6);
00890
exif-log_8c.html#a12
exif_log
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
,
exif-log_8h.html#a17a4
EXIF_LOG_CODE_DEBUG
,
"ExifData"
,
00891
"Saved %i byte(s) EXIF data."
, *ds);
00892 }
00893
00894
struct__ExifData.html
ExifData
*
exif-data_8h.html#a8
00895
exif-data_8c.html#a32
exif_data_new_from_file
(
const
char
*path)
00896 {
00897
struct__ExifData.html
ExifData
*edata;
00898
struct__ExifLoader.html
ExifLoader
*loader;
00899
00900         loader =
exif-loader_8c.html#a22
exif_loader_new
();
00901
exif-loader_8c.html#a19
exif_loader_write_file
(loader, path);
00902         edata =
exif-loader_8c.html#a28
exif_loader_get_data
(loader);
00903
exif-loader_8c.html#a26
exif_loader_unref
(loader);
00904
00905
return
(edata);
00906 }
00907
00908
void
exif-data_8h.html#a12
00909
exif-data_8c.html#a33
exif_data_ref
(
struct__ExifData.html
ExifData
*data)
00910 {
00911
if
(!data)
00912
return
;
00913
00914         data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o4
ref_count
++;
00915 }
00916
00917
void
exif-data_8h.html#a13
00918
exif-data_8c.html#a34
exif_data_unref
(
struct__ExifData.html
ExifData
*data)
00919 {
00920
if
(!data)
return
;
00921
00922         data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o4
ref_count
--;
00923
if
(!data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o4
ref_count
)
exif-data_8c.html#a35
exif_data_free
(data);
00924 }
00925
00926
void
exif-data_8h.html#a14
00927
exif-data_8c.html#a35
exif_data_free
(
struct__ExifData.html
ExifData
*data)
00928 {
00929
unsigned
int
i;
00930
struct__ExifMem.html
ExifMem
*mem = (data && data->
struct__ExifData.html#o3
priv
) ? data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o3
mem
: NULL;
00931
00932
if
(!data)
return
;
00933
00934
for
(i = 0; i <
exif-ifd_8h.html#a7a5
EXIF_IFD_COUNT
; i++) {
00935
if
(data->
struct__ExifData.html#o0
ifd
[i]) {
00936
exif-content_8c.html#a3
exif_content_unref
(data->
struct__ExifData.html#o0
ifd
[i]);
00937                         data->
struct__ExifData.html#o0
ifd
[i] = NULL;
00938                 }
00939         }
00940
00941
if
(data->
struct__ExifData.html#o1
data
) {
00942
exif-mem_8c.html#a6
exif_mem_free
(mem, data->
struct__ExifData.html#o1
data
);
00943                 data->
struct__ExifData.html#o1
data
= NULL;
00944         }
00945
00946
if
(data->
struct__ExifData.html#o3
priv
) {
00947
if
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
) {
00948
exif-log_8c.html#a9
exif_log_unref
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
);
00949                         data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
= NULL;
00950                 }
00951
if
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o1
md
) {
00952
exif-mnote-data_8c.html#a3
exif_mnote_data_unref
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o1
md
);
00953                         data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o1
md
= NULL;
00954                 }
00955
exif-mem_8c.html#a6
exif_mem_free
(mem, data->
struct__ExifData.html#o3
priv
);
00956
exif-mem_8c.html#a6
exif_mem_free
(mem, data);
00957         }
00958
00959
exif-mem_8c.html#a5
exif_mem_unref
(mem);
00960 }
00961
00962
void
exif-data_8h.html#a26
00963
exif-data_8c.html#a36
exif_data_dump
(
struct__ExifData.html
ExifData
*data)
00964 {
00965
unsigned
int
i;
00966
00967
if
(!data)
00968
return
;
00969
00970
for
(i = 0; i <
exif-ifd_8h.html#a7a5
EXIF_IFD_COUNT
; i++) {
00971
if
(data->
struct__ExifData.html#o0
ifd
[i] && data->
struct__ExifData.html#o0
ifd
[i]->
struct__ExifContent.html#o1
count
) {
00972                         printf (
"Dumping IFD '%s'...\n"
,
00973
exif-ifd_8c.html#a3
exif_ifd_get_name
(i));
00974
exif-content_8c.html#a5
exif_content_dump
(data->
struct__ExifData.html#o0
ifd
[i], 0);
00975                 }
00976         }
00977
00978
if
(data->
struct__ExifData.html#o1
data
) {
00979                 printf (
"%i byte(s) thumbnail data available."
, data->
struct__ExifData.html#o2
size
);
00980
if
(data->
struct__ExifData.html#o2
size
>= 4) {
00981                         printf (
"0x%02x 0x%02x ... 0x%02x 0x%02x\n"
,
00982                                 data->
struct__ExifData.html#o1
data
[0], data->
struct__ExifData.html#o1
data
[1],
00983                                 data->
struct__ExifData.html#o1
data
[data->
struct__ExifData.html#o2
size
- 2],
00984                                 data->
struct__ExifData.html#o1
data
[data->
struct__ExifData.html#o2
size
- 1]);
00985                 }
00986         }
00987 }
00988
00989
exif-byte-order_8h.html#a3
ExifByteOrder
exif-data_8h.html#a15
00990
exif-data_8c.html#a37
exif_data_get_byte_order
(
struct__ExifData.html
ExifData
*data)
00991 {
00992
if
(!data)
00993
return
(0);
00994
00995
return
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
);
00996 }
00997
00998
void
exif-data_8h.html#a19
00999
exif-data_8c.html#a38
exif_data_foreach_content
(
struct__ExifData.html
ExifData
*data,
exif-data_8h.html#a3
ExifDataForeachContentFunc
func,
01000
void
*user_data)
01001 {
01002
unsigned
int
i;
01003
01004
if
(!data || !func)
01005
return
;
01006
01007
for
(i = 0; i <
exif-ifd_8h.html#a7a5
EXIF_IFD_COUNT
; i++)
01008                 func (data->
struct__ExifData.html#o0
ifd
[i], user_data);
01009 }
01010
exif-data_8c.html#a7
01011
typedef
struct
struct__ByteOrderChangeData.html
_ByteOrderChangeData
ByteOrderChangeData;
struct__ByteOrderChangeData.html
01012
struct
struct__ByteOrderChangeData.html
_ByteOrderChangeData
{
struct__ByteOrderChangeData.html#o0
01013
exif-byte-order_8h.html#a3
ExifByteOrder
struct__ByteOrderChangeData.html#o0
old
,
new
;
01014 };
01015
01016
static
void
exif-data_8c.html#a39
01017
exif-data_8c.html#a39
entry_set_byte_order
(
struct__ExifEntry.html
ExifEntry
*e,
void
*data)
01018 {
01019         ByteOrderChangeData *d = data;
01020
01021
if
(!e)
01022
return
;
01023
01024
exif-utils_8c.html#a0
exif_array_set_byte_order
(e->
struct__ExifEntry.html#o1
format
, e->
struct__ExifEntry.html#o3
data
, e->
struct__ExifEntry.html#o2
components
, d->
struct__ByteOrderChangeData.html#o0
old
, d->
struct__ByteOrderChangeData.html#o1
new
);
01025 }
01026
01027
static
void
exif-data_8c.html#a40
01028
exif-data_8c.html#a40
content_set_byte_order
(
struct__ExifContent.html
ExifContent
*content,
void
*data)
01029 {
01030
exif-content_8c.html#a9
exif_content_foreach_entry
(content,
exif-data_8c.html#a39
entry_set_byte_order
, data);
01031 }
01032
01033
void
exif-data_8h.html#a16
01034
exif-data_8c.html#a41
exif_data_set_byte_order
(
struct__ExifData.html
ExifData
*data,
exif-byte-order_8h.html#a3
ExifByteOrder
order)
01035 {
01036         ByteOrderChangeData d;
01037
01038
if
(!data || (order == data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
))
01039
return
;
01040
01041         d.
struct__ByteOrderChangeData.html#o0
old
= data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
;
01042         d.
struct__ByteOrderChangeData.html#o1
new
= order;
01043
exif-data_8c.html#a38
exif_data_foreach_content
(data,
exif-data_8c.html#a40
content_set_byte_order
, &d);
01044         data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o0
order
= order;
01045
if
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o1
md
)
01046
exif-mnote-data-priv_8h.html#a3
exif_mnote_data_set_byte_order
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o1
md
, order);
01047 }
01048
01049
void
exif-data_8h.html#a27
01050
exif-data_8c.html#a42
exif_data_log
(
struct__ExifData.html
ExifData
*data,
struct__ExifLog.html
ExifLog
*log)
01051 {
01052
unsigned
int
i;
01053
01054
if
(!data || !data->
struct__ExifData.html#o3
priv
)
return
;
01055
exif-log_8c.html#a9
exif_log_unref
(data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
);
01056         data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
= log;
01057
exif-log_8c.html#a8
exif_log_ref
(log);
01058
01059
for
(i = 0; i <
exif-ifd_8h.html#a7a5
EXIF_IFD_COUNT
; i++)
01060
exif-content_8c.html#a10
exif_content_log
(data->
struct__ExifData.html#o0
ifd
[i], log);
01061 }
01062
01063
/* Used internally within libexif */
01064
struct__ExifLog.html
ExifLog
*
exif-data_8c.html#a43
exif_data_get_log
(
struct__ExifData.html
ExifData
*);
01065
struct__ExifLog.html
ExifLog
*
exif-data_8c.html#a43
01066
exif-data_8c.html#a43
exif_data_get_log
(
struct__ExifData.html
ExifData
*data)
01067 {
01068
if
(!data || !data->
struct__ExifData.html#o3
priv
)
return
NULL;
01069
return
data->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o2
log
;
01070 }
01071
01072
static
struct
{
exif-data_8c.html#a8
01073
exif-data_8h.html#a28
ExifDataOption
exif-data_8c.html#a8
option
;
exif-data_8c.html#a9
01074
const
char
*
mnote-canon-entry_8c.html#a6
name
;
exif-data_8c.html#a10
01075
const
char
*
mnote-canon-tag_8c.html#a3
description
;
01076 }
exif-data_8c.html#a11
exif_data_option
[] = {
01077         {
exif-data_8h.html#a28a4
EXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS
,
i18n_8h.html#a7
N_
(
"Ignore unknown tags"
),
01078
i18n_8h.html#a7
N_
(
"Ignore unknown tags when loading EXIF data."
)},
01079         {
exif-data_8h.html#a28a5
EXIF_DATA_OPTION_FOLLOW_SPECIFICATION
,
i18n_8h.html#a7
N_
(
"Follow specification"
),
01080
i18n_8h.html#a7
N_
(
"Add, correct and remove entries to get EXIF data that follows "
01081
"the specification."
)},
01082         {0, NULL, NULL}
01083 };
01084
01085
const
char
*
exif-data_8h.html#a20
01086
exif-data_8c.html#a44
exif_data_option_get_name
(
exif-data_8h.html#a28
ExifDataOption
o)
01087 {
01088
unsigned
int
i;
01089
01090
for
(i = 0;
exif-data_8c.html#a11
exif_data_option
[i].
mnote-canon-entry_8c.html#a6
name
; i++)
01091
if
(
exif-data_8c.html#a11
exif_data_option
[i].
exif-data_8c.html#a8
option
== o)
break
;
01092
return
i18n_8h.html#a6
_
(
exif-data_8c.html#a11
exif_data_option
[i].
mnote-canon-entry_8c.html#a6
name
);
01093 }
01094
01095
const
char
*
exif-data_8h.html#a21
01096
exif-data_8c.html#a45
exif_data_option_get_description
(
exif-data_8h.html#a28
ExifDataOption
o)
01097 {
01098
unsigned
int
i;
01099
01100
for
(i = 0;
exif-data_8c.html#a11
exif_data_option
[i].
mnote-canon-tag_8c.html#a3
description
; i++)
01101
if
(
exif-data_8c.html#a11
exif_data_option
[i].
exif-data_8c.html#a8
option
== o)
break
;
01102
return
i18n_8h.html#a6
_
(
exif-data_8c.html#a11
exif_data_option
[i].
mnote-canon-tag_8c.html#a3
description
);
01103 }
01104
01105
void
exif-data_8h.html#a22
01106
exif-data_8c.html#a46
exif_data_set_option
(
struct__ExifData.html
ExifData
*d,
exif-data_8h.html#a28
ExifDataOption
o)
01107 {
01108
if
(!d)
return
;
01109
01110         d->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o6
options
|= o;
01111 }
01112
01113
void
exif-data_8h.html#a23
01114
exif-data_8c.html#a47
exif_data_unset_option
(
struct__ExifData.html
ExifData
*d,
exif-data_8h.html#a28
ExifDataOption
o)
01115 {
01116
if
(!d)
return
;
01117
01118         d->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o6
options
&= ~o;
01119 }
01120
01121
static
void
exif-data_8c.html#a48
01122
exif-content_8c.html#a12
fix_func
(
struct__ExifContent.html
ExifContent
*c,
void
*data)
01123 {
01124
switch
(
exif-content_8c.html#a11
exif_content_get_ifd
(c)) {
01125
case
exif-ifd_8h.html#a7a1
EXIF_IFD_1
:
01126
if
(c->parent->data)
01127
exif-content_8c.html#a13
exif_content_fix
(c);
01128
else
{
01129
exif-log_8c.html#a12
exif_log
(c->parent->priv->log,
exif-log_8h.html#a17a4
EXIF_LOG_CODE_DEBUG
,
"exif-data"
,
01130
"No thumbnail but entries on thumbnail. These entries have been "
01131
"removed."
);
01132
while
(c->count)
01133
exif-content_8c.html#a7
exif_content_remove_entry
(c, c->entries[c->count - 1]);
01134                 }
01135
break
;
01136
default
:
01137
exif-content_8c.html#a13
exif_content_fix
(c);
01138         }
01139 }
01140
01141
void
exif-data_8h.html#a18
01142
exif-data_8c.html#a49
exif_data_fix
(
struct__ExifData.html
ExifData
*d)
01143 {
01144
exif-data_8c.html#a38
exif_data_foreach_content
(d,
exif-content_8c.html#a12
fix_func
, NULL);
01145 }
01146
01147
void
exif-data_8h.html#a24
01148
exif-data_8c.html#a50
exif_data_set_data_type
(
struct__ExifData.html
ExifData
*d,
exif-data-type_8h.html#a5
ExifDataType
dt)
01149 {
01150
if
(!d || !d->
struct__ExifData.html#o3
priv
)
return
;
01151
01152         d->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o7
data_type
= dt;
01153 }
01154
01155
exif-data-type_8h.html#a5
ExifDataType
exif-data_8h.html#a25
01156
exif-data_8c.html#a51
exif_data_get_data_type
(
struct__ExifData.html
ExifData
*d)
01157 {
01158
return
(d && d->
struct__ExifData.html#o3
priv
) ? d->
struct__ExifData.html#o3
priv
->
struct__ExifDataPrivate.html#o7
data_type
:
exif-data-type_8h.html#a5a4
EXIF_DATA_TYPE_COUNT
;
01159 }
Generated on Fri Sep 9 16:28:11 2005 for EXIF library (libexif) Internals by
http://www.doxygen.org/index.html
doxygen
1.4.4
