Coverage Report

Created: 2026-10-28 07:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/exif.c
Line
Count
Source
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
#include <inttypes.h>
31
32
#include "libavutil/attributes.h"
33
#include "libavutil/avconfig.h"
34
#include "libavutil/bprint.h"
35
#include "libavutil/display.h"
36
#include "libavutil/intreadwrite.h"
37
#include "libavutil/mem.h"
38
39
#include "bytestream.h"
40
#include "exif_internal.h"
41
#include "tiff_common.h"
42
43
0
#define EXIF_II_LONG           0x49492a00
44
0
#define EXIF_MM_LONG           0x4d4d002a
45
46
0
#define BASE_TAG_SIZE          12
47
0
#define IFD_EXTRA_SIZE         6
48
49
#define EXIF_TAG_NAME_LENGTH   32
50
0
#define MAKERNOTE_TAG          0x927c
51
0
#define ORIENTATION_TAG        0x112
52
0
#define EXIFIFD_TAG            0x8769
53
0
#define IMAGE_WIDTH_TAG        0x100
54
0
#define IMAGE_LENGTH_TAG       0x101
55
0
#define PIXEL_X_TAG            0xa002
56
0
#define PIXEL_Y_TAG            0xa003
57
58
struct exif_tag {
59
    const char name[EXIF_TAG_NAME_LENGTH];
60
    uint16_t id;
61
};
62
63
static const struct exif_tag tag_list[] = { // JEITA CP-3451 EXIF specification:
64
    {"GPSVersionID",               0x00}, // <- Table 12 GPS Attribute Information
65
    {"GPSLatitudeRef",             0x01},
66
    {"GPSLatitude",                0x02},
67
    {"GPSLongitudeRef",            0x03},
68
    {"GPSLongitude",               0x04},
69
    {"GPSAltitudeRef",             0x05},
70
    {"GPSAltitude",                0x06},
71
    {"GPSTimeStamp",               0x07},
72
    {"GPSSatellites",              0x08},
73
    {"GPSStatus",                  0x09},
74
    {"GPSMeasureMode",             0x0A},
75
    {"GPSDOP",                     0x0B},
76
    {"GPSSpeedRef",                0x0C},
77
    {"GPSSpeed",                   0x0D},
78
    {"GPSTrackRef",                0x0E},
79
    {"GPSTrack",                   0x0F},
80
    {"GPSImgDirectionRef",         0x10},
81
    {"GPSImgDirection",            0x11},
82
    {"GPSMapDatum",                0x12},
83
    {"GPSDestLatitudeRef",         0x13},
84
    {"GPSDestLatitude",            0x14},
85
    {"GPSDestLongitudeRef",        0x15},
86
    {"GPSDestLongitude",           0x16},
87
    {"GPSDestBearingRef",          0x17},
88
    {"GPSDestBearing",             0x18},
89
    {"GPSDestDistanceRef",         0x19},
90
    {"GPSDestDistance",            0x1A},
91
    {"GPSProcessingMethod",        0x1B},
92
    {"GPSAreaInformation",         0x1C},
93
    {"GPSDateStamp",               0x1D},
94
    {"GPSDifferential",            0x1E},
95
    {"ImageWidth",                 0x100}, // <- Table 3 TIFF Rev. 6.0 Attribute Information Used in Exif
96
    {"ImageLength",                0x101},
97
    {"BitsPerSample",              0x102},
98
    {"Compression",                0x103},
99
    {"PhotometricInterpretation",  0x106},
100
    {"Orientation",                0x112},
101
    {"SamplesPerPixel",            0x115},
102
    {"PlanarConfiguration",        0x11C},
103
    {"YCbCrSubSampling",           0x212},
104
    {"YCbCrPositioning",           0x213},
105
    {"XResolution",                0x11A},
106
    {"YResolution",                0x11B},
107
    {"ResolutionUnit",             0x128},
108
    {"StripOffsets",               0x111},
109
    {"RowsPerStrip",               0x116},
110
    {"StripByteCounts",            0x117},
111
    {"JPEGInterchangeFormat",      0x201},
112
    {"JPEGInterchangeFormatLength",0x202},
113
    {"TransferFunction",           0x12D},
114
    {"WhitePoint",                 0x13E},
115
    {"PrimaryChromaticities",      0x13F},
116
    {"YCbCrCoefficients",          0x211},
117
    {"ReferenceBlackWhite",        0x214},
118
    {"DateTime",                   0x132},
119
    {"ImageDescription",           0x10E},
120
    {"Make",                       0x10F},
121
    {"Model",                      0x110},
122
    {"Software",                   0x131},
123
    {"Artist",                     0x13B},
124
    {"Copyright",                  0x8298},
125
    {"InterColorProfile",          0x8773},
126
    {"ExifVersion",                0x9000}, // <- Table 4 Exif IFD Attribute Information (1)
127
    {"FlashpixVersion",            0xA000},
128
    {"ColorSpace",                 0xA001},
129
    {"ComponentsConfiguration",    0x9101},
130
    {"CompressedBitsPerPixel",     0x9102},
131
    {"PixelXDimension",            0xA002},
132
    {"PixelYDimension",            0xA003},
133
    {"MakerNote",                  0x927C},
134
    {"UserComment",                0x9286},
135
    {"RelatedSoundFile",           0xA004},
136
    {"DateTimeOriginal",           0x9003},
137
    {"DateTimeDigitized",          0x9004},
138
    {"SubSecTime",                 0x9290},
139
    {"SubSecTimeOriginal",         0x9291},
140
    {"SubSecTimeDigitized",        0x9292},
141
    {"ImageUniqueID",              0xA420},
142
    {"ExposureTime",               0x829A}, // <- Table 5 Exif IFD Attribute Information (2)
143
    {"FNumber",                    0x829D},
144
    {"ExposureProgram",            0x8822},
145
    {"SpectralSensitivity",        0x8824},
146
    {"ISOSpeedRatings",            0x8827},
147
    {"OECF",                       0x8828},
148
    {"ShutterSpeedValue",          0x9201},
149
    {"ApertureValue",              0x9202},
150
    {"BrightnessValue",            0x9203},
151
    {"ExposureBiasValue",          0x9204},
152
    {"MaxApertureValue",           0x9205},
153
    {"SubjectDistance",            0x9206},
154
    {"MeteringMode",               0x9207},
155
    {"LightSource",                0x9208},
156
    {"Flash",                      0x9209},
157
    {"FocalLength",                0x920A},
158
    {"SubjectArea",                0x9214},
159
    {"FlashEnergy",                0xA20B},
160
    {"SpatialFrequencyResponse",   0xA20C},
161
    {"FocalPlaneXResolution",      0xA20E},
162
    {"FocalPlaneYResolution",      0xA20F},
163
    {"FocalPlaneResolutionUnit",   0xA210},
164
    {"SubjectLocation",            0xA214},
165
    {"ExposureIndex",              0xA215},
166
    {"SensingMethod",              0xA217},
167
    {"FileSource",                 0xA300},
168
    {"SceneType",                  0xA301},
169
    {"CFAPattern",                 0xA302},
170
    {"CustomRendered",             0xA401},
171
    {"ExposureMode",               0xA402},
172
    {"WhiteBalance",               0xA403},
173
    {"DigitalZoomRatio",           0xA404},
174
    {"FocalLengthIn35mmFilm",      0xA405},
175
    {"SceneCaptureType",           0xA406},
176
    {"GainControl",                0xA407},
177
    {"Contrast",                   0xA408},
178
    {"Saturation",                 0xA409},
179
    {"Sharpness",                  0xA40A},
180
    {"DeviceSettingDescription",   0xA40B},
181
    {"SubjectDistanceRange",       0xA40C},
182
183
    /* InteropIFD tags */
184
    {"RelatedImageFileFormat",     0x1000},
185
    {"RelatedImageWidth",          0x1001},
186
    {"RelatedImageLength",         0x1002},
187
188
    /* private EXIF tags */
189
    {"PrintImageMatching",         0xC4A5}, // <- undocumented meaning
190
191
    /* IFD tags */
192
    {"ExifIFD",                    0x8769}, // <- An IFD pointing to standard Exif metadata
193
    {"GPSInfo",                    0x8825}, // <- An IFD pointing to GPS Exif Metadata
194
    {"InteropIFD",                 0xA005}, // <- Table 13 Interoperability IFD Attribute Information
195
    {"GlobalParametersIFD",        0x0190},
196
    {"ProfileIFD",                 0xc6f5},
197
198
    /* Extra FFmpeg tags */
199
    { "IFD1",                      0xFFFC},
200
    { "IFD2",                      0xFFFB},
201
    { "IFD3",                      0xFFFA},
202
    { "IFD4",                      0xFFF9},
203
    { "IFD5",                      0xFFF8},
204
    { "IFD6",                      0xFFF7},
205
    { "IFD7",                      0xFFF6},
206
    { "IFD8",                      0xFFF5},
207
    { "IFD9",                      0xFFF4},
208
    { "IFD10",                     0xFFF3},
209
    { "IFD11",                     0xFFF2},
210
    { "IFD12",                     0xFFF1},
211
    { "IFD13",                     0xFFF0},
212
    { "IFD14",                     0xFFEF},
213
    { "IFD15",                     0xFFEE},
214
    { "IFD16",                     0xFFED},
215
};
216
217
/* same as type_sizes but with string == 1 */
218
static const size_t exif_sizes[] = {
219
    [0] = 0,
220
    [AV_TIFF_BYTE] = 1,
221
    [AV_TIFF_STRING] = 1,
222
    [AV_TIFF_SHORT] = 2,
223
    [AV_TIFF_LONG] = 4,
224
    [AV_TIFF_RATIONAL] = 8,
225
    [AV_TIFF_SBYTE] = 1,
226
    [AV_TIFF_UNDEFINED] = 1,
227
    [AV_TIFF_SSHORT] = 2,
228
    [AV_TIFF_SLONG] = 4,
229
    [AV_TIFF_SRATIONAL] = 8,
230
    [AV_TIFF_FLOAT] = 4,
231
    [AV_TIFF_DOUBLE] = 8,
232
    [AV_TIFF_IFD] = 4,
233
};
234
235
const char *av_exif_get_tag_name(uint16_t id)
236
0
{
237
0
    for (size_t i = 0; i < FF_ARRAY_ELEMS(tag_list); i++) {
238
0
        if (tag_list[i].id == id)
239
0
            return tag_list[i].name;
240
0
    }
241
242
0
    return NULL;
243
0
}
244
245
int32_t av_exif_get_tag_id(const char *name)
246
0
{
247
0
    if (!name)
248
0
        return -1;
249
250
0
    for (size_t i = 0; i < FF_ARRAY_ELEMS(tag_list); i++) {
251
0
        if (!strcmp(tag_list[i].name, name))
252
0
            return tag_list[i].id;
253
0
    }
254
255
0
    return -1;
256
0
}
257
258
static inline void tput16(PutByteContext *pb, const int le, const uint16_t value)
259
0
{
260
0
    le ? bytestream2_put_le16(pb, value) : bytestream2_put_be16(pb, value);
261
0
}
262
263
static inline void tput32(PutByteContext *pb, const int le, const uint32_t value)
264
0
{
265
0
    le ? bytestream2_put_le32(pb, value) : bytestream2_put_be32(pb, value);
266
0
}
267
268
static inline void tput64(PutByteContext *pb, const int le, const uint64_t value)
269
0
{
270
0
    le ? bytestream2_put_le64(pb, value) : bytestream2_put_be64(pb, value);
271
0
}
272
273
static int exif_read_values(void *logctx, GetByteContext *gb, int le, AVExifEntry *entry)
274
0
{
275
0
    if (exif_sizes[entry->type] * entry->count > bytestream2_get_bytes_left(gb))
276
0
        return AVERROR_INVALIDDATA;
277
278
0
    switch (entry->type) {
279
0
        case AV_TIFF_SHORT:
280
0
        case AV_TIFF_LONG:
281
0
            entry->value.uint = av_calloc(entry->count, sizeof(*entry->value.uint));
282
0
            break;
283
0
        case AV_TIFF_SSHORT:
284
0
        case AV_TIFF_SLONG:
285
0
            entry->value.sint = av_calloc(entry->count, sizeof(*entry->value.sint));
286
0
            break;
287
0
        case AV_TIFF_DOUBLE:
288
0
        case AV_TIFF_FLOAT:
289
0
            entry->value.dbl = av_calloc(entry->count, sizeof(*entry->value.dbl));
290
0
            break;
291
0
        case AV_TIFF_RATIONAL:
292
0
        case AV_TIFF_SRATIONAL:
293
0
            entry->value.rat = av_calloc(entry->count, sizeof(*entry->value.rat));
294
0
            break;
295
0
        case AV_TIFF_UNDEFINED:
296
0
        case AV_TIFF_BYTE:
297
0
            entry->value.ubytes = av_mallocz(entry->count);
298
0
            break;
299
0
        case AV_TIFF_SBYTE:
300
0
            entry->value.sbytes = av_mallocz(entry->count);
301
0
            break;
302
0
        case AV_TIFF_STRING:
303
0
            entry->value.str = av_mallocz(entry->count + 1);
304
0
            break;
305
0
        case AV_TIFF_IFD:
306
0
            av_log(logctx, AV_LOG_WARNING, "Bad IFD type for non-IFD tag\n");
307
0
            return AVERROR_INVALIDDATA;
308
0
    }
309
0
    if (!entry->value.ptr)
310
0
        return AVERROR(ENOMEM);
311
0
    switch (entry->type) {
312
0
        case AV_TIFF_SHORT:
313
0
            for (size_t i = 0; i < entry->count; i++)
314
0
                entry->value.uint[i] = ff_tget_short(gb, le);
315
0
            break;
316
0
        case AV_TIFF_LONG:
317
0
            for (size_t i = 0; i < entry->count; i++)
318
0
                entry->value.uint[i] = ff_tget_long(gb, le);
319
0
            break;
320
0
        case AV_TIFF_SSHORT:
321
0
            for (size_t i = 0; i < entry->count; i++)
322
0
                entry->value.sint[i] = (int16_t) ff_tget_short(gb, le);
323
0
            break;
324
0
        case AV_TIFF_SLONG:
325
0
            for (size_t i = 0; i < entry->count; i++)
326
0
                entry->value.sint[i] = (int32_t) ff_tget_long(gb, le);
327
0
            break;
328
0
        case AV_TIFF_DOUBLE:
329
0
            for (size_t i = 0; i < entry->count; i++)
330
0
                entry->value.dbl[i] = ff_tget_double(gb, le);
331
0
            break;
332
0
        case AV_TIFF_FLOAT:
333
0
            for (size_t i = 0; i < entry->count; i++) {
334
0
                av_alias32 alias = { .u32 = ff_tget_long(gb, le) };
335
0
                entry->value.dbl[i] = alias.f32;
336
0
            }
337
0
            break;
338
0
        case AV_TIFF_RATIONAL:
339
0
        case AV_TIFF_SRATIONAL:
340
0
            for (size_t i = 0; i < entry->count; i++) {
341
0
                int32_t num = ff_tget_long(gb, le);
342
0
                int32_t den = ff_tget_long(gb, le);
343
0
                entry->value.rat[i] = av_make_q(num, den);
344
0
            }
345
0
            break;
346
0
        case AV_TIFF_UNDEFINED:
347
0
        case AV_TIFF_BYTE:
348
            /* these three fields are aliased to entry->value.ptr via a union */
349
            /* and entry->value.ptr will always be nonzero here */
350
0
            av_assert0(entry->value.ubytes);
351
0
            bytestream2_get_buffer(gb, entry->value.ubytes, entry->count);
352
0
            break;
353
0
        case AV_TIFF_SBYTE:
354
0
            av_assert0(entry->value.sbytes);
355
0
            bytestream2_get_buffer(gb, entry->value.sbytes, entry->count);
356
0
            break;
357
0
        case AV_TIFF_STRING:
358
0
            av_assert0(entry->value.str);
359
0
            bytestream2_get_buffer(gb, entry->value.str, entry->count);
360
0
            break;
361
0
    }
362
363
0
    return 0;
364
0
}
365
366
static void exif_write_values(PutByteContext *pb, int le, const AVExifEntry *entry)
367
0
{
368
0
    switch (entry->type) {
369
0
        case AV_TIFF_SHORT:
370
0
            for (size_t i = 0; i < entry->count; i++)
371
0
                tput16(pb, le, entry->value.uint[i]);
372
0
            break;
373
0
        case AV_TIFF_LONG:
374
0
            for (size_t i = 0; i < entry->count; i++)
375
0
                tput32(pb, le, entry->value.uint[i]);
376
0
            break;
377
0
        case AV_TIFF_SSHORT:
378
0
            for (size_t i = 0; i < entry->count; i++)
379
0
                tput16(pb, le, entry->value.sint[i]);
380
0
            break;
381
0
        case AV_TIFF_SLONG:
382
0
            for (size_t i = 0; i < entry->count; i++)
383
0
                tput32(pb, le, entry->value.sint[i]);
384
0
            break;
385
0
        case AV_TIFF_DOUBLE:
386
0
            for (size_t i = 0; i < entry->count; i++) {
387
0
                const av_alias64 a = { .f64 = entry->value.dbl[i] };
388
0
                tput64(pb, le, a.u64);
389
0
            }
390
0
            break;
391
0
        case AV_TIFF_FLOAT:
392
0
            for (size_t i = 0; i < entry->count; i++) {
393
0
                const av_alias32 a = { .f32 = entry->value.dbl[i] };
394
0
                tput32(pb, le, a.u32);
395
0
            }
396
0
            break;
397
0
        case AV_TIFF_RATIONAL:
398
0
        case AV_TIFF_SRATIONAL:
399
0
            for (size_t i = 0; i < entry->count; i++) {
400
0
                tput32(pb, le, entry->value.rat[i].num);
401
0
                tput32(pb, le, entry->value.rat[i].den);
402
0
            }
403
0
            break;
404
0
        case AV_TIFF_UNDEFINED:
405
0
        case AV_TIFF_BYTE:
406
0
            bytestream2_put_buffer(pb, entry->value.ubytes, entry->count);
407
0
            break;
408
0
        case AV_TIFF_SBYTE:
409
0
            bytestream2_put_buffer(pb, entry->value.sbytes, entry->count);
410
0
            break;
411
0
        case AV_TIFF_STRING:
412
0
            bytestream2_put_buffer(pb, entry->value.str, entry->count);
413
0
            break;
414
0
    }
415
0
}
416
417
static const uint8_t aoc_header[] = { 'A', 'O', 'C', 0, };
418
static const uint8_t apple_header[] = { 'A', 'p', 'p', 'l', 'e', ' ', 'i', 'O', 'S', 0, 0, 1, 'M', 'M'};
419
static const uint8_t casio_header[] = { 'Q', 'V', 'C', 0, 0, 0, };
420
static const uint8_t foveon_header[] = { 'F', 'O', 'V', 'E', 'O', 'N', 0, 0, };
421
static const uint8_t fuji_header[] = { 'F', 'U', 'J', 'I', };
422
static const uint8_t nikon_header[] = { 'N', 'i', 'k', 'o', 'n', 0, };
423
static const uint8_t olympus1_header[] = { 'O', 'L', 'Y', 'M', 'P', 0, };
424
static const uint8_t olympus2_header[] = { 'O', 'L', 'Y', 'M', 'P', 'U', 'S', 0, 'I', 'I', };
425
static const uint8_t panasonic_header[] = { 'P', 'a', 'n', 'a', 's', 'o', 'n', 'i', 'c', 0, 0, 0, };
426
static const uint8_t sigma_header[] = { 'S', 'I', 'G', 'M', 'A', 0, 0, 0, };
427
static const uint8_t sony_header[] = { 'S', 'O', 'N', 'Y', ' ', 'D', 'S', 'C', ' ', 0, 0, 0, };
428
429
struct exif_makernote_data {
430
    const uint8_t *header;
431
    size_t header_size;
432
    int result;
433
};
434
435
#define MAKERNOTE_STRUCT(h, r) { \
436
    .header = (h),               \
