summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-04-17 12:28:00 +0800
committerTim Blechmann <tim@klingt.org>2024-04-26 13:53:23 +0800
commitc8a20a5c99138d2fd064668bd0cccc1d8cadc75b (patch)
tree454fe5f09a208646fbd397a1ded679fcec3dc159
parent99a7883607b4fe1fd8afaebe6ea87be5f4a36f2d (diff)
GStreamer: metadata - fix extraction of rotation metadata
Pick-to: 6.5 6.7 Change-Id: Ic5d27ff7c763e5dd05af2f7205028985d97ae650 Reviewed-by: Artem Dyomin <artem.dyomin@qt.io> Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgstreamermetadata.cpp29
-rw-r--r--tests/auto/unit/multimedia/gstreamer_backend/tst_gstreamer_backend.cpp32
-rw-r--r--tests/auto/unit/multimedia/gstreamer_backend/tst_gstreamer_backend.h2
3 files changed, 58 insertions, 5 deletions
diff --git a/src/plugins/multimedia/gstreamer/common/qgstreamermetadata.cpp b/src/plugins/multimedia/gstreamer/common/qgstreamermetadata.cpp
index b02e3e40f..3567013f7 100644
--- a/src/plugins/multimedia/gstreamer/common/qgstreamermetadata.cpp
+++ b/src/plugins/multimedia/gstreamer/common/qgstreamermetadata.cpp
@@ -3,6 +3,7 @@
#include "qgstreamermetadata_p.h"
#include <QtMultimedia/qmediametadata.h>
+#include <QtMultimedia/qtvideo.h>
#include <QtCore/qdebug.h>
#include <QtCore/qdatetime.h>
#include <QtCore/qlocale.h>
@@ -145,6 +146,8 @@ const char *keyToTag(QMediaMetaData::Key key)
//internal
void addTagToMap(const GstTagList *list, const gchar *tag, gpointer user_data)
{
+ using namespace std::string_view_literals;
+
QMediaMetaData::Key key = tagToKey(tag);
if (key == QMediaMetaData::Key(-1))
return;
@@ -158,13 +161,29 @@ void addTagToMap(const GstTagList *list, const gchar *tag, gpointer user_data)
switch (G_VALUE_TYPE(&val)) {
case G_TYPE_STRING: {
const gchar *str_value = g_value_get_string(&val);
- if (key == QMediaMetaData::Language) {
- map->insert(key,
- QVariant::fromValue(QLocale::codeToLanguage(QString::fromUtf8(str_value),
- QLocale::ISO639Part2)));
+
+ switch (key) {
+ case QMediaMetaData::Language: {
+ map->emplace(key,
+ QVariant::fromValue(QLocale::codeToLanguage(QString::fromUtf8(str_value),
+ QLocale::ISO639Part2)));
break;
}
- map->insert(key, QString::fromUtf8(str_value));
+ case QMediaMetaData::Orientation: {
+ if (str_value == "rotate-90"sv)
+ map->emplace(key, QVariant::fromValue(QtVideo::Rotation::Clockwise90));
+ else if (str_value == "rotate-180"sv)
+ map->emplace(key, QVariant::fromValue(QtVideo::Rotation::Clockwise180));
+ else if (str_value == "rotate-270"sv)
+ map->emplace(key, QVariant::fromValue(QtVideo::Rotation::Clockwise270));
+ else if (str_value == "rotate-0"sv)
+ map->emplace(key, QVariant::fromValue(QtVideo::Rotation::None));
+ break;
+ }
+ default:
+ map->emplace(key, QString::fromUtf8(str_value));
+ break;
+ };
break;
}
case G_TYPE_INT:
diff --git a/tests/auto/unit/multimedia/gstreamer_backend/tst_gstreamer_backend.cpp b/tests/auto/unit/multimedia/gstreamer_backend/tst_gstreamer_backend.cpp
index 3b4577ca2..2fb4a26c2 100644
--- a/tests/auto/unit/multimedia/gstreamer_backend/tst_gstreamer_backend.cpp
+++ b/tests/auto/unit/multimedia/gstreamer_backend/tst_gstreamer_backend.cpp
@@ -24,6 +24,38 @@ void tst_GStreamer::metadata_fromGstTagList()
QCOMPARE(parsed.stringValue(QMediaMetaData::Comment), u"yada"_s);
}
+void tst_GStreamer::metadata_fromGstTagList_extractsOrientation()
+{
+ QFETCH(QByteArray, taglist);
+ QFETCH(QtVideo::Rotation, rotation);
+
+ QGstTagListHandle tagList{
+ gst_tag_list_new_from_string(taglist.constData()),
+ QGstTagListHandle::NeedsRef,
+ };
+
+ QGstreamerMetaData parsed = QGstreamerMetaData::fromGstTagList(tagList.get());
+ QCOMPARE(parsed[QMediaMetaData::Orientation].value<QtVideo::Rotation>(), rotation);
+}
+
+void tst_GStreamer::metadata_fromGstTagList_extractsOrientation_data()
+{
+ QTest::addColumn<QByteArray>("taglist");
+ QTest::addColumn<QtVideo::Rotation>("rotation");
+
+ QTest::newRow("no rotation") << R"(taglist, title="My Video", comment="yada")"_ba
+ << QtVideo::Rotation::None;
+ QTest::newRow("90 degree")
+ << R"(taglist, title="My Video", comment="yada", image-orientation=(string)rotate-90)"_ba
+ << QtVideo::Rotation::Clockwise90;
+ QTest::newRow("180 degree")
+ << R"(taglist, title="My Video", comment="yada", image-orientation=(string)rotate-180)"_ba
+ << QtVideo::Rotation::Clockwise180;
+ QTest::newRow("270 degree")
+ << R"(taglist, title="My Video", comment="yada", image-orientation=(string)rotate-270)"_ba
+ << QtVideo::Rotation::Clockwise270;
+}
+
QTEST_GUILESS_MAIN(tst_GStreamer)
#include "moc_tst_gstreamer_backend.cpp"
diff --git a/tests/auto/unit/multimedia/gstreamer_backend/tst_gstreamer_backend.h b/tests/auto/unit/multimedia/gstreamer_backend/tst_gstreamer_backend.h
index 5bac3a599..88c77332a 100644
--- a/tests/auto/unit/multimedia/gstreamer_backend/tst_gstreamer_backend.h
+++ b/tests/auto/unit/multimedia/gstreamer_backend/tst_gstreamer_backend.h
@@ -16,6 +16,8 @@ class tst_GStreamer : public QObject
private slots:
void metadata_fromGstTagList();
+ void metadata_fromGstTagList_extractsOrientation();
+ void metadata_fromGstTagList_extractsOrientation_data();
private:
QGstreamerIntegration integration;