189 lines
6.2 KiB
C
189 lines
6.2 KiB
C
|
/*! \file exif-entry.h
|
||
|
* \brief Handling EXIF entries
|
||
|
*/
|
||
|
/*
|
||
|
* Copyright (c) 2001 Lutz Mueller <lutz@users.sourceforge.net>
|
||
|
*
|
||
|
* This library is free software; you can redistribute it and/or
|
||
|
* modify it under the terms of the GNU Lesser General Public
|
||
|
* License as published by the Free Software Foundation; either
|
||
|
* version 2 of the License, or (at your option) any later version.
|
||
|
*
|
||
|
* This library is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
|
* Lesser General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU Lesser General Public
|
||
|
* License along with this library; if not, write to the
|
||
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||
|
* Boston, MA 02110-1301 USA.
|
||
|
*/
|
||
|
|
||
|
#ifndef __EXIF_ENTRY_H__
|
||
|
#define __EXIF_ENTRY_H__
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif /* __cplusplus */
|
||
|
|
||
|
/*! Data found in one EXIF tag.
|
||
|
* The #exif_entry_get_value function can provide access to the
|
||
|
* formatted contents, or the struct members can be used directly to
|
||
|
* access the raw contents.
|
||
|
*/
|
||
|
typedef struct _ExifEntry ExifEntry;
|
||
|
typedef struct _ExifEntryPrivate ExifEntryPrivate;
|
||
|
|
||
|
#include <libexif/exif-content.h>
|
||
|
#include <libexif/exif-format.h>
|
||
|
#include <libexif/exif-utils.h>
|
||
|
#include <libexif/exif-mem.h>
|
||
|
|
||
|
/*! Data found in one EXIF tag */
|
||
|
struct _ExifEntry {
|
||
|
/*! EXIF tag for this entry */
|
||
|
/* ExifTag had been changed to ExifShort to enable writing of the GPS related tags.
|
||
|
2011.03.01 - Samsung Electronics */
|
||
|
ExifShort tag;
|
||
|
|
||
|
/*! Type of data in this entry */
|
||
|
ExifFormat format;
|
||
|
|
||
|
/*! Number of elements in the array, if this is an array entry.
|
||
|
* Contains 1 for non-array data types. */
|
||
|
unsigned long components;
|
||
|
|
||
|
/*! Pointer to the raw EXIF data for this entry. It is allocated
|
||
|
* by #exif_entry_initialize and is NULL beforehand. Data contained
|
||
|
* here may be manipulated using the functions in exif-utils.h */
|
||
|
unsigned char *data;
|
||
|
|
||
|
/*! Number of bytes in the buffer at \c data. This must be no less
|
||
|
* than exif_format_get_size(format)*components */
|
||
|
unsigned int size;
|
||
|
|
||
|
/*! #ExifContent containing this entry.
|
||
|
* \see exif_entry_get_ifd */
|
||
|
ExifContent *parent;
|
||
|
|
||
|
/*! Internal data to be used by libexif itself */
|
||
|
ExifEntryPrivate *priv;
|
||
|
};
|
||
|
|
||
|
/* Lifecycle */
|
||
|
|
||
|
/*! Reserve memory for and initialize a new #ExifEntry.
|
||
|
* No memory is allocated for the \c data element of the returned #ExifEntry.
|
||
|
*
|
||
|
* \return new allocated #ExifEntry, or NULL on error
|
||
|
*
|
||
|
* \see exif_entry_new_mem, exif_entry_unref
|
||
|
*/
|
||
|
ExifEntry *exif_entry_new (void);
|
||
|
|
||
|
/*! Reserve memory for and initialize new #ExifEntry using the specified
|
||
|
* memory allocator.
|
||
|
* No memory is allocated for the \c data element of the returned #ExifEntry.
|
||
|
*
|
||
|
* \return new allocated #ExifEntry, or NULL on error
|
||
|
*
|
||
|
* \see exif_entry_new, exif_entry_unref
|
||
|
*/
|
||
|
ExifEntry *exif_entry_new_mem (ExifMem *);
|
||
|
|
||
|
/*! Increase reference counter for #ExifEntry.
|
||
|
*
|
||
|
* \param[in] entry #ExifEntry
|
||
|
*
|
||
|
* \see exif_entry_unref
|
||
|
*/
|
||
|
void exif_entry_ref (ExifEntry *entry);
|
||
|
|
||
|
/*! Decrease reference counter for #ExifEntry.
|
||
|
* When the reference count drops to zero, free the entry.
|
||
|
*
|
||
|
* \param[in] entry #ExifEntry
|
||
|
*/
|
||
|
void exif_entry_unref (ExifEntry *entry);
|
||
|
|
||
|
/*! Actually free the #ExifEntry.
|
||
|
*
|
||
|
* \deprecated Should not be called directly. Use #exif_entry_ref and
|
||
|
* #exif_entry_unref instead.
|
||
|
*
|
||
|
* \param[in] entry EXIF entry
|
||
|
*/
|
||
|
void exif_entry_free (ExifEntry *entry);
|
||
|
|
||
|
/*! Initialize an empty #ExifEntry with default data in the correct format
|
||
|
* for the given tag. If the entry is already initialized, this function
|
||
|
* does nothing.
|
||
|
* This call allocates memory for the \c data element of the given #ExifEntry.
|
||
|
* That memory is freed at the same time as the #ExifEntry.
|
||
|
*
|
||
|
* \param[out] e entry to initialize
|
||
|
* \param[in] tag tag number to initialize as
|
||
|
*/
|
||
|
void exif_entry_initialize (ExifEntry *e, ExifTag tag);
|
||
|
|
||
|
/*! Fix the type or format of the given EXIF entry to bring it into spec.
|
||
|
* If the data for this EXIF tag is in of the wrong type or is in an invalid
|
||
|
* format according to the EXIF specification, then it is converted to make it
|
||
|
* valid. This may involve, for example, converting an EXIF_FORMAT_LONG into a
|
||
|
* EXIF_FORMAT_SHORT. If the tag is unknown, its value is untouched.
|
||
|
*
|
||
|
* \note Unfortunately, some conversions are to a type with a more restricted
|
||
|
* range, which could have the side effect that the converted data becomes
|
||
|
* invalid. This is unlikely as the range of each tag in the standard is
|
||
|
* designed to encompass all likely data.
|
||
|
*
|
||
|
* \param[in,out] entry EXIF entry
|
||
|
*/
|
||
|
void exif_entry_fix (ExifEntry *entry);
|
||
|
|
||
|
|
||
|
/* For your convenience */
|
||
|
|
||
|
/*! Return a localized textual representation of the value of the EXIF entry.
|
||
|
* This is meant for display to the user. The format of each tag is subject
|
||
|
* to change between locales and in newer versions of libexif. Users who
|
||
|
* require the tag data in an unambiguous form should access the data members
|
||
|
* of the #ExifEntry structure directly.
|
||
|
*
|
||
|
* \warning The character set of the returned string may be in
|
||
|
* the encoding of the current locale or the native encoding
|
||
|
* of the camera.
|
||
|
* \bug The EXIF_TAG_XP_* tags are currently always returned in UTF-8,
|
||
|
* regardless of locale, and code points above U+FFFF are not
|
||
|
* supported.
|
||
|
*
|
||
|
* \param[in] entry EXIF entry
|
||
|
* \param[out] val buffer in which to store value
|
||
|
* \param[in] maxlen length of the buffer val
|
||
|
* \return val pointer
|
||
|
*/
|
||
|
const char *exif_entry_get_value (ExifEntry *entry, char *val,
|
||
|
unsigned int maxlen);
|
||
|
|
||
|
/*! Dump text representation of #ExifEntry to stdout.
|
||
|
* This is intended for diagnostic purposes only.
|
||
|
*
|
||
|
* \param[in] entry EXIF tag data
|
||
|
* \param[in] indent how many levels deep to indent the data
|
||
|
*/
|
||
|
void exif_entry_dump (ExifEntry *entry, unsigned int indent);
|
||
|
|
||
|
/*! Return the IFD number of the given #ExifEntry
|
||
|
*
|
||
|
* \param[in] e an #ExifEntry*
|
||
|
* \return #ExifIfd, or #EXIF_IFD_COUNT on error
|
||
|
*/
|
||
|
#define exif_entry_get_ifd(e) ((e)?exif_content_get_ifd((e)->parent):EXIF_IFD_COUNT)
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif /* __cplusplus */
|
||
|
|
||
|
#endif /* __EXIF_ENTRY_H__ */
|