437
    .header_size = sizeof((h)),  \
438
    .result = (r),               \
439
}
440
441
static const struct exif_makernote_data makernote_data[] = {
442
    MAKERNOTE_STRUCT(aoc_header, 6),
443
    MAKERNOTE_STRUCT(apple_header, 14),
444
    MAKERNOTE_STRUCT(casio_header, -1),
445
    MAKERNOTE_STRUCT(foveon_header, 10),
446
    MAKERNOTE_STRUCT(fuji_header, -1),
447
    MAKERNOTE_STRUCT(olympus1_header, 8),
448
    MAKERNOTE_STRUCT(olympus2_header, -1),
449
    MAKERNOTE_STRUCT(panasonic_header, 12),
450
    MAKERNOTE_STRUCT(sigma_header, 10),
451
    MAKERNOTE_STRUCT(sony_header, 12),
452
};
453
454
/*
455
 * derived from Exiv2 MakerNote's article
456
 * https://exiv2.org/makernote.html or archived at
457
 * https://web.archive.org/web/20250311155857/https://exiv2.org/makernote.html
458
 */
459
static int exif_get_makernote_offset(GetByteContext *gb)
460
0
{
461
0
    if (bytestream2_get_bytes_left(gb) < BASE_TAG_SIZE)
462
0
        return -1;
463
464
0
    for (int i = 0; i < FF_ARRAY_ELEMS(makernote_data); i++) {
465
0
        if (!memcmp(gb->buffer, makernote_data[i].header, makernote_data[i].header_size))
466
0
            return makernote_data[i].result;
467
0
    }
468
469
0
    if (!memcmp(gb->buffer, nikon_header, sizeof(nikon_header))) {
470
0
        if (bytestream2_get_bytes_left(gb) < 14)
471
0
            return -1;
472
0
        else if (AV_RB32(gb->buffer + 10) == EXIF_MM_LONG || AV_RB32(gb->buffer + 10) == EXIF_II_LONG)
473
0
            return -1;
474
0
        return 8;
475
0
    }
476
477
0
    return 0;
478
0
}
479
480
static int exif_parse_ifd_list(void *logctx, GetByteContext *gb, int le,
481
                               int depth, int *entries_left,
482
                               AVExifMetadata *ifd, int guess);
