MythTV master
imagemetadata.h
Go to the documentation of this file.
1
8
9#ifndef IMAGEMETADATA_H
10#define IMAGEMETADATA_H
11
12#include <utility>
13
14// Qt headers
15#include <QCoreApplication> // for tr()
16#include <QDateTime>
17#include <QStringBuilder>
18#include <QStringList>
19
20// MythTV headers
21#include "mythmetaexp.h"
22
23
24// Exif 2.3 standard tag names, see http://www.exiv2.org/tags.html
25static constexpr const char* EXIF_TAG_ORIENTATION { "Exif.Image.Orientation" };
26static constexpr const char* EXIF_TAG_DATETIME { "Exif.Image.DateTime" };
27static constexpr const char* EXIF_TAG_DATE_FORMAT { "yyyy:MM:dd hh:mm:ss" };
28static constexpr const char* EXIF_TAG_IMAGEDESCRIPTION { "Exif.Image.ImageDescription" };
29static constexpr const char* EXIF_TAG_USERCOMMENT { "Exif.Photo.UserComment" };
30static constexpr uint16_t EXIF_PRINT_IMAGE_MATCHING { 0xc4a5 };
31
32// ffmpeg video tags
33static constexpr const char* FFMPEG_TAG_ORIENTATION { "rotate" };
34static constexpr const char* FFMPEG_TAG_DATETIME { "creation_time" };
35static constexpr const char* FFMPEG_TAG_DATE_FORMAT { "yyyy-MM-dd hh:mm:ss" };
36
37// Pseudo keys for passing Myth data as metadata tags.
38static constexpr const char* EXIF_MYTH_HOST { "Myth.host" };
39static constexpr const char* EXIF_MYTH_PATH { "Myth.path" };
40static constexpr const char* EXIF_MYTH_NAME { "Myth.name" };
41static constexpr const char* EXIF_MYTH_SIZE { "Myth.size" };
42static constexpr const char* EXIF_MYTH_ORIENT { "Myth.orient" };
43
44
46enum ImageFileTransform : std::uint8_t {
51 kFlipVertical = 4
52};
53
54
63{
64 Q_DECLARE_TR_FUNCTIONS(Orientation)
65public:
66 explicit Orientation(int composite)
67 : m_current(composite / 10), m_file(composite % 10) {}
68 Orientation(int current, int file) : m_current(current), m_file(file) {}
69
71 int Composite() const { return (m_current * 10) + m_file; }
72 int Transform(int transform);
73 int GetCurrent() const;
74 QString Description() const;
75
76 static int FromRotation(const QString &degrees);
77
78private:
79 static QString AsText(int orientation);
80
81 int Apply(int transform) const;
82
86 int m_file;
87};
88
89
92{
94public:
95 static ImageMetaData* FromPicture(const QString &filePath);
96 static ImageMetaData* FromVideo(const QString &filePath);
97
98 virtual ~ImageMetaData() = default;
99
101 static const QString kSeparator;
102
104 static QString ToString(const QString &name, const QString &label, const QString &value)
105 { return name % kSeparator % label % kSeparator % value; }
106
108 static QStringList FromString(const QString &str)
109 { return str.split(kSeparator); }
110
111 using TagMap = QMultiMap<QString, QStringList>;
112 static TagMap ToMap(const QStringList &tags);
113
114 virtual bool IsValid() = 0;
115 virtual QStringList GetAllTags() = 0;
116 virtual int GetOrientation(bool *exists = nullptr) = 0;
117 virtual QDateTime GetOriginalDateTime(bool *exists = nullptr) = 0;
118 virtual QString GetComment(bool *exists = nullptr) = 0;
119
120protected:
121 explicit ImageMetaData(QString filePath)
122 : m_filePath(std::move(filePath)) {}
123
125 QString m_filePath;
126};
127
128
129#endif // IMAGEMETADATA_H
130
Abstract class for image metadata.
Definition: imagemetadata.h:92
QMultiMap< QString, QStringList > TagMap
virtual QDateTime GetOriginalDateTime(bool *exists=nullptr)=0
virtual bool IsValid()=0
virtual QStringList GetAllTags()=0
static QString ToString(const QString &name, const QString &label, const QString &value)
Encodes metadata into a string as <tag name><tag label><tag value>
static const QString kSeparator
Unique separator to delimit fields within a string.
virtual QString GetComment(bool *exists=nullptr)=0
virtual ~ImageMetaData()=default
ImageMetaData(QString filePath)
QString m_filePath
Image filepath.
virtual int GetOrientation(bool *exists=nullptr)=0
static QStringList FromString(const QString &str)
Decodes metadata name, label, value from a string.
Q_DECLARE_TR_FUNCTIONS(ImageMetaData)
Encapsulates Exif orientation processing.
Definition: imagemetadata.h:63
Orientation(int current, int file)
Definition: imagemetadata.h:68
int Composite() const
Encode original & current orientation to a single Db field.
Definition: imagemetadata.h:71
int m_current
The orientation to use: the file orientation with user transformations applied.
Definition: imagemetadata.h:84
Orientation(int composite)
Definition: imagemetadata.h:66
int m_file
The orientation of the raw file image, as specified by the camera.
Definition: imagemetadata.h:86
static void Transform(SIMI *Simi, F_PT xo, F_PT yo, F_PT *x, F_PT *y)
Definition: ifs.cpp:290
static constexpr const char * EXIF_MYTH_ORIENT
Definition: imagemetadata.h:42
static constexpr const char * FFMPEG_TAG_DATETIME
Definition: imagemetadata.h:34
static constexpr const char * FFMPEG_TAG_ORIENTATION
Definition: imagemetadata.h:33
static constexpr const char * EXIF_MYTH_SIZE
Definition: imagemetadata.h:41
static constexpr const char * EXIF_TAG_ORIENTATION
Definition: imagemetadata.h:25
static constexpr const char * EXIF_TAG_USERCOMMENT
Definition: imagemetadata.h:29
static constexpr const char * EXIF_TAG_DATE_FORMAT
Definition: imagemetadata.h:27
static constexpr const char * EXIF_MYTH_HOST
Definition: imagemetadata.h:38
static constexpr const char * EXIF_TAG_DATETIME
Definition: imagemetadata.h:26
static constexpr uint16_t EXIF_PRINT_IMAGE_MATCHING
Definition: imagemetadata.h:30
ImageFileTransform
Image transformations.
Definition: imagemetadata.h:46
@ kFlipVertical
Reflect about horizontal axis.
Definition: imagemetadata.h:51
@ kRotateCCW
Rotate anti-clockwise.
Definition: imagemetadata.h:49
@ kFlipHorizontal
Reflect about vertical axis.
Definition: imagemetadata.h:50
@ kRotateCW
Rotate clockwise.
Definition: imagemetadata.h:48
@ kResetToExif
Reset to Exif value.
Definition: imagemetadata.h:47
static constexpr const char * EXIF_TAG_IMAGEDESCRIPTION
Definition: imagemetadata.h:28
static constexpr const char * EXIF_MYTH_NAME
Definition: imagemetadata.h:40
static constexpr const char * EXIF_MYTH_PATH
Definition: imagemetadata.h:39
static constexpr const char * FFMPEG_TAG_DATE_FORMAT
Definition: imagemetadata.h:35
unsigned short uint16_t
Definition: iso6937tables.h:3
#define META_PUBLIC
Definition: mythmetaexp.h:9
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
Definition: mythdate.cpp:15
STL namespace.
bool exists(str path)
Definition: xbmcvfs.py:51