diff options
author | Doris Verria <doris.verria@qt.io> | 2021-12-09 12:48:07 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-12-09 21:26:56 +0000 |
commit | 80be54dd617763956c430e2bbbe7366681c35f11 (patch) | |
tree | 9de632c64ebf84e621f34fbea1e9bbb2aaaca6e5 | |
parent | c2c5b706f5031e6a20db1a2a9d873c8fe672aae2 (diff) | |
download | qtmultimedia-80be54dd617763956c430e2bbbe7366681c35f11.tar.gz |
AVFMetaData: Add orientation metadata for video track
Add orientation metadata based on the video's native transform matrix.
This metadata is track specific.
Task-number: QTBUG-98306
Change-Id: I4303b5ba8039bfb27f087f805df53bc5bc23305b
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
(cherry picked from commit db7b7c404a2551b5c9063332707491aeeaebd614)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/multimedia/platform/darwin/common/avfmetadata.mm | 50 | ||||
-rw-r--r-- | src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h | 2 |
2 files changed, 41 insertions, 11 deletions
diff --git a/src/multimedia/platform/darwin/common/avfmetadata.mm b/src/multimedia/platform/darwin/common/avfmetadata.mm index 9111df44c..834b5ec1f 100644 --- a/src/multimedia/platform/darwin/common/avfmetadata.mm +++ b/src/multimedia/platform/darwin/common/avfmetadata.mm @@ -39,6 +39,7 @@ #include "avfmetadata_p.h" #include <private/qdarwinformatsinfo_p.h> +#include <private/avfmediaplayer_p.h> #include <QtCore/qbuffer.h> #include <QtCore/qiodevice.h> @@ -46,6 +47,7 @@ #include <QtCore/qlocale.h> #include <QtCore/qurl.h> #include <QImage> +#include <QtMultimedia/qvideoframe.h> #if QT_HAS_INCLUDE(<AppKit/AppKit.h>) #include <AppKit/AppKit.h> @@ -278,16 +280,44 @@ QMediaMetaData AVFMetaData::fromAsset(AVAsset *asset) QMediaMetaData AVFMetaData::fromAssetTrack(AVAssetTrack *asset) { QMediaMetaData metadata = fromAVMetadata([asset metadata]); - if (metadata.value(QMediaMetaData::Language).isNull()) { - auto *languageCode = asset.languageCode; - if (languageCode) { - // languageCode is encoded as ISO 639-2, which QLocale does not handle. - // Convert it to 639-1 first. - auto id = CFLocaleCreateCanonicalLanguageIdentifierFromString(kCFAllocatorDefault, - (__bridge CFStringRef)languageCode); - QString lang = QString::fromCFString(id); - CFRelease(id); - metadata.insert(QMediaMetaData::Language, QLocale::codeToLanguage(lang)); + if ([asset.mediaType isEqualToString:AVMediaTypeAudio]) { + if (metadata.value(QMediaMetaData::Language).isNull()) { + auto *languageCode = asset.languageCode; + if (languageCode) { + // languageCode is encoded as ISO 639-2, which QLocale does not handle. + // Convert it to 639-1 first. + auto id = CFLocaleCreateCanonicalLanguageIdentifierFromString(kCFAllocatorDefault, + (__bridge CFStringRef)languageCode); + QString lang = QString::fromCFString(id); + CFRelease(id); + metadata.insert(QMediaMetaData::Language, QLocale::codeToLanguage(lang)); + } + } + } + if ([asset.mediaType isEqualToString:AVMediaTypeVideo]) { + // add orientation + if (metadata.value(QMediaMetaData::Orientation).isNull()) { + int rotation = 0; + QVideoFrame::RotationAngle angle = QVideoFrame::Rotation0; + bool mirrored; + AVFMediaPlayer::videoOrientationForAssetTrack(asset, angle, mirrored); + Q_UNUSED(mirrored); + switch (angle) { + // metadata orientation angle is in clockwise direction + case QVideoFrame::Rotation90: + rotation = 270; + break; + case QVideoFrame::Rotation180: + rotation = 180; + break; + case QVideoFrame::Rotation270: + rotation = 90; + break; + default: + rotation = 0; + break; + } + metadata.insert(QMediaMetaData::Orientation, rotation); } } return metadata; diff --git a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h index 348c070ab..6993a28d7 100644 --- a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h +++ b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h @@ -109,7 +109,7 @@ public: QMediaMetaData metaData() const override; - void videoOrientationForAssetTrack(AVAssetTrack *track, + static void videoOrientationForAssetTrack(AVAssetTrack *track, QVideoFrame::RotationAngle &angle, bool &mirrored); |