summaryrefslogtreecommitdiffstats
path: root/src/multimedia/platform/darwin
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-02-09 12:55:32 +0100
committerLars Knoll <lars.knoll@qt.io>2021-02-12 15:38:47 +0000
commit187419edb2c087063afc5931134d36692f4b39a4 (patch)
tree88d9117e2c6475f8c32d83b2ee09f27b2dba60a9 /src/multimedia/platform/darwin
parent3c59ba2b3ce96f578b2d677ecc1fbf7da0b2e27f (diff)
Rework the metadata handling
Get rid of metadata reader and writer controls. Instead use a simple cross platform value class to store meta data. The backend can then convert to and from whatever the native API expects. Change-Id: I7cf84bfbe8eef2a88615a52ba5afeec50a0652c8 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/multimedia/platform/darwin')
-rw-r--r--src/multimedia/platform/darwin/camera/avfcamerametadatacontrol.mm83
-rw-r--r--src/multimedia/platform/darwin/camera/avfcamerametadatacontrol_p.h81
-rw-r--r--src/multimedia/platform/darwin/camera/avfcameraservice.mm1
-rw-r--r--src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm8
-rw-r--r--src/multimedia/platform/darwin/camera/avfmediarecordercontrol_p.h4
-rw-r--r--src/multimedia/platform/darwin/camera/camera.pri2
-rw-r--r--src/multimedia/platform/darwin/mediaplayer/avfmediaplayercontrol.mm11
-rw-r--r--src/multimedia/platform/darwin/mediaplayer/avfmediaplayercontrol_p.h4
-rw-r--r--src/multimedia/platform/darwin/mediaplayer/avfmediaplayerservice.mm29
-rw-r--r--src/multimedia/platform/darwin/mediaplayer/avfmediaplayerservice_p.h3
-rw-r--r--src/multimedia/platform/darwin/mediaplayer/avfmediaplayersession.mm6
-rw-r--r--src/multimedia/platform/darwin/mediaplayer/avfmetadata.mm (renamed from src/multimedia/platform/darwin/mediaplayer/avfmediaplayermetadatacontrol.mm)92
-rw-r--r--src/multimedia/platform/darwin/mediaplayer/avfmetadata_p.h (renamed from src/multimedia/platform/darwin/mediaplayer/avfmediaplayermetadatacontrol_p.h)23
-rw-r--r--src/multimedia/platform/darwin/mediaplayer/mediaplayer.pri4
14 files changed, 43 insertions, 308 deletions
diff --git a/src/multimedia/platform/darwin/camera/avfcamerametadatacontrol.mm b/src/multimedia/platform/darwin/camera/avfcamerametadatacontrol.mm
deleted file mode 100644
index d346a7dee..000000000
--- a/src/multimedia/platform/darwin/camera/avfcamerametadatacontrol.mm
+++ /dev/null
@@ -1,83 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd and/or its subsidiary(-ies).
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "avfcamerametadatacontrol_p.h"
-#include "avfcamerasession_p.h"
-#include "avfcameraservice_p.h"
-#include "avfmediarecordercontrol_p.h"
-
-QT_USE_NAMESPACE
-
-//metadata support is not implemented yet
-
-AVFCameraMetaDataControl::AVFCameraMetaDataControl(AVFMediaRecorderControl *parent)
- : QMetaDataWriterControl(parent)
-{
-}
-
-AVFCameraMetaDataControl::~AVFCameraMetaDataControl()
-{
-}
-
-bool AVFCameraMetaDataControl::isMetaDataAvailable() const
-{
- return !m_tags.isEmpty();
-}
-
-bool AVFCameraMetaDataControl::isWritable() const
-{
- return false;
-}
-
-QVariant AVFCameraMetaDataControl::metaData(const QString &key) const
-{
- return m_tags.value(key);
-}
-
-void AVFCameraMetaDataControl::setMetaData(const QString &key, const QVariant &value)
-{
- m_tags.insert(key, value);
-}
-
-QStringList AVFCameraMetaDataControl::availableMetaData() const
-{
- return m_tags.keys();
-}
-
-#include "moc_avfcamerametadatacontrol_p.cpp"
diff --git a/src/multimedia/platform/darwin/camera/avfcamerametadatacontrol_p.h b/src/multimedia/platform/darwin/camera/avfcamerametadatacontrol_p.h
deleted file mode 100644
index 45addb946..000000000
--- a/src/multimedia/platform/darwin/camera/avfcamerametadatacontrol_p.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef AVFCAMERAMETADATACONTROL_H
-#define AVFCAMERAMETADATACONTROL_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <qmetadatawritercontrol.h>
-#include <QtCore/qvariant.h>
-
-QT_BEGIN_NAMESPACE
-
-class AVFMediaRecorderControl;
-
-class AVFCameraMetaDataControl : public QMetaDataWriterControl
-{
- Q_OBJECT
-public:
- AVFCameraMetaDataControl(AVFMediaRecorderControl *parent = nullptr);
- virtual ~AVFCameraMetaDataControl();
-
- bool isMetaDataAvailable() const override;
- bool isWritable() const override;
-
- QVariant metaData(const QString &key) const override;
- void setMetaData(const QString &key, const QVariant &value) override;
- QStringList availableMetaData() const override;
-
-private:
- QMap<QString, QVariant> m_tags;
-};
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice.mm b/src/multimedia/platform/darwin/camera/avfcameraservice.mm
index b327c8d17..0ed6b74ce 100644
--- a/src/multimedia/platform/darwin/camera/avfcameraservice.mm
+++ b/src/multimedia/platform/darwin/camera/avfcameraservice.mm
@@ -43,7 +43,6 @@
#include "avfcameraservice_p.h"
#include "avfcameracontrol_p.h"
#include "avfcamerasession_p.h"
-#include "avfcamerametadatacontrol_p.h"
#include "avfmediarecordercontrol_p.h"
#include "avfimagecapturecontrol_p.h"
#include "avfcamerarenderercontrol_p.h"
diff --git a/src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm b/src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm
index 983fd8357..e39161cfd 100644
--- a/src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm
+++ b/src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm
@@ -42,7 +42,6 @@
#include "avfcamerasession_p.h"
#include "avfcameraservice_p.h"
#include "avfcameracontrol_p.h"
-#include "avfcamerametadatacontrol_p.h"
#include "qaudiodeviceinfo.h"
#include "qmediadevicemanager.h"
@@ -151,8 +150,6 @@ AVFMediaRecorderControl::AVFMediaRecorderControl(AVFCameraService *service, QObj
connect(m_cameraControl, SIGNAL(captureModeChanged(QCamera::CaptureModes)), SLOT(setupSessionForCapture()));
connect(m_session, SIGNAL(readyToConfigureConnections()), SLOT(setupSessionForCapture()));
connect(m_session, SIGNAL(stateChanged(QCamera::State)), SLOT(setupSessionForCapture()));
-
- m_metaData = new AVFCameraMetaDataControl(this);
}
AVFMediaRecorderControl::~AVFMediaRecorderControl()
@@ -533,11 +530,6 @@ void AVFMediaRecorderControl::setEncoderSettings(const QMediaEncoderSettings &se
m_settings = settings;
}
-QMetaDataWriterControl *AVFMediaRecorderControl::metaDataControl()
-{
- return m_metaData;
-}
-
void AVFMediaRecorderControl::setState(QMediaRecorder::State state)
{
if (m_state == state)
diff --git a/src/multimedia/platform/darwin/camera/avfmediarecordercontrol_p.h b/src/multimedia/platform/darwin/camera/avfmediarecordercontrol_p.h
index 1d50ceb72..02a8581d2 100644
--- a/src/multimedia/platform/darwin/camera/avfmediarecordercontrol_p.h
+++ b/src/multimedia/platform/darwin/camera/avfmediarecordercontrol_p.h
@@ -68,7 +68,6 @@ QT_BEGIN_NAMESPACE
class AVFCameraSession;
class AVFCameraControl;
class AVFCameraService;
-class AVFCameraMetaDataControl;
class AVFMediaRecorderControl : public QMediaRecorderControl
{
@@ -96,8 +95,6 @@ public:
void setEncoderSettings(const QMediaEncoderSettings &settings) override;
- QMetaDataWriterControl *metaDataControl() override;
-
public Q_SLOTS:
void setState(QMediaRecorder::State state) override;
void setMuted(bool muted) override;
@@ -116,7 +113,6 @@ private:
AVFCameraControl *m_cameraControl;
AVFCameraSession *m_session;
AVCaptureDevice *m_audioCaptureDevice = nullptr;
- AVFCameraMetaDataControl *m_metaData = nullptr;
bool m_connected;
QUrl m_outputLocation;
diff --git a/src/multimedia/platform/darwin/camera/camera.pri b/src/multimedia/platform/darwin/camera/camera.pri
index 648c5c358..49aecdac4 100644
--- a/src/multimedia/platform/darwin/camera/camera.pri
+++ b/src/multimedia/platform/darwin/camera/camera.pri
@@ -1,7 +1,6 @@
HEADERS += \
$$PWD/avfcameradebug_p.h \
$$PWD/avfcameracontrol_p.h \
- $$PWD/avfcamerametadatacontrol_p.h \
$$PWD/avfimagecapturecontrol_p.h \
$$PWD/avfcameraservice_p.h \
$$PWD/avfcamerasession_p.h \
@@ -15,7 +14,6 @@ HEADERS += \
SOURCES += \
$$PWD/avfcameracontrol.mm \
- $$PWD/avfcamerametadatacontrol.mm \
$$PWD/avfimagecapturecontrol.mm \
$$PWD/avfcameraservice.mm \
$$PWD/avfcamerasession.mm \
diff --git a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayercontrol.mm b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayercontrol.mm
index bfc667509..1e55fb770 100644
--- a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayercontrol.mm
+++ b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayercontrol.mm
@@ -177,6 +177,17 @@ QAudioDeviceInfo AVFMediaPlayerControl::audioOutput() const
#endif
}
+QMediaMetaData AVFMediaPlayerControl::metaData() const
+{
+ return m_metaData;
+}
+
+void AVFMediaPlayerControl::setMetaData(const QMediaMetaData &metaData)
+{
+ m_metaData = metaData;
+ metaDataChanged();
+}
+
void AVFMediaPlayerControl::setPosition(qint64 pos)
{
m_session->setPosition(pos);
diff --git a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayercontrol_p.h b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayercontrol_p.h
index b4fd8dc5a..9b8018ecb 100644
--- a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayercontrol_p.h
+++ b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayercontrol_p.h
@@ -94,6 +94,9 @@ public:
bool setAudioOutput(const QAudioDeviceInfo &) override;
QAudioDeviceInfo audioOutput() const override;
+ QMediaMetaData metaData() const override;
+ void setMetaData(const QMediaMetaData &metaData);
+
public Q_SLOTS:
void setPosition(qint64 pos) override;
@@ -106,6 +109,7 @@ public Q_SLOTS:
private:
AVFMediaPlayerSession *m_session;
+ QMediaMetaData m_metaData;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayerservice.mm b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayerservice.mm
index b300c4c1a..32cc5fd27 100644
--- a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayerservice.mm
+++ b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayerservice.mm
@@ -40,7 +40,6 @@
#include "avfmediaplayerservice_p.h"
#include "avfmediaplayersession_p.h"
#include "avfmediaplayercontrol_p.h"
-#include "avfmediaplayermetadatacontrol_p.h"
#include "avfvideooutput_p.h"
#if QT_CONFIG(opengl)
#include "avfvideorenderercontrol_p.h"
@@ -56,9 +55,6 @@ AVFMediaPlayerService::AVFMediaPlayerService()
m_session = new AVFMediaPlayerSession(this);
m_control = new AVFMediaPlayerControl(this);
m_control->setSession(m_session);
- m_playerMetaDataControl = new AVFMediaPlayerMetaDataControl(m_session, this);
-
- connect(m_control, SIGNAL(mediaChanged(QMediaContent)), m_playerMetaDataControl, SLOT(updateTags()));
}
AVFMediaPlayerService::~AVFMediaPlayerService()
@@ -78,9 +74,6 @@ QObject *AVFMediaPlayerService::requestControl(const char *name)
if (qstrcmp(name, QMediaPlayerControl_iid) == 0)
return m_control;
- if (qstrcmp(name, QMetaDataReaderControl_iid) == 0)
- return m_playerMetaDataControl;
-
#if QT_CONFIG(opengl)
if (qstrcmp(name, QVideoRendererControl_iid) == 0) {
if (!m_videoOutput)
@@ -124,11 +117,6 @@ QMediaPlayerControl *AVFMediaPlayerService::player()
return m_control;
}
-QMetaDataReaderControl *AVFMediaPlayerService::dataReader()
-{
- return m_playerMetaDataControl;
-}
-
QVideoRendererControl *AVFMediaPlayerService::createVideoRenderer()
{
if (m_videoOutput)
@@ -152,20 +140,3 @@ QVideoWindowControl *AVFMediaPlayerService::createVideoWindow()
m_session->setVideoOutput(control);
return control;
}
-
-#if 0
-void listSupportedMimeTypes()
-{
- //Populate m_supportedMimeTypes with mimetypes AVAsset supports
- NSArray *mimeTypes = [AVURLAsset audiovisualMIMETypes];
- for (NSString *mimeType in mimeTypes)
- {
- m_supportedMimeTypes.append(QString::fromUtf8([mimeType UTF8String]));
- }
-#ifdef QT_DEBUG_AVF
- qDebug() << "AVFMediaPlayerServicePlugin::buildSupportedTypes";
- qDebug() << "Supported Types: " << m_supportedMimeTypes;
-#endif
-
-}
-#endif
diff --git a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayerservice_p.h b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayerservice_p.h
index f37c1e50f..2690c7828 100644
--- a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayerservice_p.h
+++ b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayerservice_p.h
@@ -57,7 +57,6 @@ QT_BEGIN_NAMESPACE
class AVFMediaPlayerSession;
class AVFMediaPlayerControl;
-class AVFMediaPlayerMetaDataControl;
class AVFVideoOutput;
class AVFMediaPlayerService : public QMediaPlatformPlayerInterface
@@ -71,7 +70,6 @@ public:
// QMediaPlatformPlayerInterface
QMediaPlayerControl *player() override;
- QMetaDataReaderControl *dataReader() override;
// QMediaStreamsControl *streams() override;
QVideoRendererControl *createVideoRenderer() override;
@@ -82,7 +80,6 @@ private:
AVFMediaPlayerSession *m_session = nullptr;
AVFMediaPlayerControl *m_control = nullptr;
QObject *m_videoOutput = nullptr;
- AVFMediaPlayerMetaDataControl *m_playerMetaDataControl = nullptr;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayersession.mm b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayersession.mm
index 7fa6d25c6..386e66ecd 100644
--- a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayersession.mm
+++ b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayersession.mm
@@ -39,7 +39,9 @@
#include "avfmediaplayersession_p.h"
#include "avfmediaplayerservice_p.h"
+#include "avfmediaplayercontrol_p.h"
#include "avfvideooutput_p.h"
+#include "avfmetadata_p.h"
#include <qpointer.h>
#include <QFileInfo>
@@ -945,6 +947,10 @@ void AVFMediaPlayerSession::processLoadStateChange(QMediaPlayer::State newState)
AVPlayerItem *playerItem = [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) playerItem];
+ // get the meta data
+ QMediaMetaData metaData = AVFMetaData::fromAsset(playerItem.asset);
+ static_cast<AVFMediaPlayerControl *>(m_service->player())->setMetaData(metaData);
+
if (playerItem) {
// Check each track for audio and video content
AVAssetTrack *videoTrack = nil;
diff --git a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayermetadatacontrol.mm b/src/multimedia/platform/darwin/mediaplayer/avfmetadata.mm
index 5a5780e52..0b6feace4 100644
--- a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayermetadatacontrol.mm
+++ b/src/multimedia/platform/darwin/mediaplayer/avfmetadata.mm
@@ -37,8 +37,7 @@
**
****************************************************************************/
-#include "avfmediaplayermetadatacontrol_p.h"
-#include "avfmediaplayersession_p.h"
+#include "avfmetadata_p.h"
#include <QtMultimedia/qmediametadata.h>
@@ -46,50 +45,15 @@
QT_USE_NAMESPACE
-AVFMediaPlayerMetaDataControl::AVFMediaPlayerMetaDataControl(AVFMediaPlayerSession *session, QObject *parent)
- : QMetaDataReaderControl(parent)
- , m_session(session)
- , m_asset(nullptr)
-{
- QObject::connect(m_session, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SLOT(updateTags()));
-}
-
-AVFMediaPlayerMetaDataControl::~AVFMediaPlayerMetaDataControl()
-{
-#ifdef QT_DEBUG_AVF
- qDebug() << Q_FUNC_INFO;
-#endif
-}
-
-bool AVFMediaPlayerMetaDataControl::isMetaDataAvailable() const
-{
- return !m_tags.isEmpty();
-}
-
-bool AVFMediaPlayerMetaDataControl::isWritable() const
-{
- return false;
-}
-
-QVariant AVFMediaPlayerMetaDataControl::metaData(const QString &key) const
-{
- return m_tags.value(key);
-}
-
-QStringList AVFMediaPlayerMetaDataControl::availableMetaData() const
-{
- return m_tags.keys();
-}
-
-static QString itemKey(AVMetadataItem *item)
+static std::optional<QMediaMetaData::Key> itemKey(AVMetadataItem *item)
{
NSString *keyString = [item commonKey];
if (keyString.length != 0) {
if ([keyString isEqualToString:AVMetadataCommonKeyTitle]) {
return QMediaMetaData::Title;
- } else if ([keyString isEqualToString: AVMetadataCommonKeySubject]) {
- return QMediaMetaData::SubTitle;
+// } else if ([keyString isEqualToString: AVMetadataCommonKeySubject]) {
+// return QMediaMetaData::SubTitle;
} else if ([keyString isEqualToString: AVMetadataCommonKeyDescription]) {
return QMediaMetaData::Description;
} else if ([keyString isEqualToString: AVMetadataCommonKeyPublisher]) {
@@ -108,54 +72,32 @@ static QString itemKey(AVMetadataItem *item)
return QMediaMetaData::Author;
} else if ([keyString isEqualToString: AVMetadataCommonKeyArtist]) {
return QMediaMetaData::ContributingArtist;
- } else if ([keyString isEqualToString: AVMetadataCommonKeyArtwork]) {
- return QMediaMetaData::PosterUrl;
+// } else if ([keyString isEqualToString: AVMetadataCommonKeyArtwork]) {
+// return QMediaMetaData::PosterUrl;
}
}
- return QString();
+ return std::nullopt;
}
-void AVFMediaPlayerMetaDataControl::updateTags()
+QMediaMetaData AVFMetaData::fromAsset(AVAsset *asset)
{
#ifdef QT_DEBUG_AVF
qDebug() << Q_FUNC_INFO;
#endif
- AVAsset *currentAsset = static_cast<AVAsset*>(m_session->currentAssetHandle());
-
- //Don't read the tags from the same asset more than once
- if (currentAsset == m_asset)
- return;
-
- m_asset = currentAsset;
-
- QVariantMap oldTags = m_tags;
- //Since we've changed assets, clear old tags
- m_tags.clear();
- bool changed = false;
+ QMediaMetaData metaData;
// TODO: also process ID3, iTunes and QuickTime metadata
- NSArray *metadataItems = [currentAsset commonMetadata];
+ NSArray *metadataItems = [asset commonMetadata];
for (AVMetadataItem* item in metadataItems) {
- const QString key = itemKey(item);
- if (!key.isEmpty()) {
- const QString value = QString::fromNSString([item stringValue]);
- if (!value.isNull()) {
- m_tags.insert(key, value);
- if (value != oldTags.value(key)) {
- changed = true;
- Q_EMIT metaDataChanged(key, value);
- }
- }
- }
- }
+ auto key = itemKey(item);
+ if (!key)
+ continue;
- if (oldTags.isEmpty() != m_tags.isEmpty()) {
- Q_EMIT metaDataAvailableChanged(!m_tags.isEmpty());
- changed = true;
+ const QString value = QString::fromNSString([item stringValue]);
+ if (!value.isNull())
+ metaData.insert(*key, value);
}
-
- if (changed)
- Q_EMIT metaDataChanged();
+ return metaData;
}
diff --git a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayermetadatacontrol_p.h b/src/multimedia/platform/darwin/mediaplayer/avfmetadata_p.h
index 067aa2487..c88a4084d 100644
--- a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayermetadatacontrol_p.h
+++ b/src/multimedia/platform/darwin/mediaplayer/avfmetadata_p.h
@@ -51,7 +51,7 @@
// We mean it.
//
-#include <QtMultimedia/QMetaDataReaderControl>
+#include <QtMultimedia/QMediaMetaData>
#include <QtCore/qvariant.h>
QT_BEGIN_NAMESPACE
@@ -60,27 +60,10 @@ Q_FORWARD_DECLARE_OBJC_CLASS(AVAsset);
class AVFMediaPlayerSession;
-class AVFMediaPlayerMetaDataControl : public QMetaDataReaderControl
+class AVFMetaData
{
- Q_OBJECT
public:
- explicit AVFMediaPlayerMetaDataControl(AVFMediaPlayerSession *session, QObject *parent = nullptr);
- virtual ~AVFMediaPlayerMetaDataControl();
-
- bool isMetaDataAvailable() const override;
- bool isWritable() const;
-
- QVariant metaData(const QString &key) const override;
- QStringList availableMetaData() const override;
-
-private Q_SLOTS:
- void updateTags();
-
-private:
- AVFMediaPlayerSession *m_session;
- QVariantMap m_tags;
- AVAsset *m_asset;
-
+ static QMediaMetaData fromAsset(AVAsset *asset);
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/darwin/mediaplayer/mediaplayer.pri b/src/multimedia/platform/darwin/mediaplayer/mediaplayer.pri
index 6c02ed23d..0aab9faa5 100644
--- a/src/multimedia/platform/darwin/mediaplayer/mediaplayer.pri
+++ b/src/multimedia/platform/darwin/mediaplayer/mediaplayer.pri
@@ -2,7 +2,7 @@ QT += opengl network
HEADERS += \
$$PWD/avfmediaplayercontrol_p.h \
- $$PWD/avfmediaplayermetadatacontrol_p.h \
+ $$PWD/avfmetadata_p.h \
$$PWD/avfmediaplayerservice_p.h \
$$PWD/avfmediaplayersession_p.h \
$$PWD/avfvideooutput_p.h \
@@ -10,7 +10,7 @@ HEADERS += \
SOURCES += \
$$PWD/avfmediaplayercontrol.mm \
- $$PWD/avfmediaplayermetadatacontrol.mm \
+ $$PWD/avfmetadata.mm \
$$PWD/avfmediaplayerservice.mm \
$$PWD/avfmediaplayersession.mm \
$$PWD/avfvideooutput.mm \