483
484
static int exif_decode_tag(void *logctx, GetByteContext *gb, int le,
485
                           int depth, int *entries_left, int guess,
486
                           AVExifEntry *entry)
487
0
{
488
0
    int ret = 0, makernote_offset = -1, tell, is_ifd, count;
489
0
    enum AVTiffDataType type;
490
0
    uint32_t payload;
491
492
    /* safety check to prevent infinite recursion on malicious IFDs */
493
0
    if (depth > 3)
494
0
        return AVERROR_INVALIDDATA;
495
496
0
    tell = bytestream2_tell(gb);
497
498
0
    entry->id = ff_tget_short(gb, le);
499
0
    type = ff_tget_short(gb, le);
500
0
    count = ff_tget_long(gb, le);
501
0
    payload = ff_tget_long(gb, le);
502
503
0
    av_log(logctx, AV_LOG_DEBUG, "TIFF Tag: id: 0x%04x, type: %d, count: %u, offset: %d, "
504
0
                                 "payload: %" PRIu32 "\n", entry->id, type, count, tell, payload);
505
506
0
    if (!type) {
507
0
        av_log(logctx, AV_LOG_DEBUG, "Skipping invalid TIFF tag 0\n");
508
0
        goto end;
509
0
    }
510
511
    /* AV_TIFF_IFD is the largest, numerically */
512
0
    if (type > AV_TIFF_IFD || count >= INT_MAX/8U)
513
0
        return AVERROR_INVALIDDATA;
514
515
0
    is_ifd = type == AV_TIFF_IFD || ff_tis_ifd(entry->id) || entry->id == MAKERNOTE_TAG;
516
517
0
    if (is_ifd) {
518
0
        if (!payload)
519
0
            goto end;
520
0
        bytestream2_seek(gb, payload, SEEK_SET);
521
0
    }
522
523
0
    if (entry->id == MAKERNOTE_TAG) {
524
0
        makernote_offset = exif_get_makernote_offset(gb);
525
0
        if (makernote_offset < 0)
526
0
            is_ifd = 0;
527
0
    }
528
529
0
    if (is_ifd) {
530
0
        entry->type = AV_TIFF_IFD;
531
0
        entry->count = 1;
532
0
        entry->ifd_offset = makernote_offset > 0 ? makernote_offset : 0;
533
0
        if (entry->ifd_offset) {
534
0
            entry->ifd_lead = av_malloc(entry->ifd_offset);
535
0
            if (!entry->ifd_lead)
536
0
                return AVERROR(ENOMEM);
537
0
            bytestream2_get_buffer(gb, entry->ifd_lead, entry->ifd_offset);
538
0
        }
539
0
        ret = exif_parse_ifd_list(logctx, gb, le, depth + 1, entries_left,
540
0
                                  &entry->value.ifd, guess || entry->id == MAKERNOTE_TAG);
541
0
        if (ret < 0 && entry->id == MAKERNOTE_TAG) {
542
            /*
543
             * we guessed that MakerNote was an IFD
544
             * but we were probably incorrect at this
545
             * point so we try again as a binary blob
546
             */
547
0
            av_log(logctx, AV_LOG_DEBUG, "unrecognized MakerNote IFD, retrying as blob\n");
548
0
            is_ifd = 0;
549
0
        }
550
0
    }
551
552
    /* inverted condition instead of else so we can fall through from above */
553
0
    if (!is_ifd) {
554
0
        entry->type = type == AV_TIFF_IFD ? AV_TIFF_UNDEFINED : type;
555
0
        entry->count = count;
556
0
        bytestream2_seek(gb, count * exif_sizes[type] > 4 ? payload : tell + 8, SEEK_SET);
557
0
        ret = exif_read_values(logctx, gb, le, entry);
558
0
    }
559
560
0
end:
561
0
    bytestream2_seek(gb, tell + BASE_TAG_SIZE, SEEK_SET);
562
563
0
    return ret;
564
0
}
565
566
static int exif_parse_ifd_list(void *logctx, GetByteContext *gb, int le,
567
                               int depth, int *entries_left,
568
                               AVExifMetadata *ifd, int guess)
569
0
{
570
0
    uint32_t entries;
571
0
    size_t required_size;
572
0
    void *temp;
573
0
    int ret = 0;
574
575
0
    av_log(logctx, AV_LOG_DEBUG, "parsing IFD list at offset: %d\n", bytestream2_tell(gb));
576
577
0
    if (bytestream2_get_bytes_left(gb) < 2) {
578
0
        av_log(logctx, guess ? AV_LOG_DEBUG : AV_LOG_ERROR,
579
0
               "not enough bytes remaining in EXIF buffer: 2 required\n");
580
0
        ret = AVERROR_INVALIDDATA;
581
0
        goto end;
582
0
    }
583
584
0
    entries = ff_tget_short(gb, le);
585
0
    if (bytestream2_get_bytes_left(gb) < entries * BASE_TAG_SIZE) {
586
0
        av_log(logctx, guess ? AV_LOG_DEBUG : AV_LOG_ERROR,
587
0
               "not enough bytes remaining in EXIF buffer. entries: %" PRIu32 "\n", entries);
588
0
        ret = AVERROR_INVALIDDATA;
589
0
        goto end;
590
0
    }
591
0
    if (entries > 4096) {
592
        /* that is a lot of entries, probably an error */
593
0
        av_log(logctx, guess ? AV_LOG_DEBUG : AV_LOG_ERROR,
594
0
               "too many entries: %" PRIu32 "\n", entries);
595
0
        ret = AVERROR_INVALIDDATA;
596
0
        goto end;
597
0
    }
598
0
    if (entries > entries_left[guess]) {
599
0
        av_log(logctx, guess ? AV_LOG_DEBUG : AV_LOG_ERROR,
600
0
               "IFD tree has more entries than the EXIF buffer can hold\n");
601
0
        ret = AVERROR_INVALIDDATA;
602
0
        goto end;
603
0
    }
604
0
    entries_left[guess] -= entries;
605
606
0
    ifd->count = entries;
607
0
    av_log(logctx, AV_LOG_DEBUG, "entry count for IFD: %u\n", ifd->count);
608
609
    /* empty IFD is technically legal but equivalent to no metadata present */
610
0
    if (!ifd->count) {
611
0
        ret = 0;
612
0
        goto end;
613
0
    }
614
615
0
    if (av_size_mult(ifd->count, sizeof(*ifd->entries), &required_size) < 0) {
616
0
        ret = AVERROR(ENOMEM);
617
0
        goto end;
618
0
    }
619
0
    temp = av_fast_realloc(ifd->entries, &ifd->size, required_size);
620
0
    if (!temp) {
621
0
        av_freep(&ifd->entries);
622
0
        ret = AVERROR(ENOMEM);
623
0
        goto end;
624
0
    }
625
0
    ifd->entries = temp;
626
627
    /* entries have pointers in them which can cause issues if */
628
    /* they are freed or realloc'd when garbage */
629
0
    memset(ifd->entries, 0, required_size);
630
631
0
    for (uint32_t i = 0; i < entries; i++) {
632
0
        ret = exif_decode_tag(logctx, gb, le, depth, entries_left, guess, &ifd->entries[i]);
633
0
        if (ret < 0)
634
0
            goto end;
635
0
    }
636
637
0
end:
638
0
    if (ret < 0) {
639
0
        av_exif_free(ifd);
640
0
        return ret;
641
0
    }
642
    /*
643
     * at the end of an IFD is an pointer to the next IFD
644
     * or zero if there are no more IFDs, which is usually the case
645
     */
646
0
    ret = ff_tget_long(gb, le);
647
648
    /* overflow */
649
0
    if (ret < 0) {
650
0
        ret = AVERROR_INVALIDDATA;
651
0
        av_exif_free(ifd);
652
0
    }
653
654
0
    return ret;
655
0
}
656
657
/*
658
 * note that this function does not free the entry pointer itself
659
 * because it's probably part of a larger array that should be freed
660
 * all at once
661
 */
662
static void exif_free_entry(AVExifEntry *entry)
663
0
{
664
0
    if (!entry)
665
0
        return;
666
0
    if (entry->type == AV_TIFF_IFD)
667
0
        av_exif_free(&entry->value.ifd);
668
0
    else
669
0
        av_freep(&entry->value.ptr);
670
0
    av_freep(&entry->ifd_lead);
671
0
}
672
673
void av_exif_free(AVExifMetadata *ifd)
674
0
{
675
0
    if (!ifd)
676
0
        return;
677
0
    if (!ifd->entries) {
678
0
        ifd->count = 0;
679
0
        ifd->size = 0;
680
0
        return;
681
0
    }
682
0
    for (size_t i = 0; i < ifd->count; i++) {
683
0
        AVExifEntry *entry = &ifd->entries[i];
684
0
        exif_free_entry(entry);
685
0
    }
686
0
    av_freep(&ifd->entries);
687
0
    ifd->count = 0;
688
0
    ifd->size = 0;
689
0
}
690
691
static size_t exif_get_ifd_size(const AVExifMetadata *ifd)
692
0
{
693
    /* 6 == 4 + 2; 2-byte entry-count at the beginning */
694
    /* plus 4-byte next-IFD pointer at the end */
695
0
    size_t total_size = IFD_EXTRA_SIZE;
696
0
    for (size_t i = 0; i < ifd->count; i++) {
697
0
        const AVExifEntry *entry = &ifd->entries[i];
698
0
        if (entry->type == AV_TIFF_IFD) {
699
0
            total_size += BASE_TAG_SIZE + exif_get_ifd_size(&entry->value.ifd) + entry->ifd_offset;
700
0
        } else {
701
0
            size_t payload_size = entry->count * exif_sizes[entry->type];
702
0
            total_size += BASE_TAG_SIZE + (payload_size > 4 ? payload_size : 0);
703
0
        }
704
0
    }
705
0
    return total_size;
706
0
}
707
708
static int exif_write_ifd(void *logctx, PutByteContext *pb, int le, int depth, const AVExifMetadata *ifd)
709
0
{
710
0
    int offset, ret, tell, tell2;
711
0
    tell = bytestream2_tell_p(pb);
712
0
    tput16(pb, le, ifd->count);
713
0
    offset = tell + IFD_EXTRA_SIZE + BASE_TAG_SIZE * (uint32_t) ifd->count;
714
0
    av_log(logctx, AV_LOG_DEBUG, "writing IFD with %u entries and initial offset %d\n", ifd->count, offset);
715
0
    for (size_t i = 0; i < ifd->count; i++) {
716
0
        const AVExifEntry *entry = &ifd->entries[i];
717
0
        av_log(logctx, AV_LOG_DEBUG, "writing TIFF entry: id: 0x%04" PRIx16 ", type: %d, count: %"
718
0
                                      PRIu32 ", offset: %d, offset value: %d\n",
719
0
                                      entry->id, entry->type, entry->count,
720
0
                                      bytestream2_tell_p(pb), offset);
721
0
        tput16(pb, le, entry->id);
722
0
        if (entry->id == MAKERNOTE_TAG && entry->type == AV_TIFF_IFD) {
723
0
            size_t ifd_size = exif_get_ifd_size(&entry->value.ifd);
724
0
            tput16(pb, le, AV_TIFF_UNDEFINED);
725
0
            tput32(pb, le, ifd_size);
726
0
        } else {
727
0
            tput16(pb, le, entry->type);
728
0
            tput32(pb, le, entry->count);
729
0
        }
730
0
        if (entry->type == AV_TIFF_IFD) {
731
0
            tput32(pb, le, offset);
732
0
            tell2 = bytestream2_tell_p(pb);
733
0
            bytestream2_seek_p(pb, offset, SEEK_SET);
734
0
            if (entry->ifd_offset)
735
0
                bytestream2_put_buffer(pb, entry->ifd_lead, entry->ifd_offset);
736
0
            ret = exif_write_ifd(logctx, pb, le, depth + 1, &entry->value.ifd);
737
0
            if (ret < 0)
738
0
                return ret;
739
0
            offset += ret + entry->ifd_offset;
740
0
            bytestream2_seek_p(pb, tell2, SEEK_SET);
741
0
        } else {
742
0
            size_t payload_size = entry->count * exif_sizes[entry->type];
743
0
            if (payload_size > 4) {
744
0
                tput32(pb, le, offset);
745
0
                tell2 = bytestream2_tell_p(pb);
746
0
                bytestream2_seek_p(pb, offset, SEEK_SET);
747
0
                exif_write_values(pb, le, entry);
748
0
                offset += payload_size;
749
0
                bytestream2_seek_p(pb, tell2, SEEK_SET);
750
0
            } else {
751
                /* zero uninitialized excess payload values */
752
0
                AV_WN32(pb->buffer, 0);
753
0
                exif_write_values(pb, le, entry);
754
0
                bytestream2_seek_p(pb, 4 - payload_size, SEEK_CUR);
755
0
            }
756
0
        }
757
0
    }
758
759
    /*
760
     * we write 0 if this is the top-level exif IFD
761
     * indicating that there are no more IFD pointers
762
     */
763
0
    tput32(pb, le, depth ? offset : 0);
764
0
    return offset - tell;
765
0
}
766
767
int av_exif_write(void *logctx, const AVExifMetadata *ifd, AVBufferRef **buffer, enum AVExifHeaderMode header_mode)
768
0
{
769
0
    AVBufferRef *buf = NULL;
770
0
    size_t size, headsize = 8;
771
0
    PutByteContext pb;
772
0
    int ret = 0, off = 0, next;
773
0
    AVExifMetadata *ifd_new = NULL;
774
0
    AVExifMetadata extra_ifds[16] = { 0 };
775
776
0
    int le = 1;
777
778
0
    if (*buffer) {
779
0
        ret = AVERROR(EINVAL);
780
0
        goto end;
781
0
    }
782
783
0
    size = exif_get_ifd_size(ifd);
784
0
    switch (header_mode) {
785
0
        case AV_EXIF_EXIF00:
786
0
            off = 6;
787
0
            break;
788
0
        case AV_EXIF_T_OFF:
789
0
            off = 4;
790
0
            break;
791
0
        case AV_EXIF_ASSUME_BE:
792
0
            le = 0;
793
0
            headsize = 0;
794
0
            break;
795
0
        case AV_EXIF_ASSUME_LE:
796
0
            le = 1;
797
0
            headsize = 0;
798
0
            break;
799
0
    }
800
801
0
    ret = av_buffer_realloc(&buf, size + off + headsize);
802
0
    if (ret < 0)
803
0
        goto end;
804
805
0
    if (header_mode == AV_EXIF_EXIF00) {
806
0
        AV_WL32(buf->data, MKTAG('E','x','i','f'));
807
0
        AV_WN16(buf->data + 4, 0);
808
0
    } else if (header_mode == AV_EXIF_T_OFF) {
809
0
        AV_WN32(buf->data, 0);
810
0
    }
811
812
0
    bytestream2_init_writer(&pb, buf->data + off, buf->size - off);
813
814
0
    if (header_mode != AV_EXIF_ASSUME_BE && header_mode != AV_EXIF_ASSUME_LE) {
815
        /* these constants are be32 in both cases */
816
        /* le == 1 always in this case */
817
0
        bytestream2_put_be32(&pb, EXIF_II_LONG);
818
0
        tput32(&pb, le, 8);
819
0
    }
820
821
0
    int extras = 0;
822
0
    for (int i = 0; i < FF_ARRAY_ELEMS(extra_ifds); i++) {
823
0
        AVExifEntry *extra_entry = NULL;
824
0
        uint16_t extra_tag = 0xFFFCu - i;
825
0
        ret = av_exif_get_entry(logctx, (AVExifMetadata *) ifd, extra_tag, 0, &extra_entry);
826
0
        if (ret < 0)
827
0
            break;
828
0
        if (!ret)
829
0
            continue;
830
0
        av_log(logctx, AV_LOG_DEBUG, "found extra IFD tag: %04x\n", extra_tag);
831
0
        if (!ifd_new) {
832
0
            ifd_new = av_exif_clone_ifd(ifd);
833
0
            if (!ifd_new)
834
0
                break;
835
0
            ifd = ifd_new;
836
0
        }
837
        /* calling remove_entry will call av_exif_free on the original */
838
0
        AVExifMetadata *cloned = av_exif_clone_ifd(&extra_entry->value.ifd);
839
0
        if (!cloned)
840
0
            break;
841
0
        extra_ifds[extras++] = *cloned;
842
        /* don't use av_exif_free here, we want to preserve internals */
843
0
        av_free(cloned);
844
0
        ret = av_exif_remove_entry(logctx, ifd_new, extra_tag, 0);
845
0
        if (ret < 0)
846
0
            break;
847
0
    }
848
849
0
    if (ret < 0) {
850
0
        av_log(logctx, AV_LOG_ERROR, "error popping additional IFD: %s\n", av_err2str(ret));
851
0
        goto end;
852
0
    }
853
854
0
    next = bytestream2_tell_p(&pb);
855
0
    ret = exif_write_ifd(logctx, &pb, le, 0, ifd);
856
0
    if (ret < 0) {
857
0
        av_log(logctx, AV_LOG_ERROR, "error writing EXIF data: %s\n", av_err2str(ret));
858
0
        goto end;
859
0
    }
860
0
    next += ret;
861
862
0
    for (int i = 0; i < extras; i++) {
863
0
        av_log(logctx, AV_LOG_DEBUG, "writing additional ifd at: %d\n", next);
864
        /* exif_write_ifd always writes 0 i.e. last ifd so we overwrite that here */
865
0
        bytestream2_seek_p(&pb, -4, SEEK_CUR);
866
0
        tput32(&pb, le, next);
867
0
        bytestream2_seek_p(&pb, next, SEEK_SET);
868
0
        ret = exif_write_ifd(logctx, &pb, le, 0, &extra_ifds[i]);
869
0
        if (ret < 0) {
870
0
            av_log(logctx, AV_LOG_ERROR, "error writing additional IFD: %s\n", av_err2str(ret));
871
0
            goto end;
872
0
        }
873
0
        next += ret;
874
0
    }
875
876
    /* shrink the buffer to the amount of data we actually used */
877
    /* extras don't contribute the initial BASE_TAG_SIZE each */
878
0
    ret = av_buffer_realloc(&buf, buf->size - BASE_TAG_SIZE * extras);
879
0
    if (ret < 0)
880
0
        goto end;
881
882
0
    *buffer = buf;
883
0
    ret = 0;
884
885
0
end:
886
0
    av_exif_free(ifd_new);
887
0
    av_freep(&ifd_new);
888
0
    for (int i = 0; i < FF_ARRAY_ELEMS(extra_ifds); i++)
889
0
        av_exif_free(&extra_ifds[i]);
890
0
    if (ret < 0)
891
0
        av_buffer_unref(&buf);
892
893
0
    return ret;
894
0
}
895
896
int av_exif_parse_buffer(void *logctx, const uint8_t *buf, size_t size,
897
                         AVExifMetadata *ifd, enum AVExifHeaderMode header_mode)
898
0
{
899
0
    int ret, le;
900
0
    GetByteContext gbytes;
901
0
    if (size > INT_MAX)
902
0
        return AVERROR(EINVAL);
903
0
    size_t off = 0;
904
0
    switch (header_mode) {
905
0
        case AV_EXIF_EXIF00:
906
0
            if (size < 6)
907
0
                return AVERROR_INVALIDDATA;
908
0
            off = 6;
909
0
            av_fallthrough;
910
0
        case AV_EXIF_T_OFF:
911
0
            if (size < 4)
912
0
                return AVERROR_INVALIDDATA;
913
0
            if (!off)
914
0
                off = AV_RB32(buf) + 4;
915
0
            av_fallthrough;
916
0
        case AV_EXIF_TIFF_HEADER: {
917
0
            int ifd_offset;
918
0
            if (size <= off)
919
0
                return AVERROR_INVALIDDATA;
920
0
            bytestream2_init(&gbytes, buf + off, size - off);
921
            // read TIFF header
922
0
            ret = ff_tdecode_header(&gbytes, &le, &ifd_offset);
923
0
            if (ret < 0) {
924
0
                av_log(logctx, AV_LOG_ERROR, "invalid TIFF header in EXIF data: %s\n", av_err2str(ret));
925
0
                return ret;
926
0
            }
927
0
            bytestream2_seek(&gbytes, ifd_offset, SEEK_SET);
928
0
            break;
929
0
        }
930
0
        case AV_EXIF_ASSUME_LE:
931
0
            le = 1;
932
0
            bytestream2_init(&gbytes, buf, size);
933
0
            break;
934
0
        case AV_EXIF_ASSUME_BE:
935
0
            le = 0;
936
0
            bytestream2_init(&gbytes, buf, size);
937
0
            break;
938
0
        default:
939
0
            return AVERROR(EINVAL);
940
0
    }
941
942
    /*
943
     * parse IFD0 here. If the return value is positive that tells us
944
     * there is subimage metadata, but we don't parse that IFD here
945
     */
946
0
    int ifd_offsets[17] = { bytestream2_tell(&gbytes) };
947
0
    int nb_ifds = 1;
948
0
    int entries_left[2] = { size / BASE_TAG_SIZE, size / BASE_TAG_SIZE };
949
0
    ret = exif_parse_ifd_list(logctx, &gbytes, le, 0, entries_left, ifd, 0);
950
0
    if (ret < 0) {
951
0
        av_log(logctx, AV_LOG_ERROR, "error decoding EXIF data: %s\n", av_err2str(ret));
952
0
        return ret;
953
0
    }
954
0
    if (!ret)
955
0
        goto finish;
956
0
    int next = ret;
957
0
    bytestream2_seek(&gbytes, next, SEEK_SET);
958
959
    /* cap at 16 extra IFDs for sanity/parse security */
960
0
    for (int extra_tag = 0xFFFCu; extra_tag > 0xFFECu; extra_tag--) {
961
0
        AVExifMetadata extra_ifd = { 0 };
962
0
        for (int i = 0; i < nb_ifds; i++) {
963
0
            if (ifd_offsets[i] == next) {
964
0
                av_log(logctx, AV_LOG_WARNING, "EXIF IFD chain loops back to offset %d\n", next);
965
0
                goto finish;
966
0
            }
967
0
        }
968
0
        ifd_offsets[nb_ifds++] = next;
969
0
        ret = exif_parse_ifd_list(logctx, &gbytes, le, 0, entries_left, &extra_ifd, 1);
970
0
        if (ret < 0) {
971
0
            av_exif_free(&extra_ifd);
972
0
            break;
973
0
        }
974
0
        next = ret;
975
0
        av_log(logctx, AV_LOG_DEBUG, "found extra IFD: %04x with next=%d\n", extra_tag, ret);
976
0
        bytestream2_seek(&gbytes, next, SEEK_SET);
977
0
        ret = av_exif_set_entry(logctx, ifd, extra_tag, AV_TIFF_IFD, 1, NULL, 0, &extra_ifd);
978
0
        av_exif_free(&extra_ifd);
979
0
        if (ret < 0 || !next || bytestream2_get_bytes_left(&gbytes) <= 0)
980
0
            break;
981
0
    }
982
983
0
finish:
984
0
    return bytestream2_tell(&gbytes) + off;
985
0
}
986
987
0
#define COLUMN_SEP(i, c) ((i) ? ((i) % (c) ? ", " : "\n") : "")
988
989
static int exif_ifd_to_dict(void *logctx, const char *prefix, const AVExifMetadata *ifd, AVDictionary **metadata)
990
0
{
991
0
    AVBPrint bp;
992
0
    int ret = 0;
993
0
    char *key = NULL;
994
0
    char *value = NULL;
995
996
0
    if (!prefix)
997
0
        prefix = "";
998
999
0
    for (uint16_t i = 0; i < ifd->count; i++) {
1000
0
        const AVExifEntry *entry = &ifd->entries[i];
1001
0
        const char *name = av_exif_get_tag_name(entry->id);
1002
0
        av_bprint_init(&bp, entry->count * 10, AV_BPRINT_SIZE_UNLIMITED);
1003
0
        if (*prefix)
1004
0
            av_bprintf(&bp, "%s/", prefix);
1005
0
        if (name)
1006
0
            av_bprintf(&bp, "%s", name);
1007
0
        else
1008
0
            av_bprintf(&bp, "0x%04X", entry->id);
1009
0
        ret = av_bprint_finalize(&bp, &key);
1010
0
        if (ret < 0)
1011
0
            goto end;
1012
0
        av_bprint_init(&bp, entry->count * 10, AV_BPRINT_SIZE_UNLIMITED);
1013
0
        switch (entry->type) {
1014
0
            case AV_TIFF_IFD:
1015
0
                ret = exif_ifd_to_dict(logctx, key, &entry->value.ifd, metadata);
1016
0
                if (ret < 0)
1017
0
                    goto end;
1018
0
                break;
1019
0
            case AV_TIFF_SHORT:
1020
0
            case AV_TIFF_LONG:
1021
0
                for (uint32_t j = 0; j < entry->count; j++)
1022
0
                    av_bprintf(&bp, "%s%7" PRIu32, COLUMN_SEP(j, 8), (uint32_t)entry->value.uint[j]);
1023
0
                break;
1024
0
            case AV_TIFF_SSHORT:
1025
0
            case AV_TIFF_SLONG:
1026
0
                for (uint32_t j = 0; j < entry->count; j++)
1027
0
                    av_bprintf(&bp, "%s%7" PRId32, COLUMN_SEP(j, 8), (int32_t)entry->value.sint[j]);
1028
0
                break;
1029
0
            case AV_TIFF_RATIONAL:
1030
0
            case AV_TIFF_SRATIONAL:
1031
0
                for (uint32_t j = 0; j < entry->count; j++)
1032
0
                    av_bprintf(&bp, "%s%7i:%-7i", COLUMN_SEP(j, 4), entry->value.rat[j].num, entry->value.rat[j].den);
1033
0
                break;
1034
0
            case AV_TIFF_DOUBLE:
1035
0
            case AV_TIFF_FLOAT:
1036
0
                for (uint32_t j = 0; j < entry->count; j++)
1037
0
                    av_bprintf(&bp, "%s%.15g", COLUMN_SEP(j, 4), entry->value.dbl[j]);
1038
0
                break;
1039
0
            case AV_TIFF_STRING:
1040
0
                av_bprintf(&bp, "%s", entry->value.str);
1041
0
                break;
1042
0
            case AV_TIFF_UNDEFINED:
1043
0
            case AV_TIFF_BYTE:
1044
0
                for (uint32_t j = 0; j < entry->count; j++)
1045
0
                    av_bprintf(&bp, "%s%3i", COLUMN_SEP(j, 16), entry->value.ubytes[j]);
1046
0
                break;
1047
0
            case AV_TIFF_SBYTE:
1048
0
                for (uint32_t j = 0; j < entry->count; j++)
1049
0
                    av_bprintf(&bp, "%s%3i", COLUMN_SEP(j, 16), entry->value.sbytes[j]);
1050
0
                break;
1051
0
        }
1052
0
        if (entry->type != AV_TIFF_IFD) {
1053
0
            if (!av_bprint_is_complete(&bp)) {
1054
0
                av_bprint_finalize(&bp, NULL);
1055
0
                ret = AVERROR(ENOMEM);
1056
0
                goto end;
1057
0
            }
1058
0
            ret = av_bprint_finalize(&bp, &value);
1059
0
            if (ret < 0)
1060
0
                goto end;
1061
0
            ret = av_dict_set(metadata, key, value, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);
1062
0
            key = NULL;
1063
0
            value = NULL;
1064
0
            if (ret < 0)
1065
0
                goto end;
1066
0
        } else {
1067
0
            av_freep(&key);
1068
0
        }
1069
0
    }
1070
1071
0
end:
1072
0
    av_freep(&key);
1073
0
    av_freep(&value);
1074
0
    return ret;
1075
0
}
1076
1077
int av_exif_ifd_to_dict(void *logctx, const AVExifMetadata *ifd, AVDictionary **metadata)
1078
0
{
1079
0
    return exif_ifd_to_dict(logctx, "", ifd, metadata);
1080
0
}
1081
1082
0
#define EXIF_COPY(fname, srcname) do { \
1083
0
    size_t sz; \
1084
0
    if (av_size_mult(src->count, sizeof(*(fname)), &sz) < 0) { \
1085
0
        ret = AVERROR(ENOMEM); \
1086
0
        goto end; \
1087
0
    } \
1088
0
    (fname) = av_memdup((srcname), sz); \
1089
0
    if (!(fname)) { \
1090
0
        ret = AVERROR(ENOMEM); \
1091
0
        goto end; \
1092
0
    } \
1093
0
} while (0)
1094
1095
static int exif_clone_entry(AVExifEntry *dst, const AVExifEntry *src)
1096
0
{
1097
0
    int ret = 0;
1098
1099
0
    memset(dst, 0, sizeof(*dst));
1100
1101
0
    dst->count = src->count;
1102
0
    dst->id = src->id;
1103
0
    dst->type = src->type;
1104
1105
0
    dst->ifd_offset = src->ifd_offset;
1106
0
    if (src->ifd_lead) {
1107
0
        dst->ifd_lead = av_memdup(src->ifd_lead, src->ifd_offset);
1108
0
        if (!dst->ifd_lead) {
1109
0
            ret = AVERROR(ENOMEM);
1110
0
            goto end;
1111
0
        }
1112
0
    } else {
1113
0
        dst->ifd_lead = NULL;
1114
0
    }
1115
1116
0
    switch(src->type) {
1117
0
        case AV_TIFF_IFD: {
1118
0
            AVExifMetadata *cloned = av_exif_clone_ifd(&src->value.ifd);
1119
0
            if (!cloned) {
1120
0
                ret = AVERROR(ENOMEM);
1121
0
                goto end;
1122
0
            }
1123
0
            dst->value.ifd = *cloned;
1124
0
            av_freep(&cloned);
1125
0
            break;
1126
0
        }
1127
0
        case AV_TIFF_SHORT:
1128
0
        case AV_TIFF_LONG:
1129
0
            EXIF_COPY(dst->value.uint, src->value.uint);
1130
0
            break;
1131
0
        case AV_TIFF_SLONG:
1132
0
        case AV_TIFF_SSHORT:
1133
0
            EXIF_COPY(dst->value.sint, src->value.sint);
1134
0
            break;
1135
0
        case AV_TIFF_RATIONAL:
1136
0
        case AV_TIFF_SRATIONAL:
1137
0
            EXIF_COPY(dst->value.rat, src->value.rat);
1138
0
            break;
1139
0
        case AV_TIFF_DOUBLE:
1140
0
        case AV_TIFF_FLOAT:
1141
0
            EXIF_COPY(dst->value.dbl, src->value.dbl);
1142
0
            break;
1143
0
        case AV_TIFF_BYTE:
1144
0
        case AV_TIFF_UNDEFINED:
1145
0
            EXIF_COPY(dst->value.ubytes, src->value.ubytes);
1146
0
            break;
1147
0
        case AV_TIFF_SBYTE:
1148
0
            EXIF_COPY(dst->value.sbytes, src->value.sbytes);
1149
0
            break;
1150
0
        case AV_TIFF_STRING:
1151
0
            dst->value.str = av_memdup(src->value.str, src->count+1);
1152
0
            if (!dst->value.str) {
1153
0
                ret = AVERROR(ENOMEM);
1154
0
                goto end;
1155
0
            }
1156
0
            break;
1157
0
    }
1158
1159
0
    return 0;
1160
1161
0
end:
1162
0
    av_freep(&dst->ifd_lead);
1163
0
    if (src->type == AV_TIFF_IFD)
1164
0
        av_exif_free(&dst->value.ifd);
1165
0
    else
1166
0
        av_freep(&dst->value.ptr);
1167
0
    memset(dst, 0, sizeof(*dst));
1168
1169
0
    return ret;
1170
0
}
1171
1172
static int exif_get_entry(void *logctx, AVExifMetadata *ifd, uint16_t id, int depth, AVExifEntry **value)
1173
0
{
1174
0
    int offset = 1;
1175
1176
0
    if (!ifd || ifd->count && !ifd->entries || !value)
1177
0
        return AVERROR(EINVAL);
1178
1179
0
    for (size_t i = 0; i < ifd->count; i++) {
1180
0
        if (ifd->entries[i].id == id) {
1181
0
            *value = &ifd->entries[i];
1182
0
            return i + offset;
1183
0
        }
1184
0
        if (ifd->entries[i].type == AV_TIFF_IFD) {
1185
0
            if (depth < 3) {
1186
0
                int ret = exif_get_entry(logctx, &ifd->entries[i].value.ifd, id, depth + 1, value);
1187
0
                if (ret)
1188
0
                    return ret < 0 ? ret : ret + offset;
1189
0
            }
1190
0
            offset += ifd->entries[i].value.ifd.count;
1191
0
        }
1192
0
    }
1193
1194
0
    return 0;
1195
0
}
1196
1197
int av_exif_get_entry(void *logctx, AVExifMetadata *ifd, uint16_t id, int flags, AVExifEntry **value)
1198
0
{
1199
0
    return exif_get_entry(logctx, ifd, id, (flags & AV_EXIF_FLAG_RECURSIVE) ? 0 : INT_MAX, value);
1200
0
}
1201
1202
int av_exif_set_entry(void *logctx, AVExifMetadata *ifd, uint16_t id, enum AVTiffDataType type,
1203
    uint32_t count, const uint8_t *ifd_lead, uint32_t ifd_offset, const void *value)
1204
0
{
1205
0
    void *temp;
1206
0
    int ret, offset;
1207
0
    AVExifEntry *entry = NULL;
1208
0
    AVExifEntry src = { 0 };
1209
1210
0
    if (!ifd || ifd->count && !ifd->entries
1211
0
             || ifd_lead && !ifd_offset || !ifd_lead && ifd_offset
1212
0
             || !value || ifd->count == 0xFFFFu)
1213
0
        return AVERROR(EINVAL);
1214
1215
0
    ret = av_exif_get_entry(logctx, ifd, id, 0, &entry);
1216
0
    if (ret < 0)
1217
0
        return ret;
1218
0
    offset = ret;
1219
1220
0
    if (entry) {
1221
0
        exif_free_entry(entry);
1222
0
    } else {
1223
0
        size_t required_size;
1224
0
        ret = av_size_mult(ifd->count + 1, sizeof(*ifd->entries), &required_size);
1225
0
        if (ret < 0)
1226
0
            return AVERROR(ENOMEM);
1227
0
        temp = av_fast_realloc(ifd->entries, &ifd->size, required_size);
1228
0
        if (!temp)
1229
0
            return AVERROR(ENOMEM);
1230
0
        ifd->entries = temp;
1231
0
        entry = &ifd->entries[ifd->count++];
1232
0
    }
1233
1234
0
    src.count = count;
1235
0
    src.id = id;
1236
0
    src.type = type;
1237
0
    src.ifd_lead = (uint8_t *) ifd_lead;
1238
0
    src.ifd_offset = ifd_offset;
1239
0
    if (type == AV_TIFF_IFD)
1240
0
        src.value.ifd = * (const AVExifMetadata *) value;
1241
0
    else
1242
0
        src.value.ptr = (void *) value;
1243
1244
0
    ret = exif_clone_entry(entry, &src);
1245
1246
0
    if (ret < 0) {
1247
        /* offset is the actual offset + 1 */
1248
0
        if (offset) {
1249
0
            size_t remaining = ifd->count - offset;
1250
            /* pop the entry off the IFD by shifting everything to the left */
1251
0
            memmove(&ifd->entries[offset - 1], &ifd->entries[offset], sizeof(*ifd->entries) * remaining);
1252
0
        }
1253
0
        ifd->count--;
1254
0
    }
1255
1256
0
    return ret;
1257
0
}
1258
1259
static int exif_remove_entry(void *logctx, AVExifMetadata *ifd, uint16_t id, int depth)
1260
0
{
1261
0
    int32_t index = -1;
1262
0
    int ret = 0;
1263
1264
0
    if (!ifd || ifd->count && !ifd->entries)
1265
0
        return AVERROR(EINVAL);
1266
1267
0
    for (size_t i = 0; i < ifd->count; i++) {
1268
0
        if (ifd->entries[i].id == id) {
1269
0
            index = i;
1270
0
            break;
1271
0
        }
1272
0
        if (ifd->entries[i].type == AV_TIFF_IFD && depth < 3) {
1273
0
            ret = exif_remove_entry(logctx, &ifd->entries[i].value.ifd, id, depth + 1);
1274
0
            if (ret)
1275
0
                return ret;
1276
0
        }
1277
0
    }
1278
1279
0
    if (index < 0)
1280
0
        return 0;
1281
0
    exif_free_entry(&ifd->entries[index]);
1282
1283
0
    if (index == --ifd->count) {
1284
0
        if (!index) {
1285
0
            av_freep(&ifd->entries);
1286
0
            ifd->size = 0;
1287
0
        }
1288
0
        return 1;
1289
0
    }
1290
1291
0
    memmove(&ifd->entries[index], &ifd->entries[index + 1], (ifd->count - index) * sizeof(*ifd->entries));
1292
1293
0
    return 1 + (ifd->count - index);
1294
0
}
1295
1296
int av_exif_remove_entry(void *logctx, AVExifMetadata *ifd, uint16_t id, int flags)
1297
0
{
1298
0
    return exif_remove_entry(logctx, ifd, id, (flags & AV_EXIF_FLAG_RECURSIVE) ? 0 : INT_MAX);
1299
0
}
1300
1301
AVExifMetadata *av_exif_clone_ifd(const AVExifMetadata *ifd)
1302
0
{
1303
0
    AVExifMetadata *ret = av_mallocz(sizeof(*ret));
1304
0
    if (!ret)
1305
0
        return NULL;
1306
1307
0
    ret->count = ifd->count;
1308
0
    if (ret->count) {
1309
0
        size_t required_size;
1310
0
        if (av_size_mult(ret->count, sizeof(*ret->entries), &required_size) < 0)
1311
0
            goto fail;
1312
0
        av_fast_mallocz(&ret->entries, &ret->size, required_size);
1313
0
        if (!ret->entries)
1314
0
            goto fail;
1315
0
    }
1316
1317
0
    for (size_t i = 0; i < ret->count; i++) {
1318
0
        const AVExifEntry *entry = &ifd->entries[i];
1319
0
        AVExifEntry *ret_entry = &ret->entries[i];
1320
0
        int status = exif_clone_entry(ret_entry, entry);
1321
0
        if (status < 0)
1322
0
            goto fail;
1323
0
    }
1324
1325
0
    return ret;
1326
1327
0
fail:
1328
0
    av_exif_free(ret);
1329
0
    av_free(ret);
1330
0
    return NULL;
1331
0
}
1332
1333
static const int rotation_lut[2][4] = {
1334
    {1, 8, 3, 6}, {4, 7, 2, 5},
1335
};
1336
1337
int av_exif_matrix_to_orientation(const int32_t *matrix)
1338
0
{
1339
0
    double rotation = av_display_rotation_get(matrix);
1340
    // determinant
1341
0
    int vflip = ((int64_t)matrix[0] * (int64_t)matrix[4]
1342
0
               - (int64_t)matrix[1] * (int64_t)matrix[3]) < 0;
1343
0
    if (!isfinite(rotation))
1344
0
        return 0;
1345
0
    int rot = (int)(rotation + 0.5);
1346
0
    rot = (((rot % 360) + 360) % 360) / 90;
1347
0
    return rotation_lut[vflip][rot];
1348
0
}
1349
1350
int av_exif_orientation_to_matrix(int32_t *matrix, int orientation)
1351
0
{
1352
0
    switch (orientation) {
1353
0
        case 1:
1354
0
            av_display_rotation_set(matrix, 0.0);
1355
0
            break;
1356
0
        case 2:
1357
0
            av_display_rotation_set(matrix, 0.0);
1358
0
            av_display_matrix_flip(matrix, 1, 0);
1359
0
            break;
1360
0
        case 3:
1361
0
            av_display_rotation_set(matrix, 180.0);
1362
0
            break;
1363
0
        case 4:
1364
0
            av_display_rotation_set(matrix, 180.0);
1365
0
            av_display_matrix_flip(matrix, 1, 0);
1366
0
            break;
1367
0
        case 5:
1368
0
            av_display_rotation_set(matrix, 90.0);
1369
0
            av_display_matrix_flip(matrix, 1, 0);
1370
0
            break;
1371
0
        case 6:
1372
0
            av_display_rotation_set(matrix, 90.0);
1373
0
            break;
1374
0
        case 7:
1375
0
            av_display_rotation_set(matrix, -90.0);
1376
0
            av_display_matrix_flip(matrix, 1, 0);
1377
0
            break;
1378
0
        case 8:
1379
0
            av_display_rotation_set(matrix, -90.0);
1380
0
            break;
1381
0
        default:
1382
0
            return AVERROR(EINVAL);
1383
0
    }
1384
1385
0
    return 0;
1386
0
}
1387
1388
int ff_exif_sanitize_ifd(void *logctx, const AVFrame *frame, AVExifMetadata *ifd)
1389
0
{
1390
0
    int ret = 0;
1391
0
    AVFrameSideData *sd_orient = NULL;
1392
0
    AVExifEntry *or = NULL;
1393
0
    AVExifEntry *iw = NULL;
1394
0
    AVExifEntry *ih = NULL;
1395
0
    AVExifEntry *pw = NULL;
1396
0
    AVExifEntry *ph = NULL;
1397
0
    uint64_t orientation = 1;
1398
0
    uint64_t w = frame->width;
1399
0
    uint64_t h = frame->height;
1400
0
    int rewrite = 0;
1401
1402
0
    sd_orient = av_frame_get_side_data(frame, AV_FRAME_DATA_DISPLAYMATRIX);
1403
1404
0
    if (sd_orient)
1405
0
        orientation = av_exif_matrix_to_orientation((int32_t *) sd_orient->data);
1406
0
    if (!orientation) {
1407
0
        av_log(logctx, AV_LOG_WARNING, "display matrix is singular\n");
1408
0
        orientation = 1;
1409
0
    }
1410
0
    if (orientation != 1)
1411
0
        av_log(logctx, AV_LOG_DEBUG, "matrix contains nontrivial EXIF orientation: %" PRIu64 "\n", orientation);
1412
1413
0
    for (size_t i = 0; i < ifd->count; i++) {
1414
0
        AVExifEntry *entry = &ifd->entries[i];
1415
0
        if (entry->id == ORIENTATION_TAG && entry->count > 0 && entry->type == AV_TIFF_SHORT) {
1416
0
            or = entry;
1417
0
            continue;
1418
0
        }
1419
0
        if (entry->id == IMAGE_WIDTH_TAG && entry->count > 0 && entry->type == AV_TIFF_LONG) {
1420
0
            iw = entry;
1421
0
            continue;
1422
0
        }
1423
0
        if (entry->id == IMAGE_LENGTH_TAG && entry->count > 0 && entry->type == AV_TIFF_LONG) {
1424
0
            ih = entry;
1425
0
            continue;
1426
0
        }
1427
0
        if (entry->id == EXIFIFD_TAG && entry->type == AV_TIFF_IFD) {
1428
0
            AVExifMetadata *exif = &entry->value.ifd;
1429
0
            for (size_t j = 0; j < exif->count; j++) {
1430
0
                AVExifEntry *exifentry = &exif->entries[j];
1431
0
                if (exifentry->id == PIXEL_X_TAG && exifentry->count > 0 && exifentry->type == AV_TIFF_SHORT) {
1432
0
                    pw = exifentry;
1433
0
                    continue;
1434
0
                }
1435
0
                if (exifentry->id == PIXEL_Y_TAG && exifentry->count > 0 && exifentry->type == AV_TIFF_SHORT) {
1436
0
                    ph = exifentry;
1437
0
                    continue;
1438
0
                }
1439
0
            }
1440
0
        }
1441
0
    }
1442
1443
0
    if (or && or->value.uint[0] != orientation) {
1444
0
        rewrite = 1;
1445
0
        or->value.uint[0] = orientation;
1446
0
    }
1447
0
    if (iw && iw->value.uint[0] != w) {
1448
0
        rewrite = 1;
1449
0
        iw->value.uint[0] = w;
1450
0
    }
1451
0
    if (ih && ih->value.uint[0] != h) {
1452
0
        rewrite = 1;
1453
0
        ih->value.uint[0] = h;
1454
0
    }
1455
0
    if (pw && pw->value.uint[0] != w) {
1456
0
        rewrite = 1;
1457
0
        pw->value.uint[0] = w;
1458
0
    }
1459
0
    if (ph && ph->value.uint[0] != h) {
1460
0
        rewrite = 1;
1461
0
        ph->value.uint[0] = h;
1462
0
    }
1463
0
    if (!or && orientation != 1) {
1464
0
        rewrite = 1;
1465
0
        ret = av_exif_set_entry(logctx, ifd, ORIENTATION_TAG, AV_TIFF_SHORT, 1, NULL, 0, &orientation);
1466
0
        if (ret < 0)
1467
0
            goto end;
1468
0
    }
1469
0
    if (!iw && w) {
1470
0
        rewrite = 1;
1471
0
        ret = av_exif_set_entry(logctx, ifd, IMAGE_WIDTH_TAG, AV_TIFF_LONG, 1, NULL, 0, &w);
1472
0
        if (ret < 0)
1473
0
            goto end;
1474
0
    }
1475
0
    if (!ih && h) {
1476
0
        rewrite = 1;
1477
0
        ret = av_exif_set_entry(logctx, ifd, IMAGE_LENGTH_TAG, AV_TIFF_LONG, 1, NULL, 0, &h);
1478
0
        if (ret < 0)
1479
0
            goto end;
1480
0
    }
1481
0
    if (!pw && w && w <= 0xFFFFu || !ph && h && h <= 0xFFFFu) {
1482
0
        AVExifMetadata *exif;
1483
0
        AVExifEntry *exif_entry;
1484
0
        int exif_found = av_exif_get_entry(logctx, ifd, EXIFIFD_TAG, 0, &exif_entry);
1485
0
        rewrite = 1;
1486
0
        if (exif_found < 0)
1487
0
            goto end;
1488
0
        if (exif_found > 0) {
1489
0
            exif = &exif_entry->value.ifd;
1490
0
        } else {
1491
0
            AVExifMetadata exif_new = { 0 };
1492
0
            ret = av_exif_set_entry(logctx, ifd, EXIFIFD_TAG, AV_TIFF_IFD, 1, NULL, 0, &exif_new);
1493
0
            if (ret < 0) {
1494
0
                av_exif_free(&exif_new);
1495
0
                goto end;
1496
0
            }
1497
0
            exif = &ifd->entries[ifd->count - 1].value.ifd;
1498
0
        }
1499
0
        if (!pw && w && w <= 0xFFFFu) {
1500
0
            ret = av_exif_set_entry(logctx, exif, PIXEL_X_TAG, AV_TIFF_SHORT, 1, NULL, 0, &w);
1501
0
            if (ret < 0)
1502
0
                goto end;
1503
0
        }
1504
0
        if (!ph && h && h <= 0xFFFFu) {
1505
0
            ret = av_exif_set_entry(logctx, exif, PIXEL_Y_TAG, AV_TIFF_SHORT, 1, NULL, 0, &h);
1506
0
            if (ret < 0)
1507
0
                goto end;
1508
0
        }
1509
0
    }
1510
1511
0
    return rewrite;
1512
1513
0
end:
1514
0
    return ret;
1515
0
}
1516
1517
int ff_exif_get_buffer(void *logctx, const AVFrame *frame, AVBufferRef **buffer_ptr, enum AVExifHeaderMode header_mode)
1518
0
{
1519
0
    AVFrameSideData *sd_exif = NULL;
1520
0
    AVBufferRef *buffer = NULL;
1521
0
    AVExifMetadata ifd = { 0 };
1522
0
    int ret = 0;
1523
0
    int rewrite = 0;
1524
1525
0
    if (!buffer_ptr || *buffer_ptr)
1526
0
        return AVERROR(EINVAL);
1527
1528
0
    sd_exif = av_frame_get_side_data(frame, AV_FRAME_DATA_EXIF);
1529
0
    if (!sd_exif && !av_frame_get_side_data(frame, AV_FRAME_DATA_DISPLAYMATRIX))
1530
0
        return 0;
1531
1532
0
    if (sd_exif) {
1533
0
        ret = av_exif_parse_buffer(logctx, sd_exif->data, sd_exif->size, &ifd, AV_EXIF_TIFF_HEADER);
1534
0
        if (ret < 0)
1535
0
            goto end;
1536
0
    }
1537
1538
0
    rewrite = ff_exif_sanitize_ifd(logctx, frame, &ifd);
1539
0
    if (rewrite < 0) {
1540
0
        ret = rewrite;
1541
0
        goto end;
1542
0
    }
1543
1544
    /*
1545
     * we always have to rewrite if the requested header mode
1546
     * does not match the internal header mode, which is always
1547
     * AV_EXIF_TIFF_HEADER inside FFmpeg.
1548
     *
1549
     * If ifd.count == 0 then there's no data to write at all.
1550
     * This is possible if the frame width and height are zero and the orientation is 1.
1551
     */
1552
0
    rewrite = (rewrite || header_mode != AV_EXIF_TIFF_HEADER) && ifd.count;
1553
1554
0
    if (rewrite) {
1555
0
        ret = av_exif_write(logctx, &ifd, &buffer, header_mode);
1556
0
        if (ret < 0)
1557
0
            goto end;
1558
1559
0
        *buffer_ptr = buffer;
1560
0
    } else if (sd_exif) {
1561
0
        *buffer_ptr = av_buffer_ref(sd_exif->buf);
1562
0
        if (!*buffer_ptr) {
1563
0
            ret = AVERROR(ENOMEM);
1564
0
            goto end;
1565
0
        }
1566
0
    }
1567
1568
0
    av_exif_free(&ifd);
1569
1570
0
    return !!(rewrite || sd_exif);
1571
1572
0
end:
1573
0
    av_exif_free(&ifd);
1574
0
    return ret;
1575
0
}