1/*! \file exif-data.h 2 * \brief Defines the ExifData type and the associated functions. 3 */ 4/* 5 * \author Lutz Mueller <lutz@users.sourceforge.net> 6 * \date 2001-2005 7 * 8 * This library is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Lesser General Public 10 * License as published by the Free Software Foundation; either 11 * version 2 of the License, or (at your option) any later version. 12 * 13 * This library is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Lesser General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public 19 * License along with this library; if not, write to the 20 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 21 * Boston, MA 02110-1301 USA. 22 */ 23 24#ifndef __EXIF_DATA_H__ 25#define __EXIF_DATA_H__ 26 27#ifdef __cplusplus 28extern "C" { 29#endif /* __cplusplus */ 30 31#include <libexif/exif-byte-order.h> 32#include <libexif/exif-data-type.h> 33#include <libexif/exif-ifd.h> 34#include <libexif/exif-log.h> 35#include <libexif/exif-tag.h> 36 37/*! Represents the entire EXIF data found in an image */ 38typedef struct _ExifData ExifData; 39typedef struct _ExifDataPrivate ExifDataPrivate; 40 41#include <libexif/exif-content.h> 42#include <libexif/exif-mnote-data.h> 43#include <libexif/exif-mem.h> 44 45/*! Represents the entire EXIF data found in an image */ 46struct _ExifData 47{ 48 /*! Data for each IFD */ 49 ExifContent *ifd[EXIF_IFD_COUNT]; 50 51 /*! Pointer to thumbnail image, or NULL if not available */ 52 unsigned char *data; 53 54 /*! Number of bytes in thumbnail image at \c data */ 55 unsigned int size; 56 57 ExifDataPrivate *priv; 58}; 59 60/*! Allocate a new #ExifData. The #ExifData contains an empty 61 * #ExifContent for each IFD and the default set of options, 62 * which has #EXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS 63 * and #EXIF_DATA_OPTION_FOLLOW_SPECIFICATION set. 64 * 65 * \return allocated #ExifData, or NULL on error 66 */ 67ExifData *exif_data_new (void); 68 69/*! Allocate a new #ExifData using the given memory allocator. 70 * The #ExifData contains an empty #ExifContent for each IFD and the default 71 * set of options, which has #EXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS and 72 * #EXIF_DATA_OPTION_FOLLOW_SPECIFICATION set. 73 * 74 * \return allocated #ExifData, or NULL on error 75 */ 76ExifData *exif_data_new_mem (ExifMem *); 77 78/*! Allocate a new #ExifData and load EXIF data from a JPEG file. 79 * Uses an #ExifLoader internally to do the loading. 80 * 81 * \param[in] path filename including path 82 * \return allocated #ExifData, or NULL on error 83 */ 84ExifData *exif_data_new_from_file (const char *path); 85 86/*! Allocate a new #ExifData and load EXIF data from a memory buffer. 87 * 88 * \param[in] data pointer to raw JPEG or EXIF data 89 * \param[in] size number of bytes of data at data 90 * \return allocated #ExifData, or NULL on error 91 */ 92ExifData *exif_data_new_from_data (const unsigned char *data, 93 unsigned int size); 94 95/*! Load the #ExifData structure from the raw JPEG or EXIF data in the given 96 * memory buffer. If the EXIF data contains a recognized MakerNote, it is 97 * loaded and stored as well for later retrieval by #exif_data_get_mnote_data. 98 * If the EXIF_DATA_OPTION_FOLLOW_SPECIFICATION has been set on this #ExifData, 99 * then the tags are fixed after loading. 100 * 101 * \param[in,out] data EXIF data 102 * \param[in] d pointer to raw JPEG or EXIF data 103 * \param[in] size number of bytes of data at d 104 */ 105void exif_data_load_data (ExifData *data, const unsigned char *d, 106 unsigned int size); 107 108/*! Store raw EXIF data representing the #ExifData structure into a memory 109 * buffer. The buffer is allocated by this function and must subsequently be 110 * freed by the caller. 111 * 112 * \param[in] data EXIF data 113 * \param[out] d pointer to buffer pointer containing raw EXIF data on return 114 * \param[out] ds pointer to variable to hold the number of bytes of 115 * data at d, or set to 0 on error 116 */ 117void exif_data_save_data (ExifData *data, unsigned char **d, 118 unsigned int *ds); 119 120void exif_data_ref (ExifData *data); 121void exif_data_unref (ExifData *data); 122void exif_data_free (ExifData *data); 123 124/*! Return the byte order in use by this EXIF structure. 125 * 126 * \param[in] data EXIF data 127 * \return byte order 128 */ 129ExifByteOrder exif_data_get_byte_order (ExifData *data); 130 131/*! Set the byte order to use for this EXIF data. If any tags already exist 132 * (including MakerNote tags) they are are converted to the specified byte 133 * order. 134 * 135 * \param[in,out] data EXIF data 136 * \param[in] order byte order 137 */ 138void exif_data_set_byte_order (ExifData *data, ExifByteOrder order); 139 140/*! Return the MakerNote data out of the EXIF data. Only certain 141 * MakerNote formats that are recognized by libexif are supported. 142 * The pointer references a member of the #ExifData structure and must NOT be 143 * freed by the caller. 144 * 145 * \param[in] d EXIF data 146 * \return MakerNote data, or NULL if not found or not supported 147 */ 148ExifMnoteData *exif_data_get_mnote_data (ExifData *d); 149 150/*! Fix the EXIF data to bring it into specification. Call #exif_content_fix 151 * on each IFD to fix existing entries, create any new entries that are 152 * mandatory but do not yet exist, and remove any entries that are not 153 * allowed. 154 * 155 * \param[in,out] d EXIF data 156 */ 157void exif_data_fix (ExifData *d); 158 159typedef void (* ExifDataForeachContentFunc) (ExifContent *, void *user_data); 160 161/*! Execute a function on each IFD in turn. 162 * 163 * \param[in] data EXIF data over which to iterate 164 * \param[in] func function to call for each entry 165 * \param[in] user_data data to pass into func on each call 166 */ 167void exif_data_foreach_content (ExifData *data, 168 ExifDataForeachContentFunc func, 169 void *user_data); 170 171/*! Options to configure the behaviour of #ExifData */ 172typedef enum { 173 /*! Act as though unknown tags are not present */ 174 EXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS = 1 << 0, 175 176 /*! Fix the EXIF tags to follow the spec */ 177 EXIF_DATA_OPTION_FOLLOW_SPECIFICATION = 1 << 1, 178 179 /*! Leave the MakerNote alone, which could cause it to be corrupted */ 180 EXIF_DATA_OPTION_DONT_CHANGE_MAKER_NOTE = 1 << 2 181} ExifDataOption; 182 183/*! Return a short textual description of the given #ExifDataOption. 184 * 185 * \param[in] o option 186 * \return localized textual description of the option 187 */ 188const char *exif_data_option_get_name (ExifDataOption o); 189 190/*! Return a verbose textual description of the given #ExifDataOption. 191 * 192 * \param[in] o option 193 * \return verbose localized textual description of the option 194 */ 195const char *exif_data_option_get_description (ExifDataOption o); 196 197/*! Set the given option on the given #ExifData. 198 * 199 * \param[in] d EXIF data 200 * \param[in] o option 201 */ 202void exif_data_set_option (ExifData *d, ExifDataOption o); 203 204/*! Clear the given option on the given #ExifData. 205 * 206 * \param[in] d EXIF data 207 * \param[in] o option 208 */ 209void exif_data_unset_option (ExifData *d, ExifDataOption o); 210 211/*! Set the data type for the given #ExifData. 212 * 213 * \param[in] d EXIF data 214 * \param[in] dt data type 215 */ 216void exif_data_set_data_type (ExifData *d, ExifDataType dt); 217 218/*! Return the data type for the given #ExifData. 219 * 220 * \param[in] d EXIF data 221 * \return data type, or #EXIF_DATA_TYPE_UNKNOWN on error 222 */ 223ExifDataType exif_data_get_data_type (ExifData *d); 224 225/*! Dump all EXIF data to stdout. 226 * This is intended for diagnostic purposes only. 227 * 228 * \param[in] data EXIF data 229 */ 230void exif_data_dump (ExifData *data); 231 232/*! Set the log message object for all IFDs. 233 * 234 * \param[in] data EXIF data 235 * \param[in] log #ExifLog 236 */ 237void exif_data_log (ExifData *data, ExifLog *log); 238 239/*! Return an #ExifEntry for the given tag if found in any IFD. 240 * Each IFD is searched in turn and the first containing a tag with 241 * this number is returned. 242 * 243 * \param[in] d #ExifData 244 * \param[in] t #ExifTag 245 * \return #ExifEntry* if found, else NULL if not found 246 */ 247#define exif_data_get_entry(d,t) \ 248 (exif_content_get_entry(d->ifd[EXIF_IFD_0],t) ? \ 249 exif_content_get_entry(d->ifd[EXIF_IFD_0],t) : \ 250 exif_content_get_entry(d->ifd[EXIF_IFD_1],t) ? \ 251 exif_content_get_entry(d->ifd[EXIF_IFD_1],t) : \ 252 exif_content_get_entry(d->ifd[EXIF_IFD_EXIF],t) ? \ 253 exif_content_get_entry(d->ifd[EXIF_IFD_EXIF],t) : \ 254 exif_content_get_entry(d->ifd[EXIF_IFD_GPS],t) ? \ 255 exif_content_get_entry(d->ifd[EXIF_IFD_GPS],t) : \ 256 exif_content_get_entry(d->ifd[EXIF_IFD_INTEROPERABILITY],t) ? \ 257 exif_content_get_entry(d->ifd[EXIF_IFD_INTEROPERABILITY],t) : NULL) 258 259#ifdef __cplusplus 260} 261#endif /* __cplusplus */ 262 263#endif /* __EXIF_DATA_H__ */ 264