aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfuzzard <fuzzard@kodi.tv>2024-06-24 17:54:58 +1000
committerfuzzard <fuzzard@kodi.tv>2024-06-26 19:22:19 +1000
commit6b970eee2af6000cabbc2bd3b00ee6248f2a00c6 (patch)
tree4a6df060ec444131d07d740c18d1adf40f162520
parenta7b858b1c4ca0e4563924f06835ee6a0ee93cf95 (diff)
[pictures][metadata] Handle old libexiv2 API
-rw-r--r--xbmc/pictures/metadata/ImageMetadataParser.cpp49
-rw-r--r--xbmc/pictures/metadata/ImageMetadataParser.h2
-rw-r--r--xbmc/pictures/metadata/test/TestMetadataExtraction.cpp4
3 files changed, 34 insertions, 21 deletions
diff --git a/xbmc/pictures/metadata/ImageMetadataParser.cpp b/xbmc/pictures/metadata/ImageMetadataParser.cpp
index 485fd8d974..aad8ade1b5 100644
--- a/xbmc/pictures/metadata/ImageMetadataParser.cpp
+++ b/xbmc/pictures/metadata/ImageMetadataParser.cpp
@@ -16,6 +16,14 @@
#include <limits>
#include <vector>
+#if (EXIV2_MAJOR_VERSION == 0) && (EXIV2_MINOR_VERSION < 28)
+#define EXIV_toUint32 toLong
+#define EXIV_toInt64 toLong
+#else
+#define EXIV_toUint32 toUint32
+#define EXIV_toInt64 toInt64
+#endif
+
using namespace XFILE;
namespace
@@ -75,7 +83,7 @@ std::unique_ptr<ImageMetadata> CImageMetadataParser::ExtractMetadata(const std::
CImageMetadataParser parser;
// extract metadata
- parser.ExtractCommonMetadata(image);
+ parser.ExtractCommonMetadata(*image);
parser.ExtractExif(image->exifData());
parser.ExtractIPTC(image->iptcData());
@@ -83,19 +91,20 @@ std::unique_ptr<ImageMetadata> CImageMetadataParser::ExtractMetadata(const std::
return std::move(parser.m_imageMetadata);
}
-void CImageMetadataParser::ExtractCommonMetadata(std::unique_ptr<Exiv2::Image>& image)
+void CImageMetadataParser::ExtractCommonMetadata(Exiv2::Image& image)
{
//! TODO: all these elements are generic should be moved out of the exif struct
- m_imageMetadata->height = image->pixelHeight();
- m_imageMetadata->width = image->pixelWidth();
- m_imageMetadata->fileComment = image->comment();
-
- if (image->imageType() == Exiv2::ImageType::jpeg)
+ m_imageMetadata->height = image.pixelHeight();
+ m_imageMetadata->width = image.pixelWidth();
+ m_imageMetadata->fileComment = image.comment();
+#if (EXIV2_MAJOR_VERSION >= 0) && (EXIV2_MINOR_VERSION >= 28) && (EXIV2_PATCH_VERSION >= 2)
+ if (image.imageType() == Exiv2::ImageType::jpeg)
{
- auto jpegImage = dynamic_cast<Exiv2::JpegImage*>(image.get());
+ auto jpegImage = dynamic_cast<Exiv2::JpegImage*>(&image);
m_imageMetadata->isColor = jpegImage->numColorComponents() == 3;
m_imageMetadata->encodingProcess = jpegImage->encodingProcess();
}
+#endif
}
void CImageMetadataParser::ExtractExif(Exiv2::ExifData& exifData)
@@ -121,7 +130,7 @@ void CImageMetadataParser::ExtractExif(Exiv2::ExifData& exifData)
}
else if (exifKey == "Exif.Image.Orientation")
{
- const int orientationValue = it->value().toUint32();
+ const int orientationValue = it->value().EXIV_toUint32();
if (orientationValue < 0 || orientationValue > 8)
{
CLog::LogF(LOGWARNING, "Exif: Undefined rotation value {}",
@@ -145,11 +154,11 @@ void CImageMetadataParser::ExtractExif(Exiv2::ExifData& exifData)
}
else if (exifKey == "Exif.Photo.ExposureProgram")
{
- m_imageMetadata->exifInfo.ExposureProgram = it->value().toUint32();
+ m_imageMetadata->exifInfo.ExposureProgram = it->value().EXIV_toUint32();
}
else if (exifKey == "Exif.Photo.ISOSpeedRatings")
{
- m_imageMetadata->exifInfo.ISOequivalent = it->value().toUint32();
+ m_imageMetadata->exifInfo.ISOequivalent = it->value().EXIV_toUint32();
}
else if (exifKey == "Exif.Photo.DateTimeOriginal")
{
@@ -184,11 +193,11 @@ void CImageMetadataParser::ExtractExif(Exiv2::ExifData& exifData)
}
else if (exifKey == "Exif.Photo.MeteringMode")
{
- m_imageMetadata->exifInfo.MeteringMode = it->value().toUint32();
+ m_imageMetadata->exifInfo.MeteringMode = it->value().EXIV_toUint32();
}
else if (exifKey == "Exif.Photo.Flash")
{
- m_imageMetadata->exifInfo.FlashUsed = it->value().toUint32();
+ m_imageMetadata->exifInfo.FlashUsed = it->value().EXIV_toUint32();
}
else if (exifKey == "Exif.Photo.FocalLength")
{
@@ -211,7 +220,7 @@ void CImageMetadataParser::ExtractExif(Exiv2::ExifData& exifData)
// Use largest of height and width to deal with images that have been
// rotated to portrait format.
{
- const int value = static_cast<int>(it->value().toInt64());
+ const int value = static_cast<int>(it->value().EXIV_toInt64());
if (m_imageWidth < value)
{
m_imageWidth = value;
@@ -224,7 +233,7 @@ void CImageMetadataParser::ExtractExif(Exiv2::ExifData& exifData)
}
else if (exifKey == "Exif.Photo.FocalPlaneResolutionUnit")
{
- const uint32_t value = it->value().toUint32();
+ const uint32_t value = it->value().EXIV_toUint32();
// see: https://exiftool.org/TagNames/EXIF.html
switch (value)
{
@@ -247,15 +256,15 @@ void CImageMetadataParser::ExtractExif(Exiv2::ExifData& exifData)
}
else if (exifKey == "Exif.Photo.ExposureMode")
{
- m_imageMetadata->exifInfo.ExposureMode = it->value().toUint32();
+ m_imageMetadata->exifInfo.ExposureMode = it->value().EXIV_toUint32();
}
else if (exifKey == "Exif.Photo.WhiteBalance")
{
- m_imageMetadata->exifInfo.Whitebalance = it->value().toUint32();
+ m_imageMetadata->exifInfo.Whitebalance = it->value().EXIV_toUint32();
}
else if (exifKey == "Exif.Photo.LightSource")
{
- m_imageMetadata->exifInfo.LightSource = it->value().toUint32();
+ m_imageMetadata->exifInfo.LightSource = it->value().EXIV_toUint32();
}
else if (exifKey == "Exif.Photo.DigitalZoomRatio")
{
@@ -266,7 +275,7 @@ void CImageMetadataParser::ExtractExif(Exiv2::ExifData& exifData)
// The focal length equivalent 35 mm is a 2.2 tag (defined as of April 2002)
// if its present, use it to compute equivalent focal length instead of
// computing it from sensor geometry and actual focal length.
- m_imageMetadata->exifInfo.FocalLength35mmEquiv = it->value().toUint32();
+ m_imageMetadata->exifInfo.FocalLength35mmEquiv = it->value().EXIV_toUint32();
}
else if (exifKey == "Exif.GPSInfo.GPSLatitudeRef")
{
@@ -308,7 +317,7 @@ void CImageMetadataParser::ExtractExif(Exiv2::ExifData& exifData)
}
else if (exifKey == "Exif.GPSInfo.GPSAltitudeRef")
{
- auto value = it->value().toUint32();
+ auto value = it->value().EXIV_toUint32();
if (value == 1) // below sea level
{
m_imageMetadata->exifInfo.GpsAlt = "-" + m_imageMetadata->exifInfo.GpsAlt;
diff --git a/xbmc/pictures/metadata/ImageMetadataParser.h b/xbmc/pictures/metadata/ImageMetadataParser.h
index 513355cbb8..f7bdd5115f 100644
--- a/xbmc/pictures/metadata/ImageMetadataParser.h
+++ b/xbmc/pictures/metadata/ImageMetadataParser.h
@@ -24,7 +24,7 @@ public:
private:
CImageMetadataParser();
- void ExtractCommonMetadata(std::unique_ptr<Exiv2::Image>& image);
+ void ExtractCommonMetadata(Exiv2::Image& image);
void ExtractExif(Exiv2::ExifData& exifData);
void ExtractIPTC(Exiv2::IptcData& iptcData);
diff --git a/xbmc/pictures/metadata/test/TestMetadataExtraction.cpp b/xbmc/pictures/metadata/test/TestMetadataExtraction.cpp
index 7b08118dfd..4a0edcfd7c 100644
--- a/xbmc/pictures/metadata/test/TestMetadataExtraction.cpp
+++ b/xbmc/pictures/metadata/test/TestMetadataExtraction.cpp
@@ -46,9 +46,11 @@ TEST_F(TestMetadataExtraction, TestGPSImage)
EXPECT_EQ(metadata->width, 1);
EXPECT_EQ(metadata->height, 1);
EXPECT_TRUE(metadata->fileComment.empty());
+#if (EXIV2_MAJOR_VERSION >= 0) && (EXIV2_MINOR_VERSION >= 28) && (EXIV2_PATCH_VERSION >= 2)
// format specific (but common) metadata
EXPECT_TRUE(metadata->isColor);
EXPECT_EQ(metadata->encodingProcess, "Baseline DCT, Huffman coding");
+#endif
}
TEST_F(TestMetadataExtraction, TestIPTC)
@@ -74,7 +76,9 @@ TEST_F(TestMetadataExtraction, TestIPTC)
EXPECT_EQ(metadata->width, 1);
EXPECT_EQ(metadata->height, 1);
EXPECT_TRUE(metadata->fileComment.empty());
+#if (EXIV2_MAJOR_VERSION >= 0) && (EXIV2_MINOR_VERSION >= 28) && (EXIV2_PATCH_VERSION >= 2)
// format specific (but common) metadata
EXPECT_TRUE(metadata->isColor);
EXPECT_EQ(metadata->encodingProcess, "Baseline DCT, Huffman coding");
+#endif
}