Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
exif.cc File Reference

The EXIF/IPTC/XMP tag half of what used to be common/exif.cc. More...

#include <glib.h>
#include <sys/stat.h>
#include <time.h>
#include <zlib.h>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <string>
#include <exiv2/exiv2.hpp>
#include "metadata/exif.h"
#include "metadata/exif_internal.h"
#include "common/conf.h"
#include "common/datetime.h"
#include "common/dng_opcode.h"
#include "common/logging.h"
#include "common/utility.h"
#include "database/tag_repository.h"
#include "math/math.h"
#include "metadata/colorlabels.h"
#include "metadata/metadata.h"
#include "metadata/notify.h"
#include "metadata/tags.h"
#include "system/macros.h"
#include "system/mem_alloc.h"
+ Include dependency graph for exif.cc:

Go to the source code of this file.

Macros

#define __STDC_FORMAT_MACROS
 
#define FIND_XMP_TAG(key)   dt_exif_read_xmp_tag(xmpData, &pos, key)
 
#define FIND_IPTC_TAG(key)   dt_exif_read_iptc_tag(iptcData, &pos, key)
 
#define FIND_EXIF_TAG(key)   dt_exif_read_exif_tag(exifData, &pos, key)
 
#define DT_IMAGE_USERCROP_EPSILON   1e-6f
 
#define COMPRESS_THRESHOLD   100
 
#define TO_BINARY(a)   (a > 57 ? a - 97 + 10 : a - 48)
 

Functions

static const char * _get_exiv2_type (const int type)
 
static void _get_xmp_tags (const char *prefix, GList **taglist)
 
static int _illu_to_temp (dt_dng_illuminant_t illu)
 
void dt_exif_set_exiv2_taglist ()
 
const GList * dt_exif_get_exiv2_taglist ()
 
static void _exif_import_tags (dt_image_t *img, Exiv2::XmpData::iterator &pos)
 
static void dt_strlcpy_to_utf8 (char *dest, size_t dest_max, Exiv2::ExifData::const_iterator &pos, Exiv2::ExifData &exifData)
 
void dt_remove_exif_keys (Exiv2::ExifData &exif, const char *keys[], unsigned int n_keys)
 Strip the given EXIF keys from exif, ignoring any that are absent.
 
static bool dt_exif_read_xmp_tag (Exiv2::XmpData &xmpData, Exiv2::XmpData::iterator *pos, string key)
 
bool dt_exif_decode_xmp_data (dt_image_t *img, Exiv2::XmpData &xmpData, int version, bool exif_read)
 Apply one XMP packet's metadata, tags and colour labels to img.
 
static bool dt_exif_read_iptc_tag (Exiv2::IptcData &iptcData, Exiv2::IptcData::const_iterator *pos, string key)
 
static bool _exif_decode_iptc_data (dt_image_t *img, Exiv2::IptcData &iptcData)
 
bool dt_exif_read_exif_tag (Exiv2::ExifData &exifData, Exiv2::ExifData::const_iterator *pos, string key)
 Read one EXIF tag into pos, FALSE if the image does not carry it.
 
static dt_image_usercrop_status_t _read_usercrop_candidate (Exiv2::ExifData &exifData, const char *key, dt_boundingbox_t crop)
 
static bool _usercrop_candidates_agree (const dt_boundingbox_t a, const dt_boundingbox_t b)
 
static bool _check_usercrop (Exiv2::ExifData &exifData, dt_image_t *img)
 
static gboolean _check_dng_opcodes (Exiv2::ExifData &exifData, dt_image_t *img)
 
static void _check_lens_correction_dng (Exiv2::ExifData &exifData, dt_image_t *img)
 
static void _check_lens_correction_sony (Exiv2::ExifData &exifData, dt_image_t *img)
 
static bool _read_fuji_9coef (Exiv2::ExifData::const_iterator posd, Exiv2::ExifData::const_iterator posc, Exiv2::ExifData::const_iterator posv, ls_vendor_fuji_t *f)
 
static bool _read_fuji_11coef (Exiv2::ExifData::const_iterator posd, Exiv2::ExifData::const_iterator posc, Exiv2::ExifData::const_iterator posv, ls_vendor_fuji_t *f)
 
static void _check_lens_correction_fuji (Exiv2::ExifData &exifData, dt_image_t *img)
 
