summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoris Verria <doris.verria@qt.io>2021-12-09 12:48:07 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-12-09 21:26:56 +0000
commit80be54dd617763956c430e2bbbe7366681c35f11 (patch)
tree9de632c64ebf84e621f34fbea1e9bbb2aaaca6e5
parentc2c5b706f5031e6a20db1a2a9d873c8fe672aae2 (diff)
downloadqtmultimedia-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.mm50
-rw-r--r--src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h2
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);