1548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! \file exif-data.h 2548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \brief Defines the ExifData type and the associated functions. 3548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 4548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/* 5548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \author Lutz Mueller <lutz@users.sourceforge.net> 6548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \date 2001-2005 7548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 8548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * This library is free software; you can redistribute it and/or 9548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * modify it under the terms of the GNU Lesser General Public 10548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * License as published by the Free Software Foundation; either 11548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * version 2 of the License, or (at your option) any later version. 12548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 13548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * This library is distributed in the hope that it will be useful, 14548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * but WITHOUT ANY WARRANTY; without even the implied warranty of 15548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * Lesser General Public License for more details. 17548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 18548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * You should have received a copy of the GNU Lesser General Public 19548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * License along with this library; if not, write to the 20548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 21548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * Boston, MA 02110-1301 USA. 22548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 23548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 24548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#ifndef __EXIF_DATA_H__ 25548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#define __EXIF_DATA_H__ 26548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 27548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#ifdef __cplusplus 28548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenextern "C" { 29548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#endif /* __cplusplus */ 30548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 31548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libexif/exif-byte-order.h> 32548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libexif/exif-data-type.h> 33548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libexif/exif-ifd.h> 34548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libexif/exif-log.h> 35548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libexif/exif-tag.h> 36548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 37548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Represents the entire EXIF data found in an image */ 38548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissentypedef struct _ExifData ExifData; 39548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissentypedef struct _ExifDataPrivate ExifDataPrivate; 40548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 41548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libexif/exif-content.h> 42548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libexif/exif-mnote-data.h> 43548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libexif/exif-mem.h> 44548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 45548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Represents the entire EXIF data found in an image */ 46548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenstruct _ExifData 47548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen{ 48548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /*! Data for each IFD */ 49548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ExifContent *ifd[EXIF_IFD_COUNT]; 50548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 51548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /*! Pointer to thumbnail image, or NULL if not available */ 52548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen unsigned char *data; 53548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 54548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /*! Number of bytes in thumbnail image at \c data */ 55548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen unsigned int size; 56548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 57548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ExifDataPrivate *priv; 58548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen}; 59548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 60548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Allocate a new #ExifData. The #ExifData contains an empty 61548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * #ExifContent for each IFD and the default set of options, 62548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * which has #EXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS 63548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * and #EXIF_DATA_OPTION_FOLLOW_SPECIFICATION set. 64548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 65548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \return allocated #ExifData, or NULL on error 66548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 67548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenExifData *exif_data_new (void); 68548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 69548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Allocate a new #ExifData using the given memory allocator. 70548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * The #ExifData contains an empty #ExifContent for each IFD and the default 71548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * set of options, which has #EXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS and 72548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * #EXIF_DATA_OPTION_FOLLOW_SPECIFICATION set. 73548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 74548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \return allocated #ExifData, or NULL on error 75548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 76548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenExifData *exif_data_new_mem (ExifMem *); 77548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 78548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Allocate a new #ExifData and load EXIF data from a JPEG file. 79548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * Uses an #ExifLoader internally to do the loading. 80548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 81548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] path filename including path 82548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \return allocated #ExifData, or NULL on error 83548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 84548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenExifData *exif_data_new_from_file (const char *path); 85548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 86548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Allocate a new #ExifData and load EXIF data from a memory buffer. 87548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 88548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] data pointer to raw JPEG or EXIF data 89548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] size number of bytes of data at data 90548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \return allocated #ExifData, or NULL on error 91548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 92548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenExifData *exif_data_new_from_data (const unsigned char *data, 93548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen unsigned int size); 94548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 95548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Load the #ExifData structure from the raw JPEG or EXIF data in the given 96548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * memory buffer. If the EXIF data contains a recognized MakerNote, it is 97548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * loaded and stored as well for later retrieval by #exif_data_get_mnote_data. 98548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * If the #EXIF_DATA_OPTION_FOLLOW_SPECIFICATION option has been set on this 99548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * #ExifData, then the tags are automatically fixed after loading (by calling 100548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * #exif_data_fix). 101548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 102548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in,out] data EXIF data 103548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] d pointer to raw JPEG or EXIF data 104548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] size number of bytes of data at d 105548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 106548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid exif_data_load_data (ExifData *data, const unsigned char *d, 107548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen unsigned int size); 108548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 109548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Store raw EXIF data representing the #ExifData structure into a memory 110548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * buffer. The buffer is allocated by this function and must subsequently be 111548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * freed by the caller using the matching free function as used by the #ExifMem 112548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * in use by this #ExifData. 113548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 114548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] data EXIF data 115548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[out] d pointer to buffer pointer containing raw EXIF data on return 116548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[out] ds pointer to variable to hold the number of bytes of 117548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * data at d, or set to 0 on error 118548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 119548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid exif_data_save_data (ExifData *data, unsigned char **d, 120548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen unsigned int *ds); 121548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 122548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid exif_data_ref (ExifData *data); 123548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid exif_data_unref (ExifData *data); 124548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid exif_data_free (ExifData *data); 125548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 126548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Return the byte order in use by this EXIF structure. 127548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 128548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] data EXIF data 129548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \return byte order 130548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 131548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenExifByteOrder exif_data_get_byte_order (ExifData *data); 132548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 133548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Set the byte order to use for this EXIF data. If any tags already exist 134548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * (including MakerNote tags) they are are converted to the specified byte 135548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * order. 136548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 137548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in,out] data EXIF data 138548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] order byte order 139548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 140548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid exif_data_set_byte_order (ExifData *data, ExifByteOrder order); 141548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 142548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Return the MakerNote data out of the EXIF data. Only certain 143548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * MakerNote formats that are recognized by libexif are supported. 144548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * The pointer references a member of the #ExifData structure and must NOT be 145548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * freed by the caller. 146548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 147548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] d EXIF data 148548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \return MakerNote data, or NULL if not found or not supported 149548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 150548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenExifMnoteData *exif_data_get_mnote_data (ExifData *d); 151548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 152548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Fix the EXIF data to bring it into specification. Call #exif_content_fix 153548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * on each IFD to fix existing entries, create any new entries that are 154548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * mandatory but do not yet exist, and remove any entries that are not 155548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * allowed. 156548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 157548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in,out] d EXIF data 158548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 159548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid exif_data_fix (ExifData *d); 160548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 161548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissentypedef void (* ExifDataForeachContentFunc) (ExifContent *, void *user_data); 162548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 163548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Execute a function on each IFD in turn. 164548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 165548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] data EXIF data over which to iterate 166548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] func function to call for each entry 167548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] user_data data to pass into func on each call 168548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 169548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid exif_data_foreach_content (ExifData *data, 170548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ExifDataForeachContentFunc func, 171548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen void *user_data); 172548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 173548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Options to configure the behaviour of #ExifData */ 174548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissentypedef enum { 175548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /*! Act as though unknown tags are not present */ 176548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen EXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS = 1 << 0, 177548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 178548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /*! Fix the EXIF tags to follow the spec */ 179548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen EXIF_DATA_OPTION_FOLLOW_SPECIFICATION = 1 << 1, 180548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 181548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /*! Leave the MakerNote alone, which could cause it to be corrupted */ 182548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen EXIF_DATA_OPTION_DONT_CHANGE_MAKER_NOTE = 1 << 2 183548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen} ExifDataOption; 184548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 185548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Return a short textual description of the given #ExifDataOption. 186548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 187548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] o option 188548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \return localized textual description of the option 189548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 190548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenconst char *exif_data_option_get_name (ExifDataOption o); 191548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 192548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Return a verbose textual description of the given #ExifDataOption. 193548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 194548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] o option 195548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \return verbose localized textual description of the option 196548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 197548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenconst char *exif_data_option_get_description (ExifDataOption o); 198548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 199548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Set the given option on the given #ExifData. 200548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 201548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] d EXIF data 202548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] o option 203548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 204548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid exif_data_set_option (ExifData *d, ExifDataOption o); 205548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 206548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Clear the given option on the given #ExifData. 207548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 208548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] d EXIF data 209548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] o option 210548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 211548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid exif_data_unset_option (ExifData *d, ExifDataOption o); 212548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 213548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Set the data type for the given #ExifData. 214548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 215548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] d EXIF data 216548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] dt data type 217548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 218548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid exif_data_set_data_type (ExifData *d, ExifDataType dt); 219548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 220548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Return the data type for the given #ExifData. 221548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 222548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] d EXIF data 223548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \return data type, or #EXIF_DATA_TYPE_UNKNOWN on error 224548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 225548dde4863e9a2315e3f327efe63ff55949addb8Marco NelissenExifDataType exif_data_get_data_type (ExifData *d); 226548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 227548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Dump all EXIF data to stdout. 228548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * This is intended for diagnostic purposes only. 229548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 230548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] data EXIF data 231548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 232548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid exif_data_dump (ExifData *data); 233548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 234548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Set the log message object for all IFDs. 235548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 236548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] data EXIF data 237548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] log #ExifLog 238548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 239548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenvoid exif_data_log (ExifData *data, ExifLog *log); 240548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 241548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*! Return an #ExifEntry for the given tag if found in any IFD. 242548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * Each IFD is searched in turn and the first containing a tag with 243548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * this number is returned. 244548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 245548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] d #ExifData 246548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \param[in] t #ExifTag 247548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * \return #ExifEntry* if found, else NULL if not found 248548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 249548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#define exif_data_get_entry(d,t) \ 250548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen (exif_content_get_entry(d->ifd[EXIF_IFD_0],t) ? \ 251548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_content_get_entry(d->ifd[EXIF_IFD_0],t) : \ 252548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_content_get_entry(d->ifd[EXIF_IFD_1],t) ? \ 253548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_content_get_entry(d->ifd[EXIF_IFD_1],t) : \ 254548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_content_get_entry(d->ifd[EXIF_IFD_EXIF],t) ? \ 255548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_content_get_entry(d->ifd[EXIF_IFD_EXIF],t) : \ 256548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_content_get_entry(d->ifd[EXIF_IFD_GPS],t) ? \ 257548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_content_get_entry(d->ifd[EXIF_IFD_GPS],t) : \ 258548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_content_get_entry(d->ifd[EXIF_IFD_INTEROPERABILITY],t) ? \ 259548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_content_get_entry(d->ifd[EXIF_IFD_INTEROPERABILITY],t) : NULL) 260548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 261548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#ifdef __cplusplus 262548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen} 263548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#endif /* __cplusplus */ 264548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 265548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#endif /* __EXIF_DATA_H__ */ 266