static void _check_lens_correction_olympus (Exiv2::ExifData &exifData, dt_image_t *img)
 
static void _check_lens_correction_data (Exiv2::ExifData &exifData, dt_image_t *img)
 
void dt_exif_read_usercrop (dt_image_t *img, const char *filename)
 
void dt_exif_img_check_additional_tags (dt_image_t *img, const char *filename)
 
static void _find_datetime_taken (Exiv2::ExifData &exifData, Exiv2::ExifData::const_iterator pos, char *exif_datetime_taken)
 
static void _find_exif_maker (Exiv2::ExifData &exifData, Exiv2::ExifData::const_iterator pos, char *maker, const size_t m_size)
 
static void _find_exif_model (Exiv2::ExifData &exifData, Exiv2::ExifData::const_iterator pos, char *model, const size_t m_size)
 
static bool _exif_decode_exif_data (dt_image_t *img, Exiv2::ExifData &exifData)
 
int dt_exif_read_from_blob (dt_image_t *img, uint8_t *blob, const int size)
 
int dt_exif_get_thumbnail (const char *path, uint8_t **buffer, size_t *size, char **mime_type, int *width, int *height, int min_width)
 
int dt_exif_read (dt_image_t *img, const char *path)
 
int dt_exif_write_blob (uint8_t *blob, uint32_t size, const char *path, const int compressed)
 
char * dt_exif_xmp_encode (const unsigned char *input, const int len, int *output_len)
 
char * dt_exif_xmp_encode_internal (const unsigned char *input, const int len, int *output_len, gboolean do_compress)
 
unsigned char * dt_exif_xmp_decode (const char *input, const int len, int *output_len)
 
dt_colorspaces_color_profile_type_t dt_exif_get_color_space (const uint8_t *data, size_t size)
 
void dt_exif_get_datetime_taken (const uint8_t *data, size_t size, char *datetime_taken)
 
static void dt_exif_log_handler (int log_level, const char *message)
 
void dt_exif_init ()
 
void dt_exif_cleanup ()
 

Variables

static GList * exiv2_taglist = NULL
 

Detailed Description

The EXIF/IPTC/XMP tag half of what used to be common/exif.cc.

Cut out of a 4775-line translation unit that was doing two unrelated jobs. This one reads and writes what a photograph says about itself; the other – the XMP sidecar carrying the development – is common/xmp_sidecar.cc. See metadata/exif.h.

Definition in file exif.cc.

Macro Definition Documentation

◆ __STDC_FORMAT_MACROS

#define __STDC_FORMAT_MACROS

Definition at line 73 of file exif.cc.

◆ COMPRESS_THRESHOLD

#define COMPRESS_THRESHOLD   100

◆ DT_IMAGE_USERCROP_EPSILON

#define DT_IMAGE_USERCROP_EPSILON   1e-6f

Definition at line 696 of file exif.cc.

◆ FIND_EXIF_TAG

#define FIND_EXIF_TAG (   key)    dt_exif_read_exif_tag(exifData, &pos, key)

Definition at line 691 of file exif.cc.

◆ FIND_IPTC_TAG

#define FIND_IPTC_TAG (   key)    dt_exif_read_iptc_tag(iptcData, &pos, key)

Definition at line 594 of file exif.cc.

◆ FIND_XMP_TAG

#define FIND_XMP_TAG (   key)    dt_exif_read_xmp_tag(xmpData, &pos, key)

Definition at line 422 of file exif.cc.

◆ TO_BINARY

#define TO_BINARY (   a)    (a > 57 ? a - 97 + 10 : a - 48)

Function Documentation

◆ _check_dng_opcodes()

static gboolean _check_dng_opcodes ( Exiv2::ExifData &  exifData,
dt_image_t img 
)
static

◆ _check_lens_correction_data()

static void _check_lens_correction_data ( Exiv2::ExifData &  exifData,
dt_image_t img 
)
static

◆ _check_lens_correction_dng()

static void _check_lens_correction_dng ( Exiv2::ExifData &  exifData,
dt_image_t img 
)
static

Definition at line 826 of file exif.cc.

References DT_DEBUG_IMAGEIO, dt_vprint(), and dt_image_t::exif_correction.

Referenced by _check_lens_correction_data().

◆ _check_lens_correction_fuji()

static void _check_lens_correction_fuji ( Exiv2::ExifData &  exifData,
dt_image_t img 
)
static

◆ _check_lens_correction_olympus()

static void _check_lens_correction_olympus ( Exiv2::ExifData &  exifData,
dt_image_t img 
)
static

Definition at line 962 of file exif.cc.

References dt_exif_read_exif_tag(), dt_image_t::exif_correction, i, and TRUE.

Referenced by _check_lens_correction_data().

◆ _check_lens_correction_sony()

static void _check_lens_correction_sony ( Exiv2::ExifData &  exifData,
dt_image_t img 
)
static

Definition at line 845 of file exif.cc.

References dt_exif_read_exif_tag(), dt_image_t::exif_correction, and i.

Referenced by _check_lens_correction_data().

◆ _check_usercrop()

static bool _check_usercrop ( Exiv2::ExifData &  exifData,
dt_image_t img 
)
static

Resolve img->usercrop / img->usercrop_status from the file's DefaultUserCrop candidates.

Returns TRUE only for a valid, non-identity framing — the caller uses that to decide whether to advertise the file as carrying usable crop metadata. Every other outcome leaves the box at identity, so no failure mode can produce an automatic crop.

Definition at line 751 of file exif.cc.

References _read_usercrop_candidate(), _usercrop_candidates_agree(), DT_DEBUG_ALWAYS, DT_DEBUG_IMAGEIO, DT_IMAGE_USERCROP_ABSENT, DT_IMAGE_USERCROP_CONFLICT, DT_IMAGE_USERCROP_MALFORMED, DT_IMAGE_USERCROP_VALID, dt_print(), FALSE, i, dt_image_t::id, status, TRUE, dt_image_t::usercrop, and dt_image_t::usercrop_status.

Referenced by _exif_decode_exif_data(), dt_exif_img_check_additional_tags(), and dt_exif_read_usercrop().

◆ _exif_decode_exif_data()

static bool _exif_decode_exif_data ( dt_image_t img,
Exiv2::ExifData &  exifData 
)
static
Todo:
: Should the UserComment go into the description? Or do we need an extra field for this?
Todo:
: "Other" illuminant is currently unsupported
Todo:
: This is still a workaround

Definition at line 1152 of file exif.cc.

References _check_dng_opcodes(), _check_lens_correction_data(), _check_usercrop(), _find_datetime_taken(), _find_exif_maker(), _find_exif_model(), _illu_to_temp(), dt_image_t::colorspace, dt_image_t::d65_color_matrix, dt_datetime_exif_to_img(), DT_DATETIME_LENGTH, DT_DEBUG_IMAGEIO, dt_free, dt_get_debug_flags(), DT_IMAGE_COLORSPACE_ADOBE_RGB, DT_IMAGE_COLORSPACE_SRGB, DT_IMAGE_HAS_ADDITIONAL_DNG_TAGS, DT_IMAGE_HDR, dt_image_is_raw(), DT_IMAGE_MONOCHROME, dt_image_orientation_to_flip_bits(), dt_image_refresh_makermodel(), dt_image_set_xmp_rating(), DT_LS_CloudyWeather, DT_LS_CoolWhiteFluorescent, DT_LS_D50, DT_LS_D55, DT_LS_D65, DT_LS_D75, DT_LS_Daylight, DT_LS_DaylightFluorescent, DT_LS_DayWhiteFluorescent, DT_LS_FineWeather, DT_LS_Flash, DT_LS_Fluorescent, DT_LS_ISOStudioTungsten, DT_LS_Shade, DT_LS_StandardLightA, DT_LS_StandardLightB, DT_LS_StandardLightC, DT_LS_Tungsten, DT_LS_Unknown, DT_LS_WarmWhiteFluorescent, DT_LS_WhiteFluorescent, dt_metadata_set_import(), dt_strlcpy_to_utf8(), dt_tag_attach(), dt_tag_new(), dt_util_gps_elevation_to_number(), dt_util_gps_rationale_to_number(), dt_image_geoloc_t::elevation, dt_image_t::exif_aperture, dt_image_t::exif_crop, dt_image_t::exif_exposure, dt_image_t::exif_exposure_bias, dt_image_t::exif_focal_length, dt_image_t::exif_focus_distance, dt_image_t::exif_inited, dt_image_t::exif_iso, dt_image_t::exif_lens, dt_image_t::exif_maker, dt_image_t::exif_model, FALSE, dt_image_t::filename, FIND_EXIF_TAG, dt_image_t::flags, dt_image_t::geoloc, i, dt_image_t::id, dt_image_geoloc_t::latitude, dt_image_geoloc_t::longitude, mat3mul(), dt_image_t::orientation, sign, TRUE, and value.

Referenced by dt_exif_read(), and dt_exif_read_from_blob().

◆ _exif_decode_iptc_data()

◆ _exif_import_tags()

static void _exif_import_tags ( dt_image_t img,
Exiv2::XmpData::iterator &  pos 
)
static

◆ _find_datetime_taken()

static void _find_datetime_taken ( Exiv2::ExifData &  exifData,
Exiv2::ExifData::const_iterator  pos,
char *  exif_datetime_taken 
)
static

◆ _find_exif_maker()

static void _find_exif_maker ( Exiv2::ExifData &  exifData,
Exiv2::ExifData::const_iterator  pos,
char *  maker,
const size_t  m_size 
)
static

Definition at line 1107 of file exif.cc.

References dt_strlcpy_to_utf8(), FIND_EXIF_TAG, and maker.

Referenced by _exif_decode_exif_data().

◆ _find_exif_model()

static void _find_exif_model ( Exiv2::ExifData &  exifData,
Exiv2::ExifData::const_iterator  pos,
char *  model,
const size_t  m_size 
)
static

Definition at line 1130 of file exif.cc.

References dt_strlcpy_to_utf8(), FIND_EXIF_TAG, and model.

Referenced by _exif_decode_exif_data().

◆ _get_exiv2_type()

static const char * _get_exiv2_type ( const int  type)
static

Definition at line 150 of file exif.cc.

References type.

Referenced by _get_xmp_tags(), and dt_exif_set_exiv2_taglist().

◆ _get_xmp_tags()

static void _get_xmp_tags ( const char *  prefix,
GList **  taglist 
)
static

Definition at line 215 of file exif.cc.

References _get_exiv2_type(), dt_util_dstrcat(), and i.

Referenced by dt_exif_set_exiv2_taglist().

◆ _illu_to_temp()

◆ _read_fuji_11coef()

static bool _read_fuji_11coef ( Exiv2::ExifData::const_iterator  posd,
Exiv2::ExifData::const_iterator  posc,
Exiv2::ExifData::const_iterator  posv,
ls_vendor_fuji_t *  f 
)
static

Definition at line 895 of file exif.cc.

References f, and i.

Referenced by _check_lens_correction_fuji().

◆ _read_fuji_9coef()

static bool _read_fuji_9coef ( Exiv2::ExifData::const_iterator  posd,
Exiv2::ExifData::const_iterator  posc,
Exiv2::ExifData::const_iterator  posv,
ls_vendor_fuji_t *  f 
)
static

Definition at line 876 of file exif.cc.

References f, and i.

Referenced by _check_lens_correction_fuji().

◆ _read_usercrop_candidate()

static dt_image_usercrop_status_t _read_usercrop_candidate ( Exiv2::ExifData &  exifData,
const char *  key,
dt_boundingbox_t  crop 
)
static

Read one DefaultUserCrop candidate and classify it.

The DNG spec (tag 51125 / 0xC7B5) defines four unsigned rationals in (top, left, bottom, right) order, normalized against the DefaultCropOrigin/DefaultCropSize rectangle, with (0, 0, 1, 1) as the identity. exiv2 only knows the tag by name from 0.27.4, hence the lookup by tag number.

Validation is the spec's own contract and nothing else. In particular there is deliberately no minimum-size heuristic: the inherited "each side must span more than 5%" test rejected standards-valid narrow crops while still accepting out-of-range ones, so it was never tag validation. Malformed values are reported as such, never clamped into a plausible rectangle.

Definition at line 710 of file exif.cc.

References DT_IMAGE_USERCROP_ABSENT, DT_IMAGE_USERCROP_IDENTITY, DT_IMAGE_USERCROP_MALFORMED, DT_IMAGE_USERCROP_VALID, i, and key.

Referenced by _check_usercrop().

◆ _usercrop_candidates_agree()

static bool _usercrop_candidates_agree ( const dt_boundingbox_t  a,
const dt_boundingbox_t  b 
)
static

Definition at line 737 of file exif.cc.

References DT_IMAGE_USERCROP_EPSILON, and i.

Referenced by _check_usercrop().

◆ dt_exif_cleanup()

void dt_exif_cleanup ( )

Definition at line 2443 of file exif.cc.

Referenced by dt_cleanup().

◆ dt_exif_decode_xmp_data()

◆ dt_exif_get_color_space()

dt_colorspaces_color_profile_type_t dt_exif_get_color_space ( const uint8_t *  data,
size_t  size 
)

look for color space hints in data and tell the caller if it's sRGB, AdobeRGB or something else. used for mipmaps

Definition at line 2330 of file exif.cc.

References DT_COLORSPACE_ADOBERGB, DT_COLORSPACE_DISPLAY, DT_COLORSPACE_SRGB, and size.

Referenced by dt_imageio_jpeg_read_color_space().

◆ dt_exif_get_datetime_taken()

void dt_exif_get_datetime_taken ( const uint8_t *  data,
size_t  size,
char *  datetime_taken 
)

look for datetime_taken in data. used for gphoto downloads

Definition at line 2375 of file exif.cc.

References _find_datetime_taken(), and size.

◆ dt_exif_get_exiv2_taglist()

const GList * dt_exif_get_exiv2_taglist ( )

get the list of available tags from Exvi2 must not be freed

Definition at line 361 of file exif.cc.

References dt_exif_set_exiv2_taglist(), and exiv2_taglist.

Referenced by _exif_get_exiv2_tag_type(), and dt_lib_export_metadata_configuration_dialog().

◆ dt_exif_get_thumbnail()

int dt_exif_get_thumbnail ( const char *  path,
uint8_t **  buffer,
size_t *  size,
char **  mime_type,
int *  width,
int *  height,
int  min_width 
)

Get the largest possible thumbnail from the image

Definition at line 1929 of file exif.cc.

References DT_DEBUG_LIGHTTABLE, dt_print(), height, IS_NULL_PTR, preview, selected, size, WIDEN, and width.

Referenced by dt_imageio_large_thumbnail().

◆ dt_exif_img_check_additional_tags()

void dt_exif_img_check_additional_tags ( dt_image_t img,
const char *  filename 
)

Reads exif tags that are not cached in the database

Definition at line 1055 of file exif.cc.

References _check_dng_opcodes(), _check_lens_correction_data(), _check_usercrop(), and WIDEN.

Referenced by dt_imageio_open_rawspeed().

◆ dt_exif_init()

void dt_exif_init ( )

thread safe init and cleanup.

Definition at line 2403 of file exif.cc.

References dt_exif_log_handler().

Referenced by dt_init().

◆ dt_exif_log_handler()

static void dt_exif_log_handler ( int  log_level,
const char *  message 
)
static

Definition at line 2393 of file exif.cc.

References DT_DEBUG_CAMERA_SUPPORT, and dt_print().

Referenced by dt_exif_init().

◆ dt_exif_read()

◆ dt_exif_read_exif_tag()

bool dt_exif_read_exif_tag ( Exiv2::ExifData &  exifData,
Exiv2::ExifData::const_iterator *  pos,
std::string  key 
)

Read one EXIF tag into pos, FALSE if the image does not carry it.

Behind the FIND_EXIF_TAG() macro in exif.cc; the sidecar reader calls it directly, on the old EXIF block of an image being re-read.

Definition at line 676 of file exif.cc.

References key.

Referenced by _check_lens_correction_fuji(), _check_lens_correction_olympus(), _check_lens_correction_sony(), and dt_exif_xmp_attach_export().

◆ dt_exif_read_from_blob()

int dt_exif_read_from_blob ( dt_image_t img,
uint8_t *  blob,
const int  size 
)
Todo:
: can this blob also contain xmp and iptc data?

Definition at line 1909 of file exif.cc.

References _exif_decode_exif_data(), dt_image_t::filename, res, and size.

Referenced by dt_imageio_open_exr().

◆ dt_exif_read_iptc_tag()

static bool dt_exif_read_iptc_tag ( Exiv2::IptcData &  iptcData,
Exiv2::IptcData::const_iterator *  pos,
string  key 
)
static

Definition at line 581 of file exif.cc.

References key.

◆ dt_exif_read_usercrop()

void dt_exif_read_usercrop ( dt_image_t img,
const char *  filename 
)

Reads only the DNG DefaultUserCrop tag into img->usercrop / img->usercrop_status.

Narrow entry point for consumers that need the camera framing without decoding the raw and without the side effects of the full additional-tags read (DNG opcodes allocate gain maps). Always leaves a definite status, never DT_IMAGE_USERCROP_UNKNOWN.

Definition at line 1031 of file exif.cc.

References _check_usercrop(), DT_IMAGE_USERCROP_ABSENT, dt_image_t::usercrop, dt_image_t::usercrop_status, and WIDEN.

Referenced by dt_image_resolve_usercrop().

◆ dt_exif_read_xmp_tag()

static bool dt_exif_read_xmp_tag ( Exiv2::XmpData &  xmpData,
Exiv2::XmpData::iterator *  pos,
string  key 
)
static

Definition at line 409 of file exif.cc.

References key.

◆ dt_exif_set_exiv2_taglist()

void dt_exif_set_exiv2_taglist ( )

set the list of available tags from Exvi2

Definition at line 271 of file exif.cc.

References _get_exiv2_type(), _get_xmp_tags(), dt_util_dstrcat(), and exiv2_taglist.

Referenced by dt_exif_get_exiv2_taglist(), and dt_init().

◆ dt_exif_write_blob()

int dt_exif_write_blob ( uint8_t *  blob,
uint32_t  size,
const char *  path,
const int  compressed 
)

write blob to file exif. merges with existing exif information.

Definition at line 2057 of file exif.cc.

References dt_remove_exif_keys(), i, key, size, and WIDEN.

Referenced by dt_imageio_write_dng(), write_image(), write_image(), write_image(), and write_image().

◆ dt_exif_xmp_decode()

unsigned char * dt_exif_xmp_decode ( const char *  input,
const int  len,
int *  output_len 
)

◆ dt_exif_xmp_encode()

char * dt_exif_xmp_encode ( const unsigned char *  input,
const int  len,
int *  output_len 
)

encode / decode op params.

Used by the XMP sidecar to serialise module parameter blobs, and by anything that has to read one back; they are here rather than beside the sidecar because they are a codec, not a document format – common/styles.c and common/presets.c use them too.

Definition at line 2116 of file exif.cc.

References COMPRESS_THRESHOLD, dt_conf_get_string(), dt_exif_xmp_encode_internal(), dt_free, FALSE, and TRUE.

Referenced by _exif_xmp_append_history_hash(), _init_presets(), _write_item(), _xmp_append_history(), _xmp_append_mask(), and dt_presets_save_to_file().

◆ dt_exif_xmp_encode_internal()

char * dt_exif_xmp_encode_internal ( const unsigned char *  input,
const int  len,
int *  output_len,
gboolean  do_compress 
)

Definition at line 2142 of file exif.cc.

References dt_free, factor, i, IS_NULL_PTR, and MIN.

Referenced by dt_exif_xmp_encode(), encode_colorchecker(), and encode_tonecurve().

◆ dt_remove_exif_keys()

void dt_remove_exif_keys ( Exiv2::ExifData &  exif,
const char *  keys[],
unsigned int  n_keys 
)

Strip the given EXIF keys from exif, ignoring any that are absent.

Definition at line 389 of file exif.cc.

References i.

Referenced by dt_exif_read_blob(), dt_exif_write_blob(), and dt_remove_exif_geotag().

◆ dt_strlcpy_to_utf8()

static void dt_strlcpy_to_utf8 ( char *  dest,
size_t  dest_max,
Exiv2::ExifData::const_iterator &  pos,
Exiv2::ExifData &  exifData 
)
static

Definition at line 372 of file exif.cc.

References dt_free, and IS_NULL_PTR.

Referenced by _exif_decode_exif_data(), _find_datetime_taken(), _find_exif_maker(), and _find_exif_model().

Variable Documentation

◆ exiv2_taglist

GList* exiv2_taglist = NULL
static

Definition at line 126 of file exif.cc.

Referenced by dt_exif_get_exiv2_taglist(), and dt_exif_set_exiv2_taglist().