diff options
author | Tim Blechmann <tim@klingt.org> | 2024-04-17 12:28:00 +0800 |
---|---|---|
committer | Tim Blechmann <tim@klingt.org> | 2024-04-26 13:53:23 +0800 |
commit | c8a20a5c99138d2fd064668bd0cccc1d8cadc75b (patch) | |
tree | 454fe5f09a208646fbd397a1ded679fcec3dc159 | |
parent | 99a7883607b4fe1fd8afaebe6ea87be5f4a36f2d (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>
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; |