FFmpeg
exif.h
Go to the documentation of this file.
1 /*
2  * EXIF metadata parser
3  * Copyright (c) 2013 Thilo Borgmann <thilo.borgmann _at_ mail.de>
4  * Copyright (c) 2024-2025 Leo Izen <leo.izen@gmail.com>
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg 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.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg 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 FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 /**
24  * @file
25  * EXIF metadata parser
26  * @author Thilo Borgmann <thilo.borgmann _at_ mail.de>
27  * @author Leo Izen <leo.izen@gmail.com>
28  */
29 
30 #ifndef AVCODEC_EXIF_H
31 #define AVCODEC_EXIF_H
32 
33 #include <stddef.h>
34 #include <stdint.h>
35 
36 #include "libavutil/buffer.h"
37 #include "libavutil/dict.h"
38 #include "libavutil/rational.h"
39 #include "version_major.h"
40 
41 /** Data type identifiers for TIFF tags */
56 };
57 
59  /**
60  * The TIFF header starts with 0x49492a00, or 0x4d4d002a.
61  * This one is used internally by FFmpeg.
62  */
64  /** skip the TIFF header, assume little endian */
66  /** skip the TIFF header, assume big endian */
68  /** The first four bytes point to the actual start, then it's AV_EXIF_TIFF_HEADER */
70  /** The first six bytes contain "Exif\0\0", then it's AV_EXIF_TIFF_HEADER */
72 };
73 
74 typedef struct AVExifEntry AVExifEntry;
75 
76 typedef struct AVExifMetadata {
77  /* array of EXIF metadata entries */
79  /* number of entries in this array */
80  unsigned int count;
81  /* size of the buffer, used for av_fast_realloc */
82  unsigned int size;
84 
85 struct AVExifEntry {
86  uint16_t id;
88  uint32_t count;
89 
90  /*
91  * These are for IFD-style MakerNote
92  * entries which occur after a fixed
93  * offset rather than at the start of
94  * the entry. The ifd_lead field contains
95  * the leading bytes which typically
96  * identify the type of MakerNote.
97  */
98  uint32_t ifd_offset;
99  uint8_t *ifd_lead;
100 
101  /*
102  * An array of entries of size count
103  * Unless it's an IFD, in which case
104  * it's not an array and count = 1
105  */
106  union {
107  void *ptr;
109  uint64_t *uint;
110  double *dbl;
111  char *str;
112  uint8_t *ubytes;
113  int8_t *sbytes;
116  } value;
117 };
118 
119 /**
120  * Retrieves the tag name associated with the provided tag ID.
121  * If the tag ID is unknown, NULL is returned.
122  *
123  * For example, av_exif_get_tag_name(0x112) returns "Orientation".
124  */
125 const char *av_exif_get_tag_name(uint16_t id);
126 
127 /**
128  * Retrieves the tag ID associated with the provided tag string name.
129  * If the tag name is unknown, a negative number is returned. Otherwise
130  * it always fits inside a uint16_t integer.
131  *
132  * For example, av_exif_get_tag_id("Orientation") returns 274 (0x0112).
133  */
134 int32_t av_exif_get_tag_id(const char *name);
135 
136 /**
137  * Add an entry to the provided EXIF metadata struct. If one already exists with the provided
138  * ID, it will set the existing one to have the other information provided. Otherwise, it
139  * will allocate a new entry.
140  *
141  * This function reallocates ifd->entries using av_realloc and allocates (using av_malloc)
142  * a new value member of the entry, then copies the contents of value into that buffer.
143  */
144 int av_exif_set_entry(void *logctx, AVExifMetadata *ifd, uint16_t id, enum AVTiffDataType type,
145  uint32_t count, const uint8_t *ifd_lead, uint32_t ifd_offset, const void *value);
146 
147 /**
148  * Also check subdirectories.
149  */
150 #define AV_EXIF_FLAG_RECURSIVE (1 << 0)
151 
152 /**
153  * Get an entry with the tagged ID from the EXIF metadata struct. A pointer to the entry
154  * will be written into *value.
155  *
156  * If the entry was present and returned successfully, a positive number is returned.
157  * If the entry was not found, *value is left untouched and zero is returned.
158  * If an error occurred, a negative number is returned.
159  */
160 int av_exif_get_entry(void *logctx, AVExifMetadata *ifd, uint16_t id, int flags, AVExifEntry **value);
161 
162 /**
163  * Remove an entry from the provided EXIF metadata struct.
164  *
165  * If the entry was present and removed successfully, a positive number is returned.
166  * If the entry was not found, zero is returned.
167  * If an error occurred, a negative number is returned.
168  */
169 int av_exif_remove_entry(void *logctx, AVExifMetadata *ifd, uint16_t id, int flags);
170 
171 /**
172  * Decodes the EXIF data provided in the buffer and writes it into the
173  * struct *ifd. If this function succeeds, the IFD is owned by the caller
174  * and must be cleared after use by calling av_exif_free(); If this function
175  * fails and returns a negative value, it will call av_exif_free(ifd) before
176  * returning.
177  */
178 int av_exif_parse_buffer(void *logctx, const uint8_t *data, size_t size,
179  AVExifMetadata *ifd, enum AVExifHeaderMode header_mode);
180 
181 /**
182  * Allocates a buffer using av_malloc of an appropriate size and writes the
183  * EXIF data represented by ifd into that buffer.
184  *
185  * Upon error, *buffer will be NULL. The buffer becomes owned by the caller upon
186  * success. The *buffer argument must be NULL before calling.
187  */
188 int av_exif_write(void *logctx, const AVExifMetadata *ifd, AVBufferRef **buffer, enum AVExifHeaderMode header_mode);
189 
190 /**
191  * Frees all resources associated with the given EXIF metadata struct.
192  * Does not free the pointer passed itself, in case it is stack-allocated.
193  * The pointer passed to this function must be freed by the caller,
194  * if it is heap-allocated. Passing NULL is permitted.
195  */
196 void av_exif_free(AVExifMetadata *ifd);
197 
198 /**
199  * Recursively reads all tags from the IFD and stores them in the
200  * provided metadata dictionary.
201  */
202 int av_exif_ifd_to_dict(void *logctx, const AVExifMetadata *ifd, AVDictionary **metadata);
203 
204 /**
205  * Allocates a duplicate of the provided EXIF metadata struct. The caller owns
206  * the duplicate and must free it with av_exif_free. Returns NULL if the duplication
207  * process failed.
208  */
210 
211 /**
212  * Convert a display matrix used by AV_FRAME_DATA_DISPLAYMATRIX
213  * into an orientation constant used by EXIF's orientation tag.
214  *
215  * Returns an EXIF orientation between 1 and 8 (inclusive) depending
216  * on the rotation and flip factors. Returns 0 if the matrix is singular.
217  */
219 
220 /**
221  * Convert an orientation constant used by EXIF's orientation tag
222  * into a display matrix used by AV_FRAME_DATA_DISPLAYMATRIX.
223  *
224  * Returns 0 on success and negative if the orientation is invalid,
225  * i.e. not between 1 and 8 (inclusive).
226  */
227 int av_exif_orientation_to_matrix(int32_t *matrix, int orientation);
228 
229 #endif /* AVCODEC_EXIF_H */
flags
const SwsFlags flags[]
Definition: swscale.c:61
AV_EXIF_T_OFF
@ AV_EXIF_T_OFF
The first four bytes point to the actual start, then it's AV_EXIF_TIFF_HEADER.
Definition: exif.h:69
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
av_exif_get_entry
int av_exif_get_entry(void *logctx, AVExifMetadata *ifd, uint16_t id, int flags, AVExifEntry **value)
Get an entry with the tagged ID from the EXIF metadata struct.
Definition: exif.c:1049
av_exif_get_tag_name
const char * av_exif_get_tag_name(uint16_t id)
Retrieves the tag name associated with the provided tag ID.
Definition: exif.c:215
AVExifEntry
Definition: exif.h:85
AVExifMetadata
Definition: exif.h:76
AVExifEntry::sbytes
int8_t * sbytes
Definition: exif.h:113
matrix
Definition: vc1dsp.c:43
av_exif_parse_buffer
int av_exif_parse_buffer(void *logctx, const uint8_t *data, size_t size, AVExifMetadata *ifd, enum AVExifHeaderMode header_mode)
Decodes the EXIF data provided in the buffer and writes it into the struct *ifd.
Definition: exif.c:764
rational.h
int64_t
long long int64_t
Definition: coverity.c:34
metadata
Stream codec metadata
Definition: ogg-flac-chained-meta.txt:2
AVExifHeaderMode
AVExifHeaderMode
Definition: exif.h:58
av_exif_set_entry
int av_exif_set_entry(void *logctx, AVExifMetadata *ifd, uint16_t id, enum AVTiffDataType type, uint32_t count, const uint8_t *ifd_lead, uint32_t ifd_offset, const void *value)
Add an entry to the provided EXIF metadata struct.
Definition: exif.c:1054
data
const char data[16]
Definition: mxf.c:149
version_major.h
AVDictionary
Definition: dict.c:32
AVExifEntry::ifd_offset
uint32_t ifd_offset
Definition: exif.h:98
AV_TIFF_SHORT
@ AV_TIFF_SHORT
Definition: exif.h:45
AVExifEntry::dbl
double * dbl
Definition: exif.h:110
AV_TIFF_UNDEFINED
@ AV_TIFF_UNDEFINED
Definition: exif.h:49
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
av_exif_free
void av_exif_free(AVExifMetadata *ifd)
Frees all resources associated with the given EXIF metadata struct.
Definition: exif.c:609
av_exif_ifd_to_dict
int av_exif_ifd_to_dict(void *logctx, const AVExifMetadata *ifd, AVDictionary **metadata)
Recursively reads all tags from the IFD and stores them in the provided metadata dictionary.
Definition: exif.c:914
AV_TIFF_IFD
@ AV_TIFF_IFD
Definition: exif.h:55
AV_TIFF_RATIONAL
@ AV_TIFF_RATIONAL
Definition: exif.h:47
AV_EXIF_EXIF00
@ AV_EXIF_EXIF00
The first six bytes contain "Exif\0\0", then it's AV_EXIF_TIFF_HEADER.
Definition: exif.h:71
AV_EXIF_ASSUME_BE
@ AV_EXIF_ASSUME_BE
skip the TIFF header, assume big endian
Definition: exif.h:67
AVExifEntry::ifd_lead
uint8_t * ifd_lead
Definition: exif.h:99
AV_EXIF_TIFF_HEADER
@ AV_EXIF_TIFF_HEADER
The TIFF header starts with 0x49492a00, or 0x4d4d002a.
Definition: exif.h:63
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
av_exif_remove_entry
int av_exif_remove_entry(void *logctx, AVExifMetadata *ifd, uint16_t id, int flags)
Remove an entry from the provided EXIF metadata struct.
Definition: exif.c:1138
av_exif_write
int av_exif_write(void *logctx, const AVExifMetadata *ifd, AVBufferRef **buffer, enum AVExifHeaderMode header_mode)
Allocates a buffer using av_malloc of an appropriate size and writes the EXIF data represented by ifd...
Definition: exif.c:703
av_exif_get_tag_id
int32_t av_exif_get_tag_id(const char *name)
Retrieves the tag ID associated with the provided tag string name.
Definition: exif.c:225
AVExifEntry::count
uint32_t count
Definition: exif.h:88
AV_EXIF_ASSUME_LE
@ AV_EXIF_ASSUME_LE
skip the TIFF header, assume little endian
Definition: exif.h:65
AVExifMetadata::size
unsigned int size
Definition: exif.h:82
AVExifEntry::value
union AVExifEntry::@120 value
av_exif_matrix_to_orientation
int av_exif_matrix_to_orientation(const int32_t *matrix)
Convert a display matrix used by AV_FRAME_DATA_DISPLAYMATRIX into an orientation constant used by EXI...
Definition: exif.c:1179
AV_TIFF_BYTE
@ AV_TIFF_BYTE
Definition: exif.h:43
AVTiffDataType
AVTiffDataType
Data type identifiers for TIFF tags.
Definition: exif.h:42
AVExifEntry::id
uint16_t id
Definition: exif.h:86
size
int size
Definition: twinvq_data.h:10344
AVExifEntry::ptr
void * ptr
Definition: exif.h:107
av_exif_clone_ifd
AVExifMetadata * av_exif_clone_ifd(const AVExifMetadata *ifd)
Allocates a duplicate of the provided EXIF metadata struct.
Definition: exif.c:1143
buffer.h
AV_TIFF_STRING
@ AV_TIFF_STRING
Definition: exif.h:44
AVExifEntry::ifd
AVExifMetadata ifd
Definition: exif.h:115
AV_TIFF_SSHORT
@ AV_TIFF_SSHORT
Definition: exif.h:50
AV_TIFF_SRATIONAL
@ AV_TIFF_SRATIONAL
Definition: exif.h:52
AVExifMetadata::entries
AVExifEntry * entries
Definition: exif.h:78
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
AVExifMetadata::count
unsigned int count
Definition: exif.h:80
AVExifEntry::uint
uint64_t * uint
Definition: exif.h:109
AV_TIFF_SLONG
@ AV_TIFF_SLONG
Definition: exif.h:51
AV_TIFF_SBYTE
@ AV_TIFF_SBYTE
Definition: exif.h:48
dict.h
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
AVExifEntry::sint
int64_t * sint
Definition: exif.h:108
AVExifEntry::type
enum AVTiffDataType type
Definition: exif.h:87
AV_TIFF_DOUBLE
@ AV_TIFF_DOUBLE
Definition: exif.h:54
av_exif_orientation_to_matrix
int av_exif_orientation_to_matrix(int32_t *matrix, int orientation)
Convert an orientation constant used by EXIF's orientation tag into a display matrix used by AV_FRAME...
Definition: exif.c:1192
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
AVExifEntry::ubytes
uint8_t * ubytes
Definition: exif.h:112
AV_TIFF_FLOAT
@ AV_TIFF_FLOAT
Definition: exif.h:53
AVExifEntry::rat
AVRational * rat
Definition: exif.h:114
int32_t
int32_t
Definition: audioconvert.c:56
AVExifEntry::str
char * str
Definition: exif.h:111
AV_TIFF_LONG
@ AV_TIFF_LONG
Definition: exif.h:46