summaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--examples/multimediawidgets/camera/camera.cpp2
-rw-r--r--examples/multimediawidgets/player/player.cpp20
-rw-r--r--src/imports/multimedia/qdeclarativeaudio.cpp2
-rw-r--r--src/imports/multimedia/qdeclarativeaudio_p.h2
-rw-r--r--src/imports/multimedia/qdeclarativecamera.cpp1
-rw-r--r--src/imports/multimedia/qdeclarativecameracapture.cpp22
-rw-r--r--src/imports/multimedia/qdeclarativecameracapture_p.h8
-rw-r--r--src/imports/multimedia/qdeclarativecamerarecorder.cpp12
-rw-r--r--src/imports/multimedia/qdeclarativecamerarecorder_p.h11
-rw-r--r--src/imports/multimedia/qdeclarativemediametadata_p.h665
-rw-r--r--src/multimedia/CMakeLists.txt13
-rw-r--r--src/multimedia/camera/qcameraimagecapture.cpp28
-rw-r--r--src/multimedia/camera/qcameraimagecapture.h11
-rw-r--r--src/multimedia/controls/controls.pri4
-rw-r--r--src/multimedia/controls/qcameraimagecapturecontrol.cpp5
-rw-r--r--src/multimedia/controls/qcameraimagecapturecontrol.h3
-rw-r--r--src/multimedia/controls/qmediaplayercontrol.h4
-rw-r--r--src/multimedia/controls/qmediarecordercontrol.h6
-rw-r--r--src/multimedia/controls/qmediastreamscontrol.h3
-rw-r--r--src/multimedia/controls/qmetadatareadercontrol.cpp140
-rw-r--r--src/multimedia/controls/qmetadatareadercontrol.h79
-rw-r--r--src/multimedia/controls/qmetadatawritercontrol.cpp160
-rw-r--r--src/multimedia/controls/qmetadatawritercontrol.h82
-rw-r--r--src/multimedia/platform/android/mediaplayer/mediaplayer.pri4
-rw-r--r--src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol.cpp10
-rw-r--r--src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol_p.h3
-rw-r--r--src/multimedia/platform/android/mediaplayer/qandroidmediaservice.cpp15
-rw-r--r--src/multimedia/platform/android/mediaplayer/qandroidmediaservice_p.h3
-rw-r--r--src/multimedia/platform/android/mediaplayer/qandroidmetadata.cpp (renamed from src/multimedia/platform/android/mediaplayer/qandroidmetadatareadercontrol.cpp)104
-rw-r--r--src/multimedia/platform/android/mediaplayer/qandroidmetadata_p.h (renamed from src/multimedia/platform/darwin/camera/avfcamerametadatacontrol_p.h)30
-rw-r--r--src/multimedia/platform/android/mediaplayer/qandroidmetadatareadercontrol_p.h91
-rw-r--r--src/multimedia/platform/darwin/camera/avfcamerametadatacontrol.mm83
-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
-rw-r--r--src/multimedia/platform/gstreamer/common/common.pri2
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamermetadata.cpp290
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamermetadata_p.h (renamed from src/multimedia/platform/qnx/mediaplayer/mmrenderermetadatareadercontrol_p.h)34
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol.cpp6
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol_p.h2
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamerplayersession.cpp36
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamerplayersession_p.h11
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstutils.cpp119
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstutils_p.h2
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/mediacapture.pri2
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturemetadatacontrol.cpp169
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturemetadatacontrol_p.h83
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp1
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp4
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h5
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp13
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol_p.h6
-rw-r--r--src/multimedia/platform/gstreamer/mediaplayer/mediaplayer.pri2
-rw-r--r--src/multimedia/platform/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp184
-rw-r--r--src/multimedia/platform/gstreamer/mediaplayer/qgstreamermetadataprovider_p.h84
-rw-r--r--src/multimedia/platform/gstreamer/mediaplayer/qgstreamerplayerservice.cpp38
-rw-r--r--src/multimedia/platform/gstreamer/mediaplayer/qgstreamerplayerservice_p.h3
-rw-r--r--src/multimedia/platform/gstreamer/mediaplayer/qgstreamerstreamscontrol.cpp4
-rw-r--r--src/multimedia/platform/gstreamer/mediaplayer/qgstreamerstreamscontrol_p.h2
-rw-r--r--src/multimedia/platform/qmediaplatformplayerinterface_p.h2
-rw-r--r--src/multimedia/platform/qnx/mediaplayer/mediaplayer.pri2
-rw-r--r--src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp10
-rw-r--r--src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayercontrol_p.h3
-rw-r--r--src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayerservice.cpp19
-rw-r--r--src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayerservice_p.h3
-rw-r--r--src/multimedia/platform/qnx/mediaplayer/mmrenderermetadatareadercontrol.cpp170
-rw-r--r--src/multimedia/platform/windows/player/mfmetadata.cpp337
-rw-r--r--src/multimedia/platform/windows/player/mfmetadata_p.h (renamed from src/multimedia/platform/windows/player/mfmetadatacontrol_p.h)24
-rw-r--r--src/multimedia/platform/windows/player/mfmetadatacontrol.cpp431
-rw-r--r--src/multimedia/platform/windows/player/mfplayerservice.cpp14
-rw-r--r--src/multimedia/platform/windows/player/mfplayerservice_p.h4
-rw-r--r--src/multimedia/platform/windows/player/mfplayersession.cpp9
-rw-r--r--src/multimedia/platform/windows/player/mfplayersession_p.h5
-rw-r--r--src/multimedia/platform/windows/player/player.pri4
-rw-r--r--src/multimedia/playback/qplaylistfileparser.cpp6
-rw-r--r--src/multimedia/qmediametadata.cpp154
-rw-r--r--src/multimedia/qmediametadata.h178
-rw-r--r--src/multimedia/qmediasource.cpp72
-rw-r--r--src/multimedia/qmediasource.h10
-rw-r--r--src/multimedia/qmediasource_p.h6
-rw-r--r--src/multimedia/recording/qmediarecorder.cpp106
-rw-r--r--src/multimedia/recording/qmediarecorder.h16
-rw-r--r--src/multimedia/recording/qmediarecorder_p.h2
-rw-r--r--tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp2
-rw-r--r--tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp16
-rw-r--r--tests/auto/unit/mockbackend/CMakeLists.txt2
-rw-r--r--tests/auto/unit/mockbackend/capture.pri1
-rw-r--r--tests/auto/unit/mockbackend/mockcameraimagecapturecontrol.h14
-rw-r--r--tests/auto/unit/mockbackend/mockmediaplayerservice.h6
-rw-r--r--tests/auto/unit/mockbackend/mockmediarecordercontrol.h7
-rw-r--r--tests/auto/unit/mockbackend/mockmediarecorderservice.h5
-rw-r--r--tests/auto/unit/mockbackend/mockmediastreamscontrol.h8
-rw-r--r--tests/auto/unit/mockbackend/mockmetadatareadercontrol.h89
-rw-r--r--tests/auto/unit/mockbackend/mockmetadatawritercontrol.h94
-rw-r--r--tests/auto/unit/mockbackend/player.pri1
-rw-r--r--tests/auto/unit/multimedia/CMakeLists.txt2
-rw-r--r--tests/auto/unit/multimedia/multimedia.pro2
-rw-r--r--tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp22
-rw-r--r--tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp163
-rw-r--r--tests/auto/unit/multimedia/qmediasink/tst_qmediasink.cpp8
-rw-r--r--tests/auto/unit/multimedia/qmediasource/tst_qmediasource.cpp120
-rw-r--r--tests/auto/unit/multimedia/qmetadatareadercontrol/CMakeLists.txt17
-rw-r--r--tests/auto/unit/multimedia/qmetadatareadercontrol/qmetadatareadercontrol.pro9
-rw-r--r--tests/auto/unit/multimedia/qmetadatareadercontrol/tst_qmetadatareadercontrol.cpp110
-rw-r--r--tests/auto/unit/multimedia/qmetadatawritercontrol/CMakeLists.txt17
-rw-r--r--tests/auto/unit/multimedia/qmetadatawritercontrol/qmetadatawritercontrol.pro8
-rw-r--r--tests/auto/unit/multimedia/qmetadatawritercontrol/tst_qmetadatawritercontrol.cpp74
-rw-r--r--tests/auto/unit/qml/qdeclarativeaudio/tst_qdeclarativeaudio.cpp7
117 files changed, 1334 insertions, 3972 deletions
diff --git a/examples/multimediawidgets/camera/camera.cpp b/examples/multimediawidgets/camera/camera.cpp
index 33e596768..014c07fc0 100644
--- a/examples/multimediawidgets/camera/camera.cpp
+++ b/examples/multimediawidgets/camera/camera.cpp
@@ -116,8 +116,6 @@ void Camera::setCamera(const QCameraInfo &cameraInfo)
connect(m_mediaRecorder.data(), QOverload<QMediaRecorder::Error>::of(&QMediaRecorder::error),
this, &Camera::displayRecorderError);
- m_mediaRecorder->setMetaData(QMediaMetaData::Title, QVariant(QLatin1String("Test Title")));
-
connect(ui->exposureCompensation, &QAbstractSlider::valueChanged, this, &Camera::setExposureCompensation);
m_camera->setViewfinder(ui->viewfinder);
diff --git a/examples/multimediawidgets/player/player.cpp b/examples/multimediawidgets/player/player.cpp
index fe46dc137..ea816bc54 100644
--- a/examples/multimediawidgets/player/player.cpp
+++ b/examples/multimediawidgets/player/player.cpp
@@ -265,18 +265,14 @@ void Player::positionChanged(qint64 progress)
void Player::metaDataChanged()
{
- if (m_player->isMetaDataAvailable()) {
- setTrackInfo(QString("%1 - %2")
- .arg(m_player->metaData(QMediaMetaData::AlbumArtist).toString())
- .arg(m_player->metaData(QMediaMetaData::Title).toString()));
-
- if (m_coverLabel) {
- QUrl url = m_player->metaData(QMediaMetaData::CoverArtUrlLarge).value<QUrl>();
-
- m_coverLabel->setPixmap(!url.isEmpty()
- ? QPixmap(url.toString())
- : QPixmap());
- }
+ auto metaData = m_player->metaData();
+ setTrackInfo(QString("%1 - %2")
+ .arg(metaData.value(QMediaMetaData::AlbumArtist).toString())
+ .arg(metaData.value(QMediaMetaData::Title).toString()));
+
+ if (m_coverLabel) {
+ QImage cover = metaData.value(QMediaMetaData::CoverArtImage).value<QImage>();
+ m_coverLabel->setPixmap(QPixmap::fromImage(cover));
}
}
diff --git a/src/imports/multimedia/qdeclarativeaudio.cpp b/src/imports/multimedia/qdeclarativeaudio.cpp
index a80c2330b..dde8c6007 100644
--- a/src/imports/multimedia/qdeclarativeaudio.cpp
+++ b/src/imports/multimedia/qdeclarativeaudio.cpp
@@ -42,9 +42,7 @@
#include <qmediaplayercontrol.h>
-#include <qmediaservice.h>
#include <private/qdeclarativevideooutput_p.h>
-#include <qmetadatareadercontrol.h>
#include "qdeclarativemediametadata_p.h"
diff --git a/src/imports/multimedia/qdeclarativeaudio_p.h b/src/imports/multimedia/qdeclarativeaudio_p.h
index 6190d15f8..f9befd092 100644
--- a/src/imports/multimedia/qdeclarativeaudio_p.h
+++ b/src/imports/multimedia/qdeclarativeaudio_p.h
@@ -62,8 +62,6 @@ QT_BEGIN_NAMESPACE
class QTimerEvent;
class QMediaPlayerControl;
-class QMediaService;
-class QMetaDataReaderControl;
class QDeclarativeMediaBaseAnimation;
class QDeclarativeMediaMetaData;
diff --git a/src/imports/multimedia/qdeclarativecamera.cpp b/src/imports/multimedia/qdeclarativecamera.cpp
index d47ec4471..82fdf2013 100644
--- a/src/imports/multimedia/qdeclarativecamera.cpp
+++ b/src/imports/multimedia/qdeclarativecamera.cpp
@@ -48,7 +48,6 @@
#include "qdeclarativemediametadata_p.h"
#include <qmediaplayercontrol.h>
-#include <qmediaservice.h>
#include <qvideorenderercontrol.h>
#include <QMediaDeviceManager>
#include <QtQml/qqmlinfo.h>
diff --git a/src/imports/multimedia/qdeclarativecameracapture.cpp b/src/imports/multimedia/qdeclarativecameracapture.cpp
index cf3a63d1b..c6fe3b970 100644
--- a/src/imports/multimedia/qdeclarativecameracapture.cpp
+++ b/src/imports/multimedia/qdeclarativecameracapture.cpp
@@ -41,8 +41,6 @@
#include "qdeclarativecameracapture_p.h"
#include "qdeclarativecamerapreviewprovider_p.h"
-#include <qmetadatawritercontrol.h>
-
#include <QtCore/qurl.h>
QT_BEGIN_NAMESPACE
@@ -106,17 +104,14 @@ QDeclarativeCameraCapture::QDeclarativeCameraCapture(QCamera *camera)
connect(m_capture, SIGNAL(readyForCaptureChanged(bool)), this, SIGNAL(readyForCaptureChanged(bool)));
connect(m_capture, SIGNAL(imageExposed(int)), this, SIGNAL(imageExposed(int)));
connect(m_capture, SIGNAL(imageCaptured(int,QImage)), this, SLOT(_q_imageCaptured(int,QImage)));
- connect(m_capture, SIGNAL(imageMetadataAvailable(int,QString,QVariant)), this,
- SLOT(_q_imageMetadataAvailable(int,QString,QVariant)));
+ connect(m_capture, SIGNAL(imageMetadataAvailable(int,const QMediaMetaData&)), this,
+ SIGNAL(imageMetadataAvailable(int,const QMediaMetaData&)));
connect(m_capture, SIGNAL(imageSaved(int,QString)), this, SLOT(_q_imageSaved(int,QString)));
connect(m_capture, SIGNAL(error(int,QCameraImageCapture::Error,QString)),
this, SLOT(_q_captureFailed(int,QCameraImageCapture::Error,QString)));
connect(m_camera, SIGNAL(statusChanged(QCamera::Status)),
this, SLOT(_q_cameraStatusChanged(QCamera::Status)));
-
- QMediaService *service = camera->service();
- m_metadataWriterControl = service ? service->requestControl<QMetaDataWriterControl*>() : 0;
}
QDeclarativeCameraCapture::~QDeclarativeCameraCapture()
@@ -230,12 +225,6 @@ void QDeclarativeCameraCapture::_q_imageSaved(int id, const QString &fileName)
emit imageSaved(id, fileName);
}
-void QDeclarativeCameraCapture::_q_imageMetadataAvailable(int id, const QString &key, const QVariant &value)
-{
- emit imageMetadataAvailable(id, key, value);
-}
-
-
void QDeclarativeCameraCapture::_q_captureFailed(int id, QCameraImageCapture::Error error, const QString &message)
{
Q_UNUSED(error);
@@ -333,10 +322,11 @@ QVariantList QDeclarativeCameraCapture::supportedResolutions()
\sa QMediaMetaData
*/
-void QDeclarativeCameraCapture::setMetadata(const QString &key, const QVariant &value)
+void QDeclarativeCameraCapture::setMetadata(QMediaMetaData::Key key, const QVariant &value)
{
- if (m_metadataWriterControl)
- m_metadataWriterControl->setMetaData(key, value);
+ QMediaMetaData data;
+ data.insert(key, value);
+ m_capture->addMetaData(data);
}
/*!
diff --git a/src/imports/multimedia/qdeclarativecameracapture_p.h b/src/imports/multimedia/qdeclarativecameracapture_p.h
index e76916324..aa6aa8fc6 100644
--- a/src/imports/multimedia/qdeclarativecameracapture_p.h
+++ b/src/imports/multimedia/qdeclarativecameracapture_p.h
@@ -54,13 +54,13 @@
#include <qcamera.h>
#include <qcameraimagecapture.h>
#include <qmediaencodersettings.h>
+#include <qmediametadata.h>
#include <QtQml/qqml.h>
QT_BEGIN_NAMESPACE
class QDeclarativeCamera;
-class QMetaDataWriterControl;
class QDeclarativeCameraCapture : public QObject
{
@@ -89,14 +89,14 @@ public Q_SLOTS:
void cancelCapture();
void setResolution(const QSize &resolution);
- void setMetadata(const QString &key, const QVariant &value);
+ void setMetadata(QMediaMetaData::Key key, const QVariant &value);
Q_SIGNALS:
void readyForCaptureChanged(bool);
void imageExposed(int requestId);
void imageCaptured(int requestId, const QString &preview);
- void imageMetadataAvailable(int requestId, const QString &key, const QVariant &value);
+ void imageMetadataAvailable(int requestId, const QMediaMetaData &);
void imageSaved(int requestId, const QString &path);
void captureFailed(int requestId, const QString &message);
@@ -106,7 +106,6 @@ Q_SIGNALS:
private slots:
void _q_imageCaptured(int, const QImage&);
void _q_imageSaved(int, const QString&);
- void _q_imageMetadataAvailable(int, const QString &, const QVariant &);
void _q_captureFailed(int, QCameraImageCapture::Error, const QString&);
void _q_cameraStatusChanged(QCamera::Status status);
@@ -118,7 +117,6 @@ private:
QCameraImageCapture *m_capture;
QImageEncoderSettings m_imageSettings;
QString m_capturedImagePath;
- QMetaDataWriterControl *m_metadataWriterControl;
};
QT_END_NAMESPACE
diff --git a/src/imports/multimedia/qdeclarativecamerarecorder.cpp b/src/imports/multimedia/qdeclarativecamerarecorder.cpp
index fecff9145..f1b79d3c6 100644
--- a/src/imports/multimedia/qdeclarativecamerarecorder.cpp
+++ b/src/imports/multimedia/qdeclarativecamerarecorder.cpp
@@ -39,6 +39,7 @@
#include "qdeclarativecamera_p.h"
#include "qdeclarativecamerarecorder_p.h"
+#include "qdeclarativemediametadata_p.h"
#include <QtCore/qurl.h>
@@ -88,12 +89,11 @@ QDeclarativeCameraRecorder::QDeclarativeCameraRecorder(QCamera *camera, QObject
connect(m_recorder, SIGNAL(durationChanged(qint64)), SIGNAL(durationChanged(qint64)));
connect(m_recorder, SIGNAL(actualLocationChanged(QUrl)),
SLOT(updateActualLocation(QUrl)));
- connect(m_recorder, SIGNAL(metaDataChanged(QString,QVariant)),
- SIGNAL(metaDataChanged(QString,QVariant)));
}
QDeclarativeCameraRecorder::~QDeclarativeCameraRecorder()
{
+ delete m_metaData;
}
/*!
@@ -564,9 +564,13 @@ void QDeclarativeCameraRecorder::setMuted(bool muted)
Sets metadata for the next video to be recorder, with
the given \a key being associated with \a value.
*/
-void QDeclarativeCameraRecorder::setMetadata(const QString &key, const QVariant &value)
+
+QDeclarativeMediaMetaData *QDeclarativeCameraRecorder::metaData()
{
- m_recorder->setMetaData(key, value);
+ // ### Doesn't quite work as QDeclarativeMediaMetaData expects a QMediaSource
+// if (!m_metaData)
+// m_metaData = new QDeclarativeMediaMetaData(m_recorder);
+ return m_metaData;
}
void QDeclarativeCameraRecorder::updateRecorderState(QMediaRecorder::State state)
diff --git a/src/imports/multimedia/qdeclarativecamerarecorder_p.h b/src/imports/multimedia/qdeclarativecamerarecorder_p.h
index da1894507..fb142213c 100644
--- a/src/imports/multimedia/qdeclarativecamerarecorder_p.h
+++ b/src/imports/multimedia/qdeclarativecamerarecorder_p.h
@@ -59,6 +59,7 @@
QT_BEGIN_NAMESPACE
class QDeclarativeCamera;
+class QDeclarativeMediaMetaData;
class QDeclarativeCameraRecorder : public QObject
{
@@ -91,7 +92,7 @@ class QDeclarativeCameraRecorder : public QObject
Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged)
Q_PROPERTY(QString errorString READ errorString NOTIFY error)
Q_PROPERTY(Error errorCode READ errorCode NOTIFY error)
-
+ Q_PROPERTY(QDeclarativeMediaMetaData *metaData READ metaData CONSTANT)
public:
enum RecorderState
{
@@ -162,7 +163,6 @@ public Q_SLOTS:
void setRecorderState(QDeclarativeCameraRecorder::RecorderState state);
void setMuted(bool muted);
- void setMetadata(const QString &key, const QVariant &value);
void setCaptureResolution(const QSize &resolution);
void setAudioCodec(QMediaFormat::AudioCodec codec);
@@ -178,6 +178,8 @@ public Q_SLOTS:
void setVideoEncodingMode(EncodingMode encodingMode);
void setAudioEncodingMode(EncodingMode encodingMode);
+ QDeclarativeMediaMetaData *metaData();
+
Q_SIGNALS:
void recorderStateChanged(QDeclarativeCameraRecorder::RecorderState state);
void recorderStatusChanged();
@@ -188,8 +190,6 @@ Q_SIGNALS:
void error(QDeclarativeCameraRecorder::Error errorCode, const QString &errorString);
- void metaDataChanged(const QString &key, const QVariant &value);
-
void captureResolutionChanged(const QSize &);
void audioCodecChanged();
void videoCodecChanged();
@@ -213,7 +213,8 @@ private:
friend class QDeclarativeCamera;
QDeclarativeCameraRecorder(QCamera *camera, QObject *parent = 0);
- QMediaRecorder *m_recorder;
+ QMediaRecorder *m_recorder = nullptr;
+ QDeclarativeMediaMetaData *m_metaData = nullptr;
QMediaEncoderSettings m_encoderSettings;
};
diff --git a/src/imports/multimedia/qdeclarativemediametadata_p.h b/src/imports/multimedia/qdeclarativemediametadata_p.h
index f34eec248..f0e8ea8b9 100644
--- a/src/imports/multimedia/qdeclarativemediametadata_p.h
+++ b/src/imports/multimedia/qdeclarativemediametadata_p.h
@@ -54,8 +54,8 @@
#include <QtQml/qqml.h>
#include <QtMultimedia/qmediametadata.h>
#include <QtMultimedia/qmediaservice.h>
-#include <QtMultimedia/qmetadatawritercontrol.h>
#include "qmediasource.h"
+#include "qmediametadata.h"
QT_BEGIN_NAMESPACE
@@ -63,383 +63,374 @@ class QDeclarativeMediaMetaData : public QObject
{
Q_OBJECT
Q_PROPERTY(QVariant title READ title WRITE setTitle NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant subTitle READ subTitle WRITE setSubTitle NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant subTitle READ subTitle WRITE setSubTitle NOTIFY metaDataChanged)
Q_PROPERTY(QVariant author READ author WRITE setAuthor NOTIFY metaDataChanged)
Q_PROPERTY(QVariant comment READ comment WRITE setComment NOTIFY metaDataChanged)
Q_PROPERTY(QVariant description READ description WRITE setDescription NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant category READ category WRITE setCategory NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant category READ category WRITE setCategory NOTIFY metaDataChanged)
Q_PROPERTY(QVariant genre READ genre WRITE setGenre NOTIFY metaDataChanged)
Q_PROPERTY(QVariant year READ year WRITE setYear NOTIFY metaDataChanged)
Q_PROPERTY(QVariant date READ date WRITE setDate NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant userRating READ userRating WRITE setUserRating NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant keywords READ keywords WRITE setKeywords NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant language READ language WRITE setLanguage NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant publisher READ publisher WRITE setPublisher NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant copyright READ copyright WRITE setCopyright NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant parentalRating READ parentalRating WRITE setParentalRating NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant ratingOrganization READ ratingOrganization WRITE setRatingOrganization NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant size READ size WRITE setSize NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant mediaType READ mediaType WRITE setMediaType NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant duration READ duration WRITE setDuration NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant audioBitRate READ audioBitRate WRITE setAudioBitRate NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant audioCodec READ audioCodec WRITE setAudioCodec NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant averageLevel READ averageLevel WRITE setAverageLevel NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant channelCount READ channelCount WRITE setChannelCount NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant peakValue READ peakValue WRITE setPeakValue NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant sampleRate READ sampleRate WRITE setSampleRate NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant albumTitle READ albumTitle WRITE setAlbumTitle NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant albumArtist READ albumArtist WRITE setAlbumArtist NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant contributingArtist READ contributingArtist WRITE setContributingArtist NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant composer READ composer WRITE setComposer NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant conductor READ conductor WRITE setConductor NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant lyrics READ lyrics WRITE setLyrics NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant mood READ mood WRITE setMood NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant trackNumber READ trackNumber WRITE setTrackNumber NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant trackCount READ trackCount WRITE setTrackCount NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant coverArtUrlSmall READ coverArtUrlSmall WRITE setCoverArtUrlSmall NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant coverArtUrlLarge READ coverArtUrlLarge WRITE setCoverArtUrlLarge NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant resolution READ resolution WRITE setResolution NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant pixelAspectRatio READ pixelAspectRatio WRITE setPixelAspectRatio NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant videoFrameRate READ videoFrameRate WRITE setVideoFrameRate NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant videoBitRate READ videoBitRate WRITE setVideoBitRate NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant videoCodec READ videoCodec WRITE setVideoCodec NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant posterUrl READ posterUrl WRITE setPosterUrl NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant chapterNumber READ chapterNumber WRITE setChapterNumber NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant director READ director WRITE setDirector NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant leadPerformer READ leadPerformer WRITE setLeadPerformer NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant writer READ writer WRITE setWriter NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant userRating READ userRating WRITE setUserRating NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant keywords READ keywords WRITE setKeywords NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant language READ language WRITE setLanguage NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant publisher READ publisher WRITE setPublisher NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant copyright READ copyright WRITE setCopyright NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant parentalRating READ parentalRating WRITE setParentalRating NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant ratingOrganization READ ratingOrganization WRITE setRatingOrganization NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant size READ size WRITE setSize NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant mediaType READ mediaType WRITE setMediaType NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant duration READ duration WRITE setDuration NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant audioBitRate READ audioBitRate WRITE setAudioBitRate NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant audioCodec READ audioCodec WRITE setAudioCodec NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant averageLevel READ averageLevel WRITE setAverageLevel NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant channelCount READ channelCount WRITE setChannelCount NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant peakValue READ peakValue WRITE setPeakValue NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant sampleRate READ sampleRate WRITE setSampleRate NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant albumTitle READ albumTitle WRITE setAlbumTitle NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant albumArtist READ albumArtist WRITE setAlbumArtist NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant contributingArtist READ contributingArtist WRITE setContributingArtist NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant composer READ composer WRITE setComposer NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant conductor READ conductor WRITE setConductor NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant lyrics READ lyrics WRITE setLyrics NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant mood READ mood WRITE setMood NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant trackNumber READ trackNumber WRITE setTrackNumber NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant trackCount READ trackCount WRITE setTrackCount NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant coverArtUrlSmall READ coverArtUrlSmall WRITE setCoverArtUrlSmall NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant coverArtUrlLarge READ coverArtUrlLarge WRITE setCoverArtUrlLarge NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant resolution READ resolution WRITE setResolution NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant pixelAspectRatio READ pixelAspectRatio WRITE setPixelAspectRatio NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant videoFrameRate READ videoFrameRate WRITE setVideoFrameRate NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant videoBitRate READ videoBitRate WRITE setVideoBitRate NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant videoCodec READ videoCodec WRITE setVideoCodec NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant posterUrl READ posterUrl WRITE setPosterUrl NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant chapterNumber READ chapterNumber WRITE setChapterNumber NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant director READ director WRITE setDirector NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant leadPerformer READ leadPerformer WRITE setLeadPerformer NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant writer READ writer WRITE setWriter NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant cameraManufacturer READ cameraManufacturer WRITE setCameraManufacturer NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant cameraModel READ cameraModel WRITE setCameraModel NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant event READ event WRITE setEvent NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant subject READ subject WRITE setSubject NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant orientation READ orientation WRITE setOrientation NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant exposureTime READ exposureTime WRITE setExposureTime NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant fNumber READ fNumber WRITE setFNumber NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant exposureProgram READ exposureProgram WRITE setExposureProgram NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant isoSpeedRatings READ isoSpeedRatings WRITE setISOSpeedRatings NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant exposureBiasValue READ exposureBiasValue WRITE setExposureBiasValue NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant dateTimeOriginal READ dateTimeOriginal WRITE setDateTimeOriginal NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant dateTimeDigitized READ dateTimeDigitized WRITE setDateTimeDigitized NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant subjectDistance READ subjectDistance WRITE setSubjectDistance NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant lightSource READ lightSource WRITE setLightSource NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant flash READ flash WRITE setFlash NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant focalLength READ focalLength WRITE setFocalLength NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant exposureMode READ exposureMode WRITE setExposureMode NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant whiteBalance READ whiteBalance WRITE setWhiteBalance NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant digitalZoomRatio READ digitalZoomRatio WRITE setDigitalZoomRatio NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant focalLengthIn35mmFilm READ focalLengthIn35mmFilm WRITE setFocalLengthIn35mmFilm NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant sceneCaptureType READ sceneCaptureType WRITE setSceneCaptureType NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant gainControl READ gainControl WRITE setGainControl NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant contrast READ contrast WRITE setContrast NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant saturation READ saturation WRITE setSaturation NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant sharpness READ sharpness WRITE setSharpness NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant deviceSettingDescription READ deviceSettingDescription WRITE setDeviceSettingDescription NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant cameraManufacturer READ cameraManufacturer WRITE setCameraManufacturer NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant cameraModel READ cameraModel WRITE setCameraModel NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant event READ event WRITE setEvent NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant subject READ subject WRITE setSubject NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant orientation READ orientation WRITE setOrientation NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant exposureTime READ exposureTime WRITE setExposureTime NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant fNumber READ fNumber WRITE setFNumber NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant exposureProgram READ exposureProgram WRITE setExposureProgram NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant isoSpeedRatings READ isoSpeedRatings WRITE setISOSpeedRatings NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant exposureBiasValue READ exposureBiasValue WRITE setExposureBiasValue NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant dateTimeOriginal READ dateTimeOriginal WRITE setDateTimeOriginal NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant dateTimeDigitized READ dateTimeDigitized WRITE setDateTimeDigitized NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant subjectDistance READ subjectDistance WRITE setSubjectDistance NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant lightSource READ lightSource WRITE setLightSource NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant flash READ flash WRITE setFlash NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant focalLength READ focalLength WRITE setFocalLength NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant exposureMode READ exposureMode WRITE setExposureMode NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant whiteBalance READ whiteBalance WRITE setWhiteBalance NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant digitalZoomRatio READ digitalZoomRatio WRITE setDigitalZoomRatio NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant focalLengthIn35mmFilm READ focalLengthIn35mmFilm WRITE setFocalLengthIn35mmFilm NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant sceneCaptureType READ sceneCaptureType WRITE setSceneCaptureType NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant gainControl READ gainControl WRITE setGainControl NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant contrast READ contrast WRITE setContrast NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant saturation READ saturation WRITE setSaturation NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant sharpness READ sharpness WRITE setSharpness NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant deviceSettingDescription READ deviceSettingDescription WRITE setDeviceSettingDescription NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant gpsLatitude READ gpsLatitude WRITE setGPSLatitude NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant gpsLongitude READ gpsLongitude WRITE setGPSLongitude NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant gpsAltitude READ gpsAltitude WRITE setGPSAltitude NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant gpsTimeStamp READ gpsTimeStamp WRITE setGPSTimeStamp NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant gpsSatellites READ gpsSatellites WRITE setGPSSatellites NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant gpsStatus READ gpsStatus WRITE setGPSStatus NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant gpsDOP READ gpsDOP WRITE setGPSDOP NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant gpsSpeed READ gpsSpeed WRITE setGPSSpeed NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant gpsTrack READ gpsTrack WRITE setGPSTrack NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant gpsTrackRef READ gpsTrackRef WRITE setGPSTrackRef NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant gpsImgDirection READ gpsImgDirection WRITE setGPSImgDirection NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant gpsImgDirectionRef READ gpsImgDirectionRef WRITE setGPSImgDirectionRef NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant gpsMapDatum READ gpsMapDatum WRITE setGPSMapDatum NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant gpsProcessingMethod READ gpsProcessingMethod WRITE setGPSProcessingMethod NOTIFY metaDataChanged)
- Q_PROPERTY(QVariant gpsAreaInformation READ gpsAreaInformation WRITE setGPSAreaInformation NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant gpsLatitude READ gpsLatitude WRITE setGPSLatitude NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant gpsLongitude READ gpsLongitude WRITE setGPSLongitude NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant gpsAltitude READ gpsAltitude WRITE setGPSAltitude NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant gpsTimeStamp READ gpsTimeStamp WRITE setGPSTimeStamp NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant gpsSatellites READ gpsSatellites WRITE setGPSSatellites NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant gpsStatus READ gpsStatus WRITE setGPSStatus NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant gpsDOP READ gpsDOP WRITE setGPSDOP NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant gpsSpeed READ gpsSpeed WRITE setGPSSpeed NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant gpsTrack READ gpsTrack WRITE setGPSTrack NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant gpsTrackRef READ gpsTrackRef WRITE setGPSTrackRef NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant gpsImgDirection READ gpsImgDirection WRITE setGPSImgDirection NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant gpsImgDirectionRef READ gpsImgDirectionRef WRITE setGPSImgDirectionRef NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant gpsMapDatum READ gpsMapDatum WRITE setGPSMapDatum NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant gpsProcessingMethod READ gpsProcessingMethod WRITE setGPSProcessingMethod NOTIFY metaDataChanged)
+// Q_PROPERTY(QVariant gpsAreaInformation READ gpsAreaInformation WRITE setGPSAreaInformation NOTIFY metaDataChanged)
public:
QDeclarativeMediaMetaData(QMediaSource *player, QObject *parent = 0)
: QObject(parent)
, m_mediaSource(player)
- , m_writerControl(0)
- , m_requestedWriterControl(false)
{
+ connect(player, SIGNAL(metaDataChanged()), this, SIGNAL(metaDataChanged()));
+ auto *mo = player->metaObject();
+ int idx = mo->indexOfMethod("addMetaData");
+ if (idx >= 0)
+ setter = mo->method(idx);
}
~QDeclarativeMediaMetaData()
{
- if (m_writerControl) {
- if (QMediaService *service = m_mediaSource->service())
- service->releaseControl(m_writerControl);
- }
}
- QVariant title() const { return m_mediaSource->metaData(QMediaMetaData::Title); }
+ QVariant title() const { return m_mediaSource->metaData().value(QMediaMetaData::Title); }
void setTitle(const QVariant &title) { setMetaData(QMediaMetaData::Title, title); }
- QVariant subTitle() const { return m_mediaSource->metaData(QMediaMetaData::SubTitle); }
- void setSubTitle(const QVariant &title) {
- setMetaData(QMediaMetaData::SubTitle, title); }
- QVariant author() const { return m_mediaSource->metaData(QMediaMetaData::Author); }
+ QVariant author() const { return m_mediaSource->metaData().value(QMediaMetaData::Author); }
void setAuthor(const QVariant &author) { setMetaData(QMediaMetaData::Author, author); }
- QVariant comment() const { return m_mediaSource->metaData(QMediaMetaData::Comment); }
+ QVariant comment() const { return m_mediaSource->metaData().value(QMediaMetaData::Comment); }
void setComment(const QVariant &comment) { setMetaData(QMediaMetaData::Comment, comment); }
- QVariant description() const { return m_mediaSource->metaData(QMediaMetaData::Description); }
+ QVariant description() const { return m_mediaSource->metaData().value(QMediaMetaData::Description); }
void setDescription(const QVariant &description) {
setMetaData(QMediaMetaData::Description, description); }
- QVariant category() const { return m_mediaSource->metaData(QMediaMetaData::Category); }
- void setCategory(const QVariant &category) { setMetaData(QMediaMetaData::Category, category); }
- QVariant genre() const { return m_mediaSource->metaData(QMediaMetaData::Genre); }
+ QVariant genre() const { return m_mediaSource->metaData().value(QMediaMetaData::Genre); }
void setGenre(const QVariant &genre) { setMetaData(QMediaMetaData::Genre, genre); }
- QVariant year() const { return m_mediaSource->metaData(QMediaMetaData::Year); }
+ QVariant year() const { return m_mediaSource->metaData().value(QMediaMetaData::Year); }
void setYear(const QVariant &year) { setMetaData(QMediaMetaData::Year, year); }
- QVariant date() const { return m_mediaSource->metaData(QMediaMetaData::Date); }
+ QVariant date() const { return m_mediaSource->metaData().value(QMediaMetaData::Date); }
void setDate(const QVariant &date) { setMetaData(QMediaMetaData::Date, date); }
- QVariant userRating() const { return m_mediaSource->metaData(QMediaMetaData::UserRating); }
- void setUserRating(const QVariant &rating) { setMetaData(QMediaMetaData::UserRating, rating); }
- QVariant keywords() const { return m_mediaSource->metaData(QMediaMetaData::Keywords); }
- void setKeywords(const QVariant &keywords) { setMetaData(QMediaMetaData::Keywords, keywords); }
- QVariant language() const { return m_mediaSource->metaData(QMediaMetaData::Language); }
- void setLanguage(const QVariant &language) { setMetaData(QMediaMetaData::Language, language); }
- QVariant publisher() const { return m_mediaSource->metaData(QMediaMetaData::Publisher); }
- void setPublisher(const QVariant &publisher) {
- setMetaData(QMediaMetaData::Publisher, publisher); }
- QVariant copyright() const { return m_mediaSource->metaData(QMediaMetaData::Copyright); }
- void setCopyright(const QVariant &copyright) {
- setMetaData(QMediaMetaData::Copyright, copyright); }
- QVariant parentalRating() const { return m_mediaSource->metaData(QMediaMetaData::ParentalRating); }
- void setParentalRating(const QVariant &rating) {
- setMetaData(QMediaMetaData::ParentalRating, rating); }
- QVariant ratingOrganization() const {
- return m_mediaSource->metaData(QMediaMetaData::RatingOrganization); }
- void setRatingOrganization(const QVariant &organization) {
- setMetaData(QMediaMetaData::RatingOrganization, organization); }
- QVariant size() const { return m_mediaSource->metaData(QMediaMetaData::Size); }
- void setSize(const QVariant &size) { setMetaData(QMediaMetaData::Size, size); }
- QVariant mediaType() const { return m_mediaSource->metaData(QMediaMetaData::MediaType); }
- void setMediaType(const QVariant &type) { setMetaData(QMediaMetaData::MediaType, type); }
- QVariant duration() const { return m_mediaSource->metaData(QMediaMetaData::Duration); }
- void setDuration(const QVariant &duration) { setMetaData(QMediaMetaData::Duration, duration); }
- QVariant audioBitRate() const { return m_mediaSource->metaData(QMediaMetaData::AudioBitRate); }
- void setAudioBitRate(const QVariant &rate) { setMetaData(QMediaMetaData::AudioBitRate, rate); }
- QVariant audioCodec() const { return m_mediaSource->metaData(QMediaMetaData::AudioCodec); }
- void setAudioCodec(const QVariant &codec) { setMetaData(QMediaMetaData::AudioCodec, codec); }
- QVariant averageLevel() const { return m_mediaSource->metaData(QMediaMetaData::AverageLevel); }
- void setAverageLevel(const QVariant &level) {
- setMetaData(QMediaMetaData::AverageLevel, level); }
- QVariant channelCount() const { return m_mediaSource->metaData(QMediaMetaData::ChannelCount); }
- void setChannelCount(const QVariant &count) {
- setMetaData(QMediaMetaData::ChannelCount, count); }
- QVariant peakValue() const { return m_mediaSource->metaData(QMediaMetaData::PeakValue); }
- void setPeakValue(const QVariant &value) { setMetaData(QMediaMetaData::PeakValue, value); }
- QVariant sampleRate() const { return m_mediaSource->metaData(QMediaMetaData::SampleRate); }
- void setSampleRate(const QVariant &rate) { setMetaData(QMediaMetaData::SampleRate, rate); }
- QVariant albumTitle() const { return m_mediaSource->metaData(QMediaMetaData::AlbumTitle); }
- void setAlbumTitle(const QVariant &title) { setMetaData(QMediaMetaData::AlbumTitle, title); }
- QVariant albumArtist() const { return m_mediaSource->metaData(QMediaMetaData::AlbumArtist); }
- void setAlbumArtist(const QVariant &artist) {
- setMetaData(QMediaMetaData::AlbumArtist, artist); }
- QVariant contributingArtist() const {
- return m_mediaSource->metaData(QMediaMetaData::ContributingArtist); }
- void setContributingArtist(const QVariant &artist) {
- setMetaData(QMediaMetaData::ContributingArtist, artist); }
- QVariant composer() const { return m_mediaSource->metaData(QMediaMetaData::Composer); }
- void setComposer(const QVariant &composer) { setMetaData(QMediaMetaData::Composer, composer); }
- QVariant conductor() const { return m_mediaSource->metaData(QMediaMetaData::Conductor); }
- void setConductor(const QVariant &conductor) {
- setMetaData(QMediaMetaData::Conductor, conductor); }
- QVariant lyrics() const { return m_mediaSource->metaData(QMediaMetaData::Lyrics); }
- void setLyrics(const QVariant &lyrics) { setMetaData(QMediaMetaData::Lyrics, lyrics); }
- QVariant mood() const { return m_mediaSource->metaData(QMediaMetaData::Mood); }
- void setMood(const QVariant &mood) { setMetaData(QMediaMetaData::Mood, mood); }
- QVariant trackNumber() const { return m_mediaSource->metaData(QMediaMetaData::TrackNumber); }
- void setTrackNumber(const QVariant &track) { setMetaData(QMediaMetaData::TrackNumber, track); }
- QVariant trackCount() const { return m_mediaSource->metaData(QMediaMetaData::TrackCount); }
- void setTrackCount(const QVariant &count) { setMetaData(QMediaMetaData::TrackCount, count); }
- QVariant coverArtUrlSmall() const {
- return m_mediaSource->metaData(QMediaMetaData::CoverArtUrlSmall); }
- void setCoverArtUrlSmall(const QVariant &url) {
- setMetaData(QMediaMetaData::CoverArtUrlSmall, url); }
- QVariant coverArtUrlLarge() const {
- return m_mediaSource->metaData(QMediaMetaData::CoverArtUrlLarge); }
- void setCoverArtUrlLarge(const QVariant &url) {
- setMetaData(QMediaMetaData::CoverArtUrlLarge, url); }
- QVariant resolution() const { return m_mediaSource->metaData(QMediaMetaData::Resolution); }
- void setResolution(const QVariant &resolution) {
- setMetaData(QMediaMetaData::Resolution, resolution); }
- QVariant pixelAspectRatio() const {
- return m_mediaSource->metaData(QMediaMetaData::PixelAspectRatio); }
- void setPixelAspectRatio(const QVariant &ratio) {
- setMetaData(QMediaMetaData::PixelAspectRatio, ratio); }
- QVariant videoFrameRate() const { return m_mediaSource->metaData(QMediaMetaData::VideoFrameRate); }
- void setVideoFrameRate(const QVariant &rate) {
- setMetaData(QMediaMetaData::VideoFrameRate, rate); }
- QVariant videoBitRate() const { return m_mediaSource->metaData(QMediaMetaData::VideoBitRate); }
- void setVideoBitRate(const QVariant &rate) {
- setMetaData(QMediaMetaData::VideoBitRate, rate); }
- QVariant videoCodec() const { return m_mediaSource->metaData(QMediaMetaData::VideoCodec); }
- void setVideoCodec(const QVariant &codec) {
- setMetaData(QMediaMetaData::VideoCodec, codec); }
- QVariant posterUrl() const { return m_mediaSource->metaData(QMediaMetaData::PosterUrl); }
- void setPosterUrl(const QVariant &url) {
- setMetaData(QMediaMetaData::PosterUrl, url); }
- QVariant chapterNumber() const { return m_mediaSource->metaData(QMediaMetaData::ChapterNumber); }
- void setChapterNumber(const QVariant &chapter) {
- setMetaData(QMediaMetaData::ChapterNumber, chapter); }
- QVariant director() const { return m_mediaSource->metaData(QMediaMetaData::Director); }
- void setDirector(const QVariant &director) { setMetaData(QMediaMetaData::Director, director); }
- QVariant leadPerformer() const { return m_mediaSource->metaData(QMediaMetaData::LeadPerformer); }
- void setLeadPerformer(const QVariant &performer) {
- setMetaData(QMediaMetaData::LeadPerformer, performer); }
- QVariant writer() const { return m_mediaSource->metaData(QMediaMetaData::Writer); }
- void setWriter(const QVariant &writer) { setMetaData(QMediaMetaData::Writer, writer); }
+// QVariant userRating() const { return m_mediaSource->metaData().value(QMediaMetaData::UserRating); }
+// void setUserRating(const QVariant &rating) { setMetaData(QMediaMetaData::UserRating, rating); }
+// QVariant keywords() const { return m_mediaSource->metaData().value(QMediaMetaData::Keywords); }
+// void setKeywords(const QVariant &keywords) { setMetaData(QMediaMetaData::Keywords, keywords); }
+// QVariant language() const { return m_mediaSource->metaData().value(QMediaMetaData::Language); }
+// void setLanguage(const QVariant &language) { setMetaData(QMediaMetaData::Language, language); }
+// QVariant publisher() const { return m_mediaSource->metaData().value(QMediaMetaData::Publisher); }
+// void setPublisher(const QVariant &publisher) {
+// setMetaData(QMediaMetaData::Publisher, publisher); }
+// QVariant copyright() const { return m_mediaSource->metaData().value(QMediaMetaData::Copyright); }
+// void setCopyright(const QVariant &copyright) {
+// setMetaData(QMediaMetaData::Copyright, copyright); }
+// QVariant parentalRating() const { return m_mediaSource->metaData().value(QMediaMetaData::ParentalRating); }
+// void setParentalRating(const QVariant &rating) {
+// setMetaData(QMediaMetaData::ParentalRating, rating); }
+// QVariant ratingOrganization() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::RatingOrganization); }
+// void setRatingOrganization(const QVariant &organization) {
+// setMetaData(QMediaMetaData::RatingOrganization, organization); }
+// QVariant size() const { return m_mediaSource->metaData().value(QMediaMetaData::Size); }
+// void setSize(const QVariant &size) { setMetaData(QMediaMetaData::Size, size); }
+// QVariant mediaType() const { return m_mediaSource->metaData().value(QMediaMetaData::MediaType); }
+// void setMediaType(const QVariant &type) { setMetaData(QMediaMetaData::MediaType, type); }
+// QVariant duration() const { return m_mediaSource->metaData().value(QMediaMetaData::Duration); }
+// void setDuration(const QVariant &duration) { setMetaData(QMediaMetaData::Duration, duration); }
+// QVariant audioBitRate() const { return m_mediaSource->metaData().value(QMediaMetaData::AudioBitRate); }
+// void setAudioBitRate(const QVariant &rate) { setMetaData(QMediaMetaData::AudioBitRate, rate); }
+// QVariant audioCodec() const { return m_mediaSource->metaData().value(QMediaMetaData::AudioCodec); }
+// void setAudioCodec(const QVariant &codec) { setMetaData(QMediaMetaData::AudioCodec, codec); }
+// QVariant averageLevel() const { return m_mediaSource->metaData().value(QMediaMetaData::AverageLevel); }
+// void setAverageLevel(const QVariant &level) {
+// setMetaData(QMediaMetaData::AverageLevel, level); }
+// QVariant channelCount() const { return m_mediaSource->metaData().value(QMediaMetaData::ChannelCount); }
+// void setChannelCount(const QVariant &count) {
+// setMetaData(QMediaMetaData::ChannelCount, count); }
+// QVariant peakValue() const { return m_mediaSource->metaData().value(QMediaMetaData::PeakValue); }
+// void setPeakValue(const QVariant &value) { setMetaData(QMediaMetaData::PeakValue, value); }
+// QVariant sampleRate() const { return m_mediaSource->metaData().value(QMediaMetaData::SampleRate); }
+// void setSampleRate(const QVariant &rate) { setMetaData(QMediaMetaData::SampleRate, rate); }
+// QVariant albumTitle() const { return m_mediaSource->metaData().value(QMediaMetaData::AlbumTitle); }
+// void setAlbumTitle(const QVariant &title) { setMetaData(QMediaMetaData::AlbumTitle, title); }
+// QVariant albumArtist() const { return m_mediaSource->metaData().value(QMediaMetaData::AlbumArtist); }
+// void setAlbumArtist(const QVariant &artist) {
+// setMetaData(QMediaMetaData::AlbumArtist, artist); }
+// QVariant contributingArtist() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::ContributingArtist); }
+// void setContributingArtist(const QVariant &artist) {
+// setMetaData(QMediaMetaData::ContributingArtist, artist); }
+// QVariant composer() const { return m_mediaSource->metaData().value(QMediaMetaData::Composer); }
+// void setComposer(const QVariant &composer) { setMetaData(QMediaMetaData::Composer, composer); }
+// QVariant conductor() const { return m_mediaSource->metaData().value(QMediaMetaData::Conductor); }
+// void setConductor(const QVariant &conductor) {
+// setMetaData(QMediaMetaData::Conductor, conductor); }
+// QVariant lyrics() const { return m_mediaSource->metaData().value(QMediaMetaData::Lyrics); }
+// void setLyrics(const QVariant &lyrics) { setMetaData(QMediaMetaData::Lyrics, lyrics); }
+// QVariant mood() const { return m_mediaSource->metaData().value(QMediaMetaData::Mood); }
+// void setMood(const QVariant &mood) { setMetaData(QMediaMetaData::Mood, mood); }
+// QVariant trackNumber() const { return m_mediaSource->metaData().value(QMediaMetaData::TrackNumber); }
+// void setTrackNumber(const QVariant &track) { setMetaData(QMediaMetaData::TrackNumber, track); }
+// QVariant trackCount() const { return m_mediaSource->metaData().value(QMediaMetaData::TrackCount); }
+// void setTrackCount(const QVariant &count) { setMetaData(QMediaMetaData::TrackCount, count); }
+// QVariant coverArtUrlSmall() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::CoverArtUrlSmall); }
+// void setCoverArtUrlSmall(const QVariant &url) {
+// setMetaData(QMediaMetaData::CoverArtUrlSmall, url); }
+// QVariant coverArtUrlLarge() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::CoverArtUrlLarge); }
+// void setCoverArtUrlLarge(const QVariant &url) {
+// setMetaData(QMediaMetaData::CoverArtUrlLarge, url); }
+// QVariant resolution() const { return m_mediaSource->metaData().value(QMediaMetaData::Resolution); }
+// void setResolution(const QVariant &resolution) {
+// setMetaData(QMediaMetaData::Resolution, resolution); }
+// QVariant pixelAspectRatio() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::PixelAspectRatio); }
+// void setPixelAspectRatio(const QVariant &ratio) {
+// setMetaData(QMediaMetaData::PixelAspectRatio, ratio); }
+// QVariant videoFrameRate() const { return m_mediaSource->metaData().value(QMediaMetaData::VideoFrameRate); }
+// void setVideoFrameRate(const QVariant &rate) {
+// setMetaData(QMediaMetaData::VideoFrameRate, rate); }
+// QVariant videoBitRate() const { return m_mediaSource->metaData().value(QMediaMetaData::VideoBitRate); }
+// void setVideoBitRate(const QVariant &rate) {
+// setMetaData(QMediaMetaData::VideoBitRate, rate); }
+// QVariant videoCodec() const { return m_mediaSource->metaData().value(QMediaMetaData::VideoCodec); }
+// void setVideoCodec(const QVariant &codec) {
+// setMetaData(QMediaMetaData::VideoCodec, codec); }
+// QVariant posterUrl() const { return m_mediaSource->metaData().value(QMediaMetaData::PosterUrl); }
+// void setPosterUrl(const QVariant &url) {
+// setMetaData(QMediaMetaData::PosterUrl, url); }
+// QVariant chapterNumber() const { return m_mediaSource->metaData().value(QMediaMetaData::ChapterNumber); }
+// void setChapterNumber(const QVariant &chapter) {
+// setMetaData(QMediaMetaData::ChapterNumber, chapter); }
+// QVariant director() const { return m_mediaSource->metaData().value(QMediaMetaData::Director); }
+// void setDirector(const QVariant &director) { setMetaData(QMediaMetaData::Director, director); }
+// QVariant leadPerformer() const { return m_mediaSource->metaData().value(QMediaMetaData::LeadPerformer); }
+// void setLeadPerformer(const QVariant &performer) {
+// setMetaData(QMediaMetaData::LeadPerformer, performer); }
+// QVariant writer() const { return m_mediaSource->metaData().value(QMediaMetaData::Writer); }
+// void setWriter(const QVariant &writer) { setMetaData(QMediaMetaData::Writer, writer); }
- QVariant cameraManufacturer() const {
- return m_mediaSource->metaData(QMediaMetaData::CameraManufacturer); }
- void setCameraManufacturer(const QVariant &manufacturer) {
- setMetaData(QMediaMetaData::CameraManufacturer, manufacturer); }
- QVariant cameraModel() const { return m_mediaSource->metaData(QMediaMetaData::CameraModel); }
- void setCameraModel(const QVariant &model) { setMetaData(QMediaMetaData::CameraModel, model); }
+// QVariant cameraManufacturer() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::CameraManufacturer); }
+// void setCameraManufacturer(const QVariant &manufacturer) {
+// setMetaData(QMediaMetaData::CameraManufacturer, manufacturer); }
+// QVariant cameraModel() const { return m_mediaSource->metaData().value(QMediaMetaData::CameraModel); }
+// void setCameraModel(const QVariant &model) { setMetaData(QMediaMetaData::CameraModel, model); }
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_GCC("-Woverloaded-virtual")
-QT_WARNING_DISABLE_CLANG("-Woverloaded-virtual")
- QVariant event() const { return m_mediaSource->metaData(QMediaMetaData::Event); }
-QT_WARNING_POP
+//QT_WARNING_PUSH
+//QT_WARNING_DISABLE_GCC("-Woverloaded-virtual")
+//QT_WARNING_DISABLE_CLANG("-Woverloaded-virtual")
+// QVariant event() const { return m_mediaSource->metaData().value(QMediaMetaData::Event); }
+//QT_WARNING_POP
- void setEvent(const QVariant &event) { setMetaData(QMediaMetaData::Event, event); }
- QVariant subject() const { return m_mediaSource->metaData(QMediaMetaData::Subject); }
- void setSubject(const QVariant &subject) { setMetaData(QMediaMetaData::Subject, subject); }
- QVariant orientation() const { return m_mediaSource->metaData(QMediaMetaData::Orientation); }
- void setOrientation(const QVariant &orientation) {
- setMetaData(QMediaMetaData::Orientation, orientation); }
- QVariant exposureTime() const { return m_mediaSource->metaData(QMediaMetaData::ExposureTime); }
- void setExposureTime(const QVariant &time) { setMetaData(QMediaMetaData::ExposureTime, time); }
- QVariant fNumber() const { return m_mediaSource->metaData(QMediaMetaData::FNumber); }
- void setFNumber(const QVariant &number) { setMetaData(QMediaMetaData::FNumber, number); }
- QVariant exposureProgram() const {
- return m_mediaSource->metaData(QMediaMetaData::ExposureProgram); }
- void setExposureProgram(const QVariant &program) {
- setMetaData(QMediaMetaData::ExposureProgram, program); }
- QVariant isoSpeedRatings() const {
- return m_mediaSource->metaData(QMediaMetaData::ISOSpeedRatings); }
- void setISOSpeedRatings(const QVariant &ratings) {
- setMetaData(QMediaMetaData::ISOSpeedRatings, ratings); }
- QVariant exposureBiasValue() const {
- return m_mediaSource->metaData(QMediaMetaData::ExposureBiasValue); }
- void setExposureBiasValue(const QVariant &bias) {
- setMetaData(QMediaMetaData::ExposureBiasValue, bias); }
- QVariant dateTimeOriginal() const {
- return m_mediaSource->metaData(QMediaMetaData::DateTimeOriginal); }
- void setDateTimeOriginal(const QVariant &dateTime) {
- setMetaData(QMediaMetaData::DateTimeOriginal, dateTime); }
- QVariant dateTimeDigitized() const {
- return m_mediaSource->metaData(QMediaMetaData::DateTimeDigitized); }
- void setDateTimeDigitized(const QVariant &dateTime) {
- setMetaData(QMediaMetaData::DateTimeDigitized, dateTime); }
- QVariant subjectDistance() const {
- return m_mediaSource->metaData(QMediaMetaData::SubjectDistance); }
- void setSubjectDistance(const QVariant &distance) {
- setMetaData(QMediaMetaData::SubjectDistance, distance); }
- QVariant lightSource() const { return m_mediaSource->metaData(QMediaMetaData::LightSource); }
- void setLightSource(const QVariant &source) {
- setMetaData(QMediaMetaData::LightSource, source); }
- QVariant flash() const { return m_mediaSource->metaData(QMediaMetaData::Flash); }
- void setFlash(const QVariant &flash) { setMetaData(QMediaMetaData::Flash, flash); }
- QVariant focalLength() const { return m_mediaSource->metaData(QMediaMetaData::FocalLength); }
- void setFocalLength(const QVariant &length) {
- setMetaData(QMediaMetaData::FocalLength, length); }
- QVariant exposureMode() const { return m_mediaSource->metaData(QMediaMetaData::ExposureMode); }
- void setExposureMode(const QVariant &mode) {
- setMetaData(QMediaMetaData::ExposureMode, mode); }
- QVariant whiteBalance() const { return m_mediaSource->metaData(QMediaMetaData::WhiteBalance); }
- void setWhiteBalance(const QVariant &balance) {
- setMetaData(QMediaMetaData::WhiteBalance, balance); }
- QVariant digitalZoomRatio() const {
- return m_mediaSource->metaData(QMediaMetaData::DigitalZoomRatio); }
- void setDigitalZoomRatio(const QVariant &ratio) {
- setMetaData(QMediaMetaData::DigitalZoomRatio, ratio); }
- QVariant focalLengthIn35mmFilm() const {
- return m_mediaSource->metaData(QMediaMetaData::FocalLengthIn35mmFilm); }
- void setFocalLengthIn35mmFilm(const QVariant &length) {
- setMetaData(QMediaMetaData::FocalLengthIn35mmFilm, length); }
- QVariant sceneCaptureType() const {
- return m_mediaSource->metaData(QMediaMetaData::SceneCaptureType); }
- void setSceneCaptureType(const QVariant &type) {
- setMetaData(QMediaMetaData::SceneCaptureType, type); }
- QVariant gainControl() const { return m_mediaSource->metaData(QMediaMetaData::GainControl); }
- void setGainControl(const QVariant &gain) { setMetaData(QMediaMetaData::GainControl, gain); }
- QVariant contrast() const { return m_mediaSource->metaData(QMediaMetaData::Contrast); }
- void setContrast(const QVariant &contrast) { setMetaData(QMediaMetaData::Contrast, contrast); }
- QVariant saturation() const { return m_mediaSource->metaData(QMediaMetaData::Saturation); }
- void setSaturation(const QVariant &saturation) {
- setMetaData(QMediaMetaData::Saturation, saturation); }
- QVariant sharpness() const { return m_mediaSource->metaData(QMediaMetaData::Sharpness); }
- void setSharpness(const QVariant &sharpness) {
- setMetaData(QMediaMetaData::Sharpness, sharpness); }
- QVariant deviceSettingDescription() const {
- return m_mediaSource->metaData(QMediaMetaData::DeviceSettingDescription); }
- void setDeviceSettingDescription(const QVariant &description) {
- setMetaData(QMediaMetaData::DeviceSettingDescription, description); }
+// void setEvent(const QVariant &event) { setMetaData(QMediaMetaData::Event, event); }
+// QVariant subject() const { return m_mediaSource->metaData().value(QMediaMetaData::Subject); }
+// void setSubject(const QVariant &subject) { setMetaData(QMediaMetaData::Subject, subject); }
+// QVariant orientation() const { return m_mediaSource->metaData().value(QMediaMetaData::Orientation); }
+// void setOrientation(const QVariant &orientation) {
+// setMetaData(QMediaMetaData::Orientation, orientation); }
+// QVariant exposureTime() const { return m_mediaSource->metaData().value(QMediaMetaData::ExposureTime); }
+// void setExposureTime(const QVariant &time) { setMetaData(QMediaMetaData::ExposureTime, time); }
+// QVariant fNumber() const { return m_mediaSource->metaData().value(QMediaMetaData::FNumber); }
+// void setFNumber(const QVariant &number) { setMetaData(QMediaMetaData::FNumber, number); }
+// QVariant exposureProgram() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::ExposureProgram); }
+// void setExposureProgram(const QVariant &program) {
+// setMetaData(QMediaMetaData::ExposureProgram, program); }
+// QVariant isoSpeedRatings() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::ISOSpeedRatings); }
+// void setISOSpeedRatings(const QVariant &ratings) {
+// setMetaData(QMediaMetaData::ISOSpeedRatings, ratings); }
+// QVariant exposureBiasValue() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::ExposureBiasValue); }
+// void setExposureBiasValue(const QVariant &bias) {
+// setMetaData(QMediaMetaData::ExposureBiasValue, bias); }
+// QVariant dateTimeOriginal() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::DateTimeOriginal); }
+// void setDateTimeOriginal(const QVariant &dateTime) {
+// setMetaData(QMediaMetaData::DateTimeOriginal, dateTime); }
+// QVariant dateTimeDigitized() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::DateTimeDigitized); }
+// void setDateTimeDigitized(const QVariant &dateTime) {
+// setMetaData(QMediaMetaData::DateTimeDigitized, dateTime); }
+// QVariant subjectDistance() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::SubjectDistance); }
+// void setSubjectDistance(const QVariant &distance) {
+// setMetaData(QMediaMetaData::SubjectDistance, distance); }
+// QVariant lightSource() const { return m_mediaSource->metaData().value(QMediaMetaData::LightSource); }
+// void setLightSource(const QVariant &source) {
+// setMetaData(QMediaMetaData::LightSource, source); }
+// QVariant flash() const { return m_mediaSource->metaData().value(QMediaMetaData::Flash); }
+// void setFlash(const QVariant &flash) { setMetaData(QMediaMetaData::Flash, flash); }
+// QVariant focalLength() const { return m_mediaSource->metaData().value(QMediaMetaData::FocalLength); }
+// void setFocalLength(const QVariant &length) {
+// setMetaData(QMediaMetaData::FocalLength, length); }
+// QVariant exposureMode() const { return m_mediaSource->metaData().value(QMediaMetaData::ExposureMode); }
+// void setExposureMode(const QVariant &mode) {
+// setMetaData(QMediaMetaData::ExposureMode, mode); }
+// QVariant whiteBalance() const { return m_mediaSource->metaData().value(QMediaMetaData::WhiteBalance); }
+// void setWhiteBalance(const QVariant &balance) {
+// setMetaData(QMediaMetaData::WhiteBalance, balance); }
+// QVariant digitalZoomRatio() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::DigitalZoomRatio); }
+// void setDigitalZoomRatio(const QVariant &ratio) {
+// setMetaData(QMediaMetaData::DigitalZoomRatio, ratio); }
+// QVariant focalLengthIn35mmFilm() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::FocalLengthIn35mmFilm); }
+// void setFocalLengthIn35mmFilm(const QVariant &length) {
+// setMetaData(QMediaMetaData::FocalLengthIn35mmFilm, length); }
+// QVariant sceneCaptureType() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::SceneCaptureType); }
+// void setSceneCaptureType(const QVariant &type) {
+// setMetaData(QMediaMetaData::SceneCaptureType, type); }
+// QVariant gainControl() const { return m_mediaSource->metaData().value(QMediaMetaData::GainControl); }
+// void setGainControl(const QVariant &gain) { setMetaData(QMediaMetaData::GainControl, gain); }
+// QVariant contrast() const { return m_mediaSource->metaData().value(QMediaMetaData::Contrast); }
+// void setContrast(const QVariant &contrast) { setMetaData(QMediaMetaData::Contrast, contrast); }
+// QVariant saturation() const { return m_mediaSource->metaData().value(QMediaMetaData::Saturation); }
+// void setSaturation(const QVariant &saturation) {
+// setMetaData(QMediaMetaData::Saturation, saturation); }
+// QVariant sharpness() const { return m_mediaSource->metaData().value(QMediaMetaData::Sharpness); }
+// void setSharpness(const QVariant &sharpness) {
+// setMetaData(QMediaMetaData::Sharpness, sharpness); }
+// QVariant deviceSettingDescription() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::DeviceSettingDescription); }
+// void setDeviceSettingDescription(const QVariant &description) {
+// setMetaData(QMediaMetaData::DeviceSettingDescription, description); }
- QVariant gpsLatitude() const { return m_mediaSource->metaData(QMediaMetaData::GPSLatitude); }
- void setGPSLatitude(const QVariant &latitude) {
- setMetaData(QMediaMetaData::GPSLatitude, latitude); }
- QVariant gpsLongitude() const { return m_mediaSource->metaData(QMediaMetaData::GPSLongitude); }
- void setGPSLongitude(const QVariant &longitude) {
- setMetaData(QMediaMetaData::GPSLongitude, longitude); }
- QVariant gpsAltitude() const { return m_mediaSource->metaData(QMediaMetaData::GPSAltitude); }
- void setGPSAltitude(const QVariant &altitude) {
- setMetaData(QMediaMetaData::GPSAltitude, altitude); }
- QVariant gpsTimeStamp() const { return m_mediaSource->metaData(QMediaMetaData::GPSTimeStamp); }
- void setGPSTimeStamp(const QVariant &timestamp) {
- setMetaData(QMediaMetaData::GPSTimeStamp, timestamp); }
- QVariant gpsSatellites() const {
- return m_mediaSource->metaData(QMediaMetaData::GPSSatellites); }
- void setGPSSatellites(const QVariant &satellites) {
- setMetaData(QMediaMetaData::GPSSatellites, satellites); }
- QVariant gpsStatus() const { return m_mediaSource->metaData(QMediaMetaData::GPSStatus); }
- void setGPSStatus(const QVariant &status) { setMetaData(QMediaMetaData::GPSStatus, status); }
- QVariant gpsDOP() const { return m_mediaSource->metaData(QMediaMetaData::GPSDOP); }
- void setGPSDOP(const QVariant &dop) { setMetaData(QMediaMetaData::GPSDOP, dop); }
- QVariant gpsSpeed() const { return m_mediaSource->metaData(QMediaMetaData::GPSSpeed); }
- void setGPSSpeed(const QVariant &speed) { setMetaData(QMediaMetaData::GPSSpeed, speed); }
- QVariant gpsTrack() const { return m_mediaSource->metaData(QMediaMetaData::GPSTrack); }
- void setGPSTrack(const QVariant &track) { setMetaData(QMediaMetaData::GPSTrack, track); }
- QVariant gpsTrackRef() const { return m_mediaSource->metaData(QMediaMetaData::GPSTrackRef); }
- void setGPSTrackRef(const QVariant &ref) { setMetaData(QMediaMetaData::GPSTrackRef, ref); }
- QVariant gpsImgDirection() const {
- return m_mediaSource->metaData(QMediaMetaData::GPSImgDirection); }
- void setGPSImgDirection(const QVariant &direction) {
- setMetaData(QMediaMetaData::GPSImgDirection, direction); }
- QVariant gpsImgDirectionRef() const {
- return m_mediaSource->metaData(QMediaMetaData::GPSImgDirectionRef); }
- void setGPSImgDirectionRef(const QVariant &ref) {
- setMetaData(QMediaMetaData::GPSImgDirectionRef, ref); }
- QVariant gpsMapDatum() const { return m_mediaSource->metaData(QMediaMetaData::GPSMapDatum); }
- void setGPSMapDatum(const QVariant &datum) {
- setMetaData(QMediaMetaData::GPSMapDatum, datum); }
- QVariant gpsProcessingMethod() const {
- return m_mediaSource->metaData(QMediaMetaData::GPSProcessingMethod); }
- void setGPSProcessingMethod(const QVariant &method) {
- setMetaData(QMediaMetaData::GPSProcessingMethod, method); }
- QVariant gpsAreaInformation() const {
- return m_mediaSource->metaData(QMediaMetaData::GPSAreaInformation); }
- void setGPSAreaInformation(const QVariant &information) {
- setMetaData(QMediaMetaData::GPSAreaInformation, information); }
+// QVariant gpsLatitude() const { return m_mediaSource->metaData().value(QMediaMetaData::GPSLatitude); }
+// void setGPSLatitude(const QVariant &latitude) {
+// setMetaData(QMediaMetaData::GPSLatitude, latitude); }
+// QVariant gpsLongitude() const { return m_mediaSource->metaData().value(QMediaMetaData::GPSLongitude); }
+// void setGPSLongitude(const QVariant &longitude) {
+// setMetaData(QMediaMetaData::GPSLongitude, longitude); }
+// QVariant gpsAltitude() const { return m_mediaSource->metaData().value(QMediaMetaData::GPSAltitude); }
+// void setGPSAltitude(const QVariant &altitude) {
+// setMetaData(QMediaMetaData::GPSAltitude, altitude); }
+// QVariant gpsTimeStamp() const { return m_mediaSource->metaData().value(QMediaMetaData::GPSTimeStamp); }
+// void setGPSTimeStamp(const QVariant &timestamp) {
+// setMetaData(QMediaMetaData::GPSTimeStamp, timestamp); }
+// QVariant gpsSatellites() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::GPSSatellites); }
+// void setGPSSatellites(const QVariant &satellites) {
+// setMetaData(QMediaMetaData::GPSSatellites, satellites); }
+// QVariant gpsStatus() const { return m_mediaSource->metaData().value(QMediaMetaData::GPSStatus); }
+// void setGPSStatus(const QVariant &status) { setMetaData(QMediaMetaData::GPSStatus, status); }
+// QVariant gpsDOP() const { return m_mediaSource->metaData().value(QMediaMetaData::GPSDOP); }
+// void setGPSDOP(const QVariant &dop) { setMetaData(QMediaMetaData::GPSDOP, dop); }
+// QVariant gpsSpeed() const { return m_mediaSource->metaData().value(QMediaMetaData::GPSSpeed); }
+// void setGPSSpeed(const QVariant &speed) { setMetaData(QMediaMetaData::GPSSpeed, speed); }
+// QVariant gpsTrack() const { return m_mediaSource->metaData().value(QMediaMetaData::GPSTrack); }
+// void setGPSTrack(const QVariant &track) { setMetaData(QMediaMetaData::GPSTrack, track); }
+// QVariant gpsTrackRef() const { return m_mediaSource->metaData().value(QMediaMetaData::GPSTrackRef); }
+// void setGPSTrackRef(const QVariant &ref) { setMetaData(QMediaMetaData::GPSTrackRef, ref); }
+// QVariant gpsImgDirection() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::GPSImgDirection); }
+// void setGPSImgDirection(const QVariant &direction) {
+// setMetaData(QMediaMetaData::GPSImgDirection, direction); }
+// QVariant gpsImgDirectionRef() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::GPSImgDirectionRef); }
+// void setGPSImgDirectionRef(const QVariant &ref) {
+// setMetaData(QMediaMetaData::GPSImgDirectionRef, ref); }
+// QVariant gpsMapDatum() const { return m_mediaSource->metaData().value(QMediaMetaData::GPSMapDatum); }
+// void setGPSMapDatum(const QVariant &datum) {
+// setMetaData(QMediaMetaData::GPSMapDatum, datum); }
+// QVariant gpsProcessingMethod() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::GPSProcessingMethod); }
+// void setGPSProcessingMethod(const QVariant &method) {
+// setMetaData(QMediaMetaData::GPSProcessingMethod, method); }
+// QVariant gpsAreaInformation() const {
+// return m_mediaSource->metaData().value(QMediaMetaData::GPSAreaInformation); }
+// void setGPSAreaInformation(const QVariant &information) {
+// setMetaData(QMediaMetaData::GPSAreaInformation, information); }
Q_SIGNALS:
void metaDataChanged();
private:
- void setMetaData(const QString &key, const QVariant &value)
+ void setMetaData(QMediaMetaData::Key key, const QVariant &value)
{
- if (!m_requestedWriterControl) {
- m_requestedWriterControl = true;
- if (QMediaService *service = m_mediaSource->service())
- m_writerControl = service->requestControl<QMetaDataWriterControl *>();
- }
- if (m_writerControl)
- m_writerControl->setMetaData(key, value);
+ if (!setter.isValid())
+ return;
+ QMediaMetaData metaData;
+ metaData.insert(key, value);
+ setter.invoke(m_mediaSource, Q_ARG(QMediaMetaData, metaData));
}
+ QMetaMethod setter;
QMediaSource *m_mediaSource;
- QMetaDataWriterControl *m_writerControl;
- bool m_requestedWriterControl;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/CMakeLists.txt b/src/multimedia/CMakeLists.txt
index 35a5002b2..e947f9b74 100644
--- a/src/multimedia/CMakeLists.txt
+++ b/src/multimedia/CMakeLists.txt
@@ -39,8 +39,6 @@ qt_internal_add_module(Multimedia
controls/qmediaplayercontrol.cpp controls/qmediaplayercontrol.h
controls/qmediarecordercontrol.cpp controls/qmediarecordercontrol.h
controls/qmediastreamscontrol.cpp controls/qmediastreamscontrol.h
- controls/qmetadatareadercontrol.cpp controls/qmetadatareadercontrol.h
- controls/qmetadatawritercontrol.cpp controls/qmetadatawritercontrol.h
controls/qvideorenderercontrol.cpp controls/qvideorenderercontrol.h
controls/qvideowindowcontrol.cpp controls/qvideowindowcontrol.h
platform/qmediaplatformcaptureinterface.cpp platform/qmediaplatformcaptureinterface_p.h
@@ -152,7 +150,7 @@ qt_internal_extend_target(Multimedia CONDITION WIN32
platform/windows/mfstream.cpp platform/windows/mfstream_p.h
platform/windows/player/mfactivate.cpp platform/windows/player/mfactivate_p.h
platform/windows/player/mfevrvideowindowcontrol.cpp platform/windows/player/mfevrvideowindowcontrol_p.h
- platform/windows/player/mfmetadatacontrol.cpp platform/windows/player/mfmetadatacontrol_p.h
+ platform/windows/player/mfmetadata.cpp platform/windows/player/mfmetadata_p.h
platform/windows/player/mfplayercontrol.cpp platform/windows/player/mfplayercontrol_p.h
platform/windows/player/mfplayerservice.cpp platform/windows/player/mfplayerservice_p.h
platform/windows/player/mfplayersession.cpp platform/windows/player/mfplayersession_p.h
@@ -202,6 +200,7 @@ qt_internal_extend_target(Multimedia CONDITION QT_FEATURE_gstreamer
platform/gstreamer/common/qgstappsrc.cpp platform/gstreamer/common/qgstappsrc_p.h
platform/gstreamer/common/qgstreamerbufferprobe.cpp platform/gstreamer/common/qgstreamerbufferprobe_p.h
platform/gstreamer/common/qgstreamerbushelper.cpp platform/gstreamer/common/qgstreamerbushelper_p.h
+ platform/gstreamer/common/qgstreamermetadata.cpp platform/gstreamer/common/qgstreamermetadata_p.h
platform/gstreamer/common/qgstreamermessage.cpp platform/gstreamer/common/qgstreamermessage_p.h
platform/gstreamer/common/qgstreamerplayercontrol.cpp platform/gstreamer/common/qgstreamerplayercontrol_p.h
platform/gstreamer/common/qgstreamerplayersession.cpp platform/gstreamer/common/qgstreamerplayersession_p.h
@@ -213,7 +212,6 @@ qt_internal_extend_target(Multimedia CONDITION QT_FEATURE_gstreamer
platform/gstreamer/common/qgstvideobuffer.cpp platform/gstreamer/common/qgstvideobuffer_p.h
platform/gstreamer/common/qgstvideorendererplugin.cpp platform/gstreamer/common/qgstvideorendererplugin_p.h
platform/gstreamer/common/qgstvideorenderersink.cpp platform/gstreamer/common/qgstvideorenderersink_p.h
- platform/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp platform/gstreamer/mediaplayer/qgstreamermetadataprovider_p.h
platform/gstreamer/mediaplayer/qgstreamerplayerservice.cpp platform/gstreamer/mediaplayer/qgstreamerplayerservice_p.h
platform/gstreamer/mediaplayer/qgstreamerstreamscontrol.cpp platform/gstreamer/mediaplayer/qgstreamerstreamscontrol_p.h
platform/gstreamer/qgstreamerdevicemanager.cpp platform/gstreamer/qgstreamerdevicemanager_p.h
@@ -261,7 +259,6 @@ qt_internal_extend_target(Multimedia CONDITION QT_FEATURE_gstreamer AND QT_FEATU
qt_internal_extend_target(Multimedia CONDITION QT_FEATURE_gstreamer AND NOT use_camerabin
SOURCES
platform/gstreamer/mediacapture/qgstreamercameracontrol.cpp platform/gstreamer/mediacapture/qgstreamercameracontrol_p.h
- platform/gstreamer/mediacapture/qgstreamercapturemetadatacontrol.cpp platform/gstreamer/mediacapture/qgstreamercapturemetadatacontrol_p.h
platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp platform/gstreamer/mediacapture/qgstreamercaptureservice_p.h
platform/gstreamer/mediacapture/qgstreamercapturesession.cpp platform/gstreamer/mediacapture/qgstreamercapturesession_p.h
platform/gstreamer/mediacapture/qgstreamerimagecapturecontrol.cpp platform/gstreamer/mediacapture/qgstreamerimagecapturecontrol_p.h
@@ -345,7 +342,7 @@ qt_internal_extend_target(Multimedia CONDITION ANDROID
platform/android/mediaplayer/qandroidmediaplayercontrol.cpp platform/android/mediaplayer/qandroidmediaplayercontrol_p.h
platform/android/mediaplayer/qandroidmediaplayervideorenderercontrol.cpp platform/android/mediaplayer/qandroidmediaplayervideorenderercontrol_p.h
platform/android/mediaplayer/qandroidmediaservice.cpp platform/android/mediaplayer/qandroidmediaservice_p.h
- platform/android/mediaplayer/qandroidmetadatareadercontrol.cpp platform/android/mediaplayer/qandroidmetadatareadercontrol_p.h
+ platform/android/mediaplayer/qandroidmetadata.cpp platform/android/mediaplayer/qandroidmetadata_p.h
platform/android/qandroiddevicemanager.cpp platform/android/qandroiddevicemanager_p.h
platform/android/qandroidformatsinfo.cpp platform/android/qandroidformatsinfo_p.h
platform/android/qandroidintegration.cpp platform/android/qandroidintegration_p.h
@@ -390,9 +387,9 @@ qt_internal_extend_target(Multimedia CONDITION APPLE AND NOT WATCHOS
platform/darwin/audio/qcoreaudiooutput.mm platform/darwin/audio/qcoreaudiooutput_p.h
platform/darwin/audio/qcoreaudioutils.mm platform/darwin/audio/qcoreaudioutils_p.h
platform/darwin/mediaplayer/avfmediaplayercontrol.mm platform/darwin/mediaplayer/avfmediaplayercontrol_p.h
- platform/darwin/mediaplayer/avfmediaplayermetadatacontrol.mm platform/darwin/mediaplayer/avfmediaplayermetadatacontrol_p.h
platform/darwin/mediaplayer/avfmediaplayerservice.mm platform/darwin/mediaplayer/avfmediaplayerservice_p.h
platform/darwin/mediaplayer/avfmediaplayersession.mm platform/darwin/mediaplayer/avfmediaplayersession_p.h
+ platform/darwin/mediaplayer/avfmetadata.mm platform/darwin/mediaplayer/avfmetadata_p.h
platform/darwin/mediaplayer/avfvideooutput.mm platform/darwin/mediaplayer/avfvideooutput_p.h
platform/darwin/mediaplayer/avfvideowindowcontrol.mm platform/darwin/mediaplayer/avfvideowindowcontrol_p.h
platform/darwin/qdarwindevicemanager.mm platform/darwin/qdarwindevicemanager_p.h
@@ -430,7 +427,6 @@ qt_internal_extend_target(Multimedia CONDITION APPLE AND NOT TVOS AND NOT WATCHO
platform/darwin/camera/avfcameradebug_p.h
platform/darwin/camera/avfcameraexposurecontrol.mm platform/darwin/camera/avfcameraexposurecontrol_p.h
platform/darwin/camera/avfcamerafocuscontrol.mm platform/darwin/camera/avfcamerafocuscontrol_p.h
- platform/darwin/camera/avfcamerametadatacontrol.mm platform/darwin/camera/avfcamerametadatacontrol_p.h
platform/darwin/camera/avfcamerarenderercontrol.mm platform/darwin/camera/avfcamerarenderercontrol_p.h
platform/darwin/camera/avfcameraservice.mm platform/darwin/camera/avfcameraservice_p.h
platform/darwin/camera/avfcamerasession.mm platform/darwin/camera/avfcamerasession_p.h
@@ -504,7 +500,6 @@ qt_internal_extend_target(Multimedia CONDITION QNX
platform/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp platform/qnx/mediaplayer/mmrenderermediaplayercontrol_p.h
platform/qnx/mediaplayer/mmrenderermediaplayerservice.cpp platform/qnx/mediaplayer/mmrenderermediaplayerservice_p.h
platform/qnx/mediaplayer/mmrenderermetadata.cpp platform/qnx/mediaplayer/mmrenderermetadata_p.h
- platform/qnx/mediaplayer/mmrenderermetadatareadercontrol.cpp platform/qnx/mediaplayer/mmrenderermetadatareadercontrol_p.h
platform/qnx/mediaplayer/mmrendererplayervideorenderercontrol.cpp platform/qnx/mediaplayer/mmrendererplayervideorenderercontrol_p.h
platform/qnx/mediaplayer/mmrendererutil.cpp platform/qnx/mediaplayer/mmrendererutil_p.h
platform/qnx/mediaplayer/mmrenderervideowindowcontrol.cpp platform/qnx/mediaplayer/mmrenderervideowindowcontrol_p.h
diff --git a/src/multimedia/camera/qcameraimagecapture.cpp b/src/multimedia/camera/qcameraimagecapture.cpp
index 844555aa6..836468dbb 100644
--- a/src/multimedia/camera/qcameraimagecapture.cpp
+++ b/src/multimedia/camera/qcameraimagecapture.cpp
@@ -39,6 +39,7 @@
#include <qcameraimagecapture.h>
#include <qcameraimagecapturecontrol.h>
#include <qmediaencodersettings.h>
+#include <qmediametadata.h>
#include "qmediasource_p.h"
#include <qmediaservice.h>
@@ -88,6 +89,7 @@ public:
QCameraImageCapture::Error error = QCameraImageCapture::NoError;
QString errorString;
+ QMediaMetaData metaData;
void _q_error(int id, int error, const QString &errorString);
void _q_readyChanged(bool);
@@ -144,8 +146,8 @@ QCameraImageCapture::QCameraImageCapture(QCamera *camera)
this, SIGNAL(imageExposed(int)));
connect(d->control, SIGNAL(imageCaptured(int,QImage)),
this, SIGNAL(imageCaptured(int,QImage)));
- connect(d->control, SIGNAL(imageMetadataAvailable(int,QString,QVariant)),
- this, SIGNAL(imageMetadataAvailable(int,QString,QVariant)));
+ connect(d->control, SIGNAL(imageMetadataAvailable(int,const QMediaMetaData&)),
+ this, SIGNAL(imageMetadataAvailable(int,const QMediaMetaData&)));
connect(d->control, SIGNAL(imageAvailable(int,QVideoFrame)),
this, SIGNAL(imageAvailable(int,QVideoFrame)));
connect(d->control, SIGNAL(imageSaved(int,QString)),
@@ -288,6 +290,28 @@ void QCameraImageCapture::setCaptureDestination(QCameraImageCapture::CaptureDest
emit captureDestinationChanged(destination);
}
+QMediaMetaData QCameraImageCapture::metaData() const
+{
+ Q_D(const QCameraImageCapture);
+ return d->metaData;
+}
+
+void QCameraImageCapture::setMetaData(const QMediaMetaData &metaData)
+{
+ Q_D(QCameraImageCapture);
+ d->metaData = metaData;
+ d->control->setMetaData(d->metaData);
+}
+
+void QCameraImageCapture::addMetaData(const QMediaMetaData &metaData)
+{
+ Q_D(QCameraImageCapture);
+ auto data = d->metaData;
+ for (auto k : metaData.keys())
+ data.insert(k, metaData.value(k));
+ setMetaData(data);
+}
+
/*!
\property QCameraImageCapture::readyForCapture
\brief whether the service is ready to capture a an image immediately.
diff --git a/src/multimedia/camera/qcameraimagecapture.h b/src/multimedia/camera/qcameraimagecapture.h
index 4bb3ed89a..4b7684ca4 100644
--- a/src/multimedia/camera/qcameraimagecapture.h
+++ b/src/multimedia/camera/qcameraimagecapture.h
@@ -50,6 +50,7 @@
QT_BEGIN_NAMESPACE
class QSize;
+class QMediaMetaData;
QT_END_NAMESPACE
QT_BEGIN_NAMESPACE
@@ -101,6 +102,10 @@ public:
CaptureDestinations captureDestination() const;
void setCaptureDestination(CaptureDestinations destination);
+ QMediaMetaData metaData() const;
+ void setMetaData(const QMediaMetaData &metaData);
+ void addMetaData(const QMediaMetaData &metaData);
+
public Q_SLOTS:
int capture(const QString &location = QString());
void cancelCapture();
@@ -113,7 +118,7 @@ Q_SIGNALS:
void imageExposed(int id);
void imageCaptured(int id, const QImage &preview);
- void imageMetadataAvailable(int id, const QString &key, const QVariant &value);
+ void imageMetadataAvailable(int id, const QMediaMetaData &metaData);
void imageAvailable(int id, const QVideoFrame &frame);
void imageSaved(int id, const QString &fileName);
@@ -131,10 +136,6 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(QCameraImageCapture::CaptureDestinations)
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QCameraImageCapture::Error)
-Q_DECLARE_METATYPE(QCameraImageCapture::CaptureDestination)
-Q_DECLARE_METATYPE(QCameraImageCapture::CaptureDestinations)
-
Q_MEDIA_ENUM_DEBUG(QCameraImageCapture, Error)
Q_MEDIA_ENUM_DEBUG(QCameraImageCapture, CaptureDestination)
diff --git a/src/multimedia/controls/controls.pri b/src/multimedia/controls/controls.pri
index 403ee895c..663e55282 100644
--- a/src/multimedia/controls/controls.pri
+++ b/src/multimedia/controls/controls.pri
@@ -11,8 +11,6 @@ PUBLIC_HEADERS += \
controls/qmediaplayercontrol.h \
controls/qmediarecordercontrol.h \
controls/qmediastreamscontrol.h \
- controls/qmetadatareadercontrol.h \
- controls/qmetadatawritercontrol.h \
controls/qvideorenderercontrol.h \
controls/qvideowindowcontrol.h \
@@ -25,8 +23,6 @@ SOURCES += \
controls/qmediaplayercontrol.cpp \
controls/qmediarecordercontrol.cpp \
controls/qmediastreamscontrol.cpp \
- controls/qmetadatareadercontrol.cpp \
- controls/qmetadatawritercontrol.cpp \
controls/qvideorenderercontrol.cpp \
controls/qvideowindowcontrol.cpp \
controls/qaudiodecodercontrol.cpp \
diff --git a/src/multimedia/controls/qcameraimagecapturecontrol.cpp b/src/multimedia/controls/qcameraimagecapturecontrol.cpp
index f0b40002e..9ecd30fc3 100644
--- a/src/multimedia/controls/qcameraimagecapturecontrol.cpp
+++ b/src/multimedia/controls/qcameraimagecapturecontrol.cpp
@@ -140,10 +140,9 @@ QCameraImageCaptureControl::QCameraImageCaptureControl(QObject *parent)
*/
/*!
- \fn QCameraImageCaptureControl::imageMetadataAvailable(int id, const QString &key, const QVariant &value)
+ \fn QCameraImageCaptureControl::imageMetadataAvailable(int id, const QMediaMetaData &metaData)
- Signals that a metadata for an image with request \a id is available. Signal
- also contains the \a key and \a value of the metadata.
+ Signals that a metadata for an image with request \a id is available.
This signal should be emitted between imageExposed and imageSaved signals.
*/
diff --git a/src/multimedia/controls/qcameraimagecapturecontrol.h b/src/multimedia/controls/qcameraimagecapturecontrol.h
index ccebe8cc0..cef317c38 100644
--- a/src/multimedia/controls/qcameraimagecapturecontrol.h
+++ b/src/multimedia/controls/qcameraimagecapturecontrol.h
@@ -69,12 +69,13 @@ public:
virtual QImageEncoderSettings imageSettings() const = 0;
virtual void setImageSettings(const QImageEncoderSettings &settings) = 0;
+ virtual void setMetaData(const QMediaMetaData &) {}
Q_SIGNALS:
void readyForCaptureChanged(bool ready);
void imageExposed(int requestId);
void imageCaptured(int requestId, const QImage &preview);
- void imageMetadataAvailable(int id, const QString &key, const QVariant &value);
+ void imageMetadataAvailable(int id, const QMediaMetaData &);
void imageAvailable(int requestId, const QVideoFrame &buffer);
void imageSaved(int requestId, const QString &fileName);
diff --git a/src/multimedia/controls/qmediaplayercontrol.h b/src/multimedia/controls/qmediaplayercontrol.h
index 4cc5c4e98..234e43bd4 100644
--- a/src/multimedia/controls/qmediaplayercontrol.h
+++ b/src/multimedia/controls/qmediaplayercontrol.h
@@ -44,6 +44,7 @@
#include <QtMultimedia/qmediaplayer.h>
#include <QtMultimedia/qmediatimerange.h>
#include <QtMultimedia/qaudiodeviceinfo.h>
+#include <QtMultimedia/qmediametadata.h>
#include <QtCore/qpair.h>
@@ -100,6 +101,8 @@ public:
virtual bool setAudioOutput(const QAudioDeviceInfo &) { return false; }
virtual QAudioDeviceInfo audioOutput() const { return QAudioDeviceInfo(); }
+ virtual QMediaMetaData metaData() const { return {}; }
+
Q_SIGNALS:
void audioRoleChanged(QAudio::Role role);
void customAudioRoleChanged(const QString &role);
@@ -116,6 +119,7 @@ Q_SIGNALS:
void availablePlaybackRangesChanged(const QMediaTimeRange &ranges);
void playbackRateChanged(qreal rate);
void error(int error, const QString &errorString);
+ void metaDataChanged();
protected:
explicit QMediaPlayerControl(QObject *parent = nullptr);
diff --git a/src/multimedia/controls/qmediarecordercontrol.h b/src/multimedia/controls/qmediarecordercontrol.h
index 8f764ba90..fd972ea84 100644
--- a/src/multimedia/controls/qmediarecordercontrol.h
+++ b/src/multimedia/controls/qmediarecordercontrol.h
@@ -42,6 +42,7 @@
#include <QtMultimedia/qmediaservice.h>
#include <QtMultimedia/qmediarecorder.h>
+#include <QtMultimedia/qmediametadata.h>
QT_BEGIN_NAMESPACE
@@ -52,7 +53,6 @@ QT_BEGIN_NAMESPACE
// Required for QDoc workaround
class QString;
-class QMetaDataWriterControl;
class Q_MULTIMEDIA_EXPORT QMediaRecorderControl : public QObject
{
@@ -77,7 +77,8 @@ public:
virtual void setEncoderSettings(const QMediaEncoderSettings &settings) = 0;
- virtual QMetaDataWriterControl *metaDataControl() { return nullptr; }
+ virtual void setMetaData(const QMediaMetaData &) {}
+ virtual QMediaMetaData metaData() const { return {}; }
Q_SIGNALS:
void stateChanged(QMediaRecorder::State state);
@@ -87,6 +88,7 @@ Q_SIGNALS:
void volumeChanged(qreal volume);
void actualLocationChanged(const QUrl &location);
void error(int error, const QString &errorString);
+ void metaDataChanged();
public Q_SLOTS:
virtual void setState(QMediaRecorder::State state) = 0;
diff --git a/src/multimedia/controls/qmediastreamscontrol.h b/src/multimedia/controls/qmediastreamscontrol.h
index ac9674699..8fedd4995 100644
--- a/src/multimedia/controls/qmediastreamscontrol.h
+++ b/src/multimedia/controls/qmediastreamscontrol.h
@@ -50,6 +50,7 @@ QT_BEGIN_NAMESPACE
// Required for QDoc workaround
class QString;
+class QMediaMetaData;
class Q_MULTIMEDIA_EXPORT QMediaStreamsControl : public QObject
{
@@ -61,7 +62,7 @@ public:
virtual int streamCount() = 0;
virtual StreamType streamType(int streamNumber) = 0;
- virtual QVariant metaData(int streamNumber, const QString &key) = 0;
+ virtual QMediaMetaData metaData(int streamNumber) = 0;
virtual bool isActive(int streamNumber) = 0;
virtual void setActive(int streamNumber, bool state) = 0;
diff --git a/src/multimedia/controls/qmetadatareadercontrol.cpp b/src/multimedia/controls/qmetadatareadercontrol.cpp
deleted file mode 100644
index 18b94a795..000000000
--- a/src/multimedia/controls/qmetadatareadercontrol.cpp
+++ /dev/null
@@ -1,140 +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$
-**
-****************************************************************************/
-
-#include <qmetadatareadercontrol.h>
-
-QT_BEGIN_NAMESPACE
-
-
-/*!
- \class QMetaDataReaderControl
- \obsolete
- \inmodule QtMultimedia
-
-
- \ingroup multimedia_control
-
-
- \brief The QMetaDataReaderControl class provides read access to the
- meta-data of a QMediaService's media.
-
- If a QMediaService can provide read or write access to the meta-data of
- its current media it will implement QMetaDataReaderControl. This control
- provides functions for both retrieving and setting meta-data values.
- Meta-data may be addressed by the keys defined in the
- QMediaMetaData namespace.
-
- The functionality provided by this control is exposed to application
- code by the meta-data members of QMediaSource, and so meta-data access
- is potentially available in any of the media object classes. Any media
- service may implement QMetaDataReaderControl.
-
- The interface name of QMetaDataReaderControl is
- \c org.qt-project.qt.metadatareadercontrol/5.0 as defined in
- QMetaDataReaderControl_iid.
-
- \sa QMediaService::requestControl(), QMediaSource
-*/
-
-/*!
- \macro QMetaDataReaderControl_iid
-
- \c org.qt-project.qt.metadatareadercontrol/5.0
-
- Defines the interface name of the QMetaDataReaderControl class.
-
- \relates QMetaDataReaderControl
-*/
-
-/*!
- Construct a QMetaDataReaderControl with \a parent. This class is meant as a base class
- for service specific meta data providers so this constructor is protected.
-*/
-
-QMetaDataReaderControl::QMetaDataReaderControl(QObject *parent)
- : QObject(parent)
-{
-}
-
-/*!
- \fn bool QMetaDataReaderControl::isMetaDataAvailable() const
-
- Identifies if meta-data is available from a media service.
-
- Returns true if the meta-data is available and false otherwise.
-*/
-
-/*!
- \fn QVariant QMetaDataReaderControl::metaData(const QString &key) const
-
- Returns the meta-data for the given \a key.
-*/
-
-/*!
- \fn QMetaDataReaderControl::availableMetaData() const
-
- Returns a list of keys there is meta-data available for.
-*/
-
-/*!
- \fn void QMetaDataReaderControl::metaDataChanged()
-
- Signal the changes of meta-data.
-
- If multiple meta-data elements are changed,
- metaDataChanged(const QString &key, const QVariant &value) signal is emitted
- for each of them with metaDataChanged() changed emitted once.
-*/
-
-/*!
- \fn void QMetaDataReaderControl::metaDataChanged(const QString &key, const QVariant &value)
-
- Signal the changes of one meta-data element \a value with the given \a key.
-*/
-
-/*!
- \fn void QMetaDataReaderControl::metaDataAvailableChanged(bool available)
-
- Signal the availability of meta-data has changed, \a available will
- be true if the multimedia object has meta-data.
-*/
-
-QT_END_NAMESPACE
-
-#include "moc_qmetadatareadercontrol.cpp"
diff --git a/src/multimedia/controls/qmetadatareadercontrol.h b/src/multimedia/controls/qmetadatareadercontrol.h
deleted file mode 100644
index e45777a15..000000000
--- a/src/multimedia/controls/qmetadatareadercontrol.h
+++ /dev/null
@@ -1,79 +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 QMETADATAREADERCONTROL_H
-#define QMETADATAREADERCONTROL_H
-
-#include <QtMultimedia/qmediaservice.h>
-#include <QtMultimedia/qmediasource.h>
-
-#include <QtMultimedia/qtmultimediaglobal.h>
-#include <QtMultimedia/qmultimedia.h>
-
-QT_BEGIN_NAMESPACE
-
-// Required for QDoc workaround
-class QString;
-
-class Q_MULTIMEDIA_EXPORT QMetaDataReaderControl : public QObject
-{
- Q_OBJECT
-public:
- virtual bool isMetaDataAvailable() const = 0;
-
- virtual QVariant metaData(const QString &key) const = 0;
- virtual QStringList availableMetaData() const = 0;
-
-Q_SIGNALS:
- void metaDataChanged();
- void metaDataChanged(const QString &key, const QVariant &value);
-
- void metaDataAvailableChanged(bool available);
-
-protected:
- explicit QMetaDataReaderControl(QObject *parent = nullptr);
-};
-
-#define QMetaDataReaderControl_iid "org.qt-project.qt.metadatareadercontrol/5.0"
-Q_MEDIA_DECLARE_CONTROL(QMetaDataReaderControl, QMetaDataReaderControl_iid)
-
-QT_END_NAMESPACE
-
-
-#endif // QMETADATAPROVIDER_H
diff --git a/src/multimedia/controls/qmetadatawritercontrol.cpp b/src/multimedia/controls/qmetadatawritercontrol.cpp
deleted file mode 100644
index e57a0c873..000000000
--- a/src/multimedia/controls/qmetadatawritercontrol.cpp
+++ /dev/null
@@ -1,160 +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$
-**
-****************************************************************************/
-
-#include <qmetadatawritercontrol.h>
-
-QT_BEGIN_NAMESPACE
-
-
-/*!
- \class QMetaDataWriterControl
- \obsolete
- \inmodule QtMultimedia
-
-
- \ingroup multimedia_control
-
-
- \brief The QMetaDataWriterControl class provides write access to the
- meta-data of a QMediaService's media.
-
- If a QMediaService can provide write access to the meta-data of its
- current media it will implement QMetaDataWriterControl. This control
- provides functions for both retrieving and setting meta-data values.
- Meta-data may be addressed by the keys defined in the
- QMediaMetaData namespace.
-
- The functionality provided by this control is exposed to application code
- by the meta-data members of QMediaSource, and so meta-data access is
- potentially available in any of the media object classes. Any media
- service may implement QMetaDataControl.
-
- The interface name of QMetaDataWriterControl is \c org.qt-project.qt.metadatawritercontrol/5.0 as
- defined in QMetaDataWriterControl_iid.
-
- \sa QMediaService::requestControl(), QMediaSource
-*/
-
-/*!
- \macro QMetaDataWriterControl_iid
-
- \c org.qt-project.qt.metadatawritercontrol/5.0
-
- Defines the interface name of the QMetaDataWriterControl class.
-
- \relates QMetaDataWriterControl
-*/
-
-/*!
- Construct a QMetaDataWriterControl with \a parent. This class is meant as a base class
- for service specific meta data providers so this constructor is protected.
-*/
-
-QMetaDataWriterControl::QMetaDataWriterControl(QObject *parent)
- : QObject(parent)
-{
-}
-
-/*!
- \fn bool QMetaDataWriterControl::isMetaDataAvailable() const
-
- Identifies if meta-data is available from a media service.
-
- Returns true if the meta-data is available and false otherwise.
-*/
-
-/*!
- \fn bool QMetaDataWriterControl::isWritable() const
-
- Identifies if a media service's meta-data can be edited.
-
- Returns true if the meta-data is writable and false otherwise.
-*/
-
-/*!
- \fn QVariant QMetaDataWriterControl::metaData(const QString &key) const
-
- Returns the meta-data for the given \a key.
-*/
-
-/*!
- \fn void QMetaDataWriterControl::setMetaData(const QString &key, const QVariant &value)
-
- Sets the \a value of the meta-data element with the given \a key.
-*/
-
-/*!
- \fn QMetaDataWriterControl::availableMetaData() const
-
- Returns a list of keys there is meta-data available for.
-*/
-
-/*!
- \fn void QMetaDataWriterControl::metaDataChanged()
-
- Signal the changes of meta-data.
-
- If multiple meta-data elements are changed,
- metaDataChanged(const QString &key, const QVariant &value) signal is emitted
- for each of them with metaDataChanged() changed emitted once.
-*/
-
-/*!
- \fn void QMetaDataWriterControl::metaDataChanged(const QString &key, const QVariant &value)
-
- Signal the changes of one meta-data element \a value with the given \a key.
-*/
-
-/*!
- \fn void QMetaDataWriterControl::metaDataAvailableChanged(bool available)
-
- Signal the availability of meta-data has changed, \a available will
- be true if the multimedia object has meta-data.
-*/
-
-/*!
- \fn void QMetaDataWriterControl::writableChanged(bool writable)
-
- Signal a change in the writable status of meta-data, \a writable will be
- true if meta-data elements can be added or adjusted.
-*/
-
-QT_END_NAMESPACE
-
-#include "moc_qmetadatawritercontrol.cpp"
diff --git a/src/multimedia/controls/qmetadatawritercontrol.h b/src/multimedia/controls/qmetadatawritercontrol.h
deleted file mode 100644
index c10ff1fcd..000000000
--- a/src/multimedia/controls/qmetadatawritercontrol.h
+++ /dev/null
@@ -1,82 +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 QMETADATAWRITERCONTROL_H
-#define QMETADATAWRITERCONTROL_H
-
-#include <QtMultimedia/qmediaservice.h>
-#include <QtMultimedia/qmediasource.h>
-
-#include <QtMultimedia/qtmultimediaglobal.h>
-#include <QtMultimedia/qmultimedia.h>
-
-QT_BEGIN_NAMESPACE
-
-// Required for QDoc workaround
-class QString;
-
-class Q_MULTIMEDIA_EXPORT QMetaDataWriterControl : public QObject
-{
- Q_OBJECT
-public:
- virtual bool isWritable() const = 0;
- virtual bool isMetaDataAvailable() const = 0;
-
- virtual QVariant metaData(const QString &key) const = 0;
- virtual void setMetaData(const QString &key, const QVariant &value) = 0;
- virtual QStringList availableMetaData() const = 0;
-
-Q_SIGNALS:
- void metaDataChanged();
- void metaDataChanged(const QString &key, const QVariant &value);
-
- void writableChanged(bool writable);
- void metaDataAvailableChanged(bool available);
-
-protected:
- explicit QMetaDataWriterControl(QObject *parent = nullptr);
-};
-
-#define QMetaDataWriterControl_iid "org.qt-project.qt.metadatawritercontrol/5.0"
-Q_MEDIA_DECLARE_CONTROL(QMetaDataWriterControl, QMetaDataWriterControl_iid)
-
-QT_END_NAMESPACE
-
-
-#endif
diff --git a/src/multimedia/platform/android/mediaplayer/mediaplayer.pri b/src/multimedia/platform/android/mediaplayer/mediaplayer.pri
index 33348b38b..184e7efc3 100644
--- a/src/multimedia/platform/android/mediaplayer/mediaplayer.pri
+++ b/src/multimedia/platform/android/mediaplayer/mediaplayer.pri
@@ -3,11 +3,11 @@ INCLUDEPATH += $$PWD
HEADERS += \
$$PWD/qandroidmediaplayercontrol_p.h \
$$PWD/qandroidmediaservice_p.h \
- $$PWD/qandroidmetadatareadercontrol_p.h \
+ $$PWD/qandroidmetadata_p.h \
$$PWD/qandroidmediaplayervideorenderercontrol_p.h
SOURCES += \
$$PWD/qandroidmediaplayercontrol.cpp \
$$PWD/qandroidmediaservice.cpp \
- $$PWD/qandroidmetadatareadercontrol.cpp \
+ $$PWD/qandroidmetadata.cpp \
$$PWD/qandroidmediaplayervideorenderercontrol.cpp
diff --git a/src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol.cpp b/src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol.cpp
index d11e2ef14..11d18d362 100644
--- a/src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol.cpp
+++ b/src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol.cpp
@@ -40,6 +40,7 @@
#include "qandroidmediaplayercontrol_p.h"
#include "androidmediaplayer_p.h"
#include "qandroidvideooutput_p.h"
+#include "qandroidmetadata_p.h"
QT_BEGIN_NAMESPACE
@@ -298,6 +299,11 @@ QStringList QAndroidMediaPlayerControl::supportedCustomAudioRoles() const
<< "USAGE_VOICE_COMMUNICATION_SIGNALLING";
}
+QMediaMetaData QAndroidMediaPlayerControl::metaData() const
+{
+ return QAndroidMetaData::extractMetadata(mMediaContent);
+}
+
int QAndroidMediaPlayerControl::bufferStatus() const
{
return mBufferFilled ? 100 : 0;
@@ -536,7 +542,7 @@ void QAndroidMediaPlayerControl::onInfo(qint32 what, qint32 extra)
setSeekable(false);
break;
case AndroidMediaPlayer::MEDIA_INFO_METADATA_UPDATE:
- Q_EMIT metaDataUpdated();
+ Q_EMIT metaDataChanged();
break;
}
}
@@ -650,7 +656,7 @@ void QAndroidMediaPlayerControl::onStateChanged(qint32 state)
} else {
onBufferingChanged(100);
}
- Q_EMIT metaDataUpdated();
+ Q_EMIT metaDataChanged();
setAudioAvailable(true);
flushPendingStates();
break;
diff --git a/src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol_p.h b/src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol_p.h
index 40fbf8464..b8a5f9884 100644
--- a/src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol_p.h
+++ b/src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol_p.h
@@ -90,10 +90,11 @@ public:
void setCustomAudioRole(const QString &role) override;
QStringList supportedCustomAudioRoles() const override;
+ QMediaMetaData metaData() const override;
+
void setVideoOutput(QAndroidVideoOutput *videoOutput);
Q_SIGNALS:
- void metaDataUpdated();
void audioRoleChanged(QAudio::Role role);
void customAudioRoleChanged(const QString &role);
diff --git a/src/multimedia/platform/android/mediaplayer/qandroidmediaservice.cpp b/src/multimedia/platform/android/mediaplayer/qandroidmediaservice.cpp
index 15aaf962c..6f8e88dc0 100644
--- a/src/multimedia/platform/android/mediaplayer/qandroidmediaservice.cpp
+++ b/src/multimedia/platform/android/mediaplayer/qandroidmediaservice.cpp
@@ -40,7 +40,6 @@
#include "qandroidmediaservice_p.h"
#include "qandroidmediaplayercontrol_p.h"
-#include "qandroidmetadatareadercontrol_p.h"
#include "qandroidmediaplayervideorenderercontrol_p.h"
QT_BEGIN_NAMESPACE
@@ -48,17 +47,11 @@ QT_BEGIN_NAMESPACE
QAndroidMediaService::QAndroidMediaService()
{
mMediaControl = new QAndroidMediaPlayerControl;
- mMetadataControl = new QAndroidMetaDataReaderControl;
- connect(mMediaControl, SIGNAL(mediaChanged(QUrl)),
- mMetadataControl, SLOT(onMediaChanged(QUrl)));
- connect(mMediaControl, SIGNAL(metaDataUpdated()),
- mMetadataControl, SLOT(onUpdateMetaData()));
}
QAndroidMediaService::~QAndroidMediaService()
{
delete mVideoRendererControl;
- delete mMetadataControl;
delete mMediaControl;
}
@@ -67,9 +60,6 @@ QObject *QAndroidMediaService::requestControl(const char *name)
if (qstrcmp(name, QMediaPlayerControl_iid) == 0)
return mMediaControl;
- if (qstrcmp(name, QMetaDataReaderControl_iid) == 0)
- return mMetadataControl;
-
if (qstrcmp(name, QVideoRendererControl_iid) == 0) {
if (!mVideoRendererControl) {
mVideoRendererControl = new QAndroidMediaPlayerVideoRendererControl(mMediaControl);
@@ -93,11 +83,6 @@ QMediaPlayerControl *QAndroidMediaService::player()
return mMediaControl;
}
-QMetaDataReaderControl *QAndroidMediaService::dataReader()
-{
- return mMetadataControl;
-}
-
QVideoRendererControl *QAndroidMediaService::createVideoRenderer()
{
if (!mVideoRendererControl) {
diff --git a/src/multimedia/platform/android/mediaplayer/qandroidmediaservice_p.h b/src/multimedia/platform/android/mediaplayer/qandroidmediaservice_p.h
index 2a238e676..9b227809e 100644
--- a/src/multimedia/platform/android/mediaplayer/qandroidmediaservice_p.h
+++ b/src/multimedia/platform/android/mediaplayer/qandroidmediaservice_p.h
@@ -56,7 +56,6 @@
QT_BEGIN_NAMESPACE
class QAndroidMediaPlayerControl;
-class QAndroidMetaDataReaderControl;
class QAndroidMediaPlayerVideoRendererControl;
class QAndroidMediaService : public QMediaPlatformPlayerInterface
@@ -71,7 +70,6 @@ public:
// QMediaPlatformPlayerInterface
QMediaPlayerControl *player() override;
- QMetaDataReaderControl *dataReader() override;
// QMediaStreamsControl *streams() override;
QVideoRendererControl *createVideoRenderer() override;
@@ -79,7 +77,6 @@ public:
private:
QAndroidMediaPlayerControl *mMediaControl = nullptr;
- QAndroidMetaDataReaderControl *mMetadataControl = nullptr;
QAndroidMediaPlayerVideoRendererControl *mVideoRendererControl = nullptr;
};
diff --git a/src/multimedia/platform/android/mediaplayer/qandroidmetadatareadercontrol.cpp b/src/multimedia/platform/android/mediaplayer/qandroidmetadata.cpp
index 5a8987cf4..e086ba1b4 100644
--- a/src/multimedia/platform/android/mediaplayer/qandroidmetadatareadercontrol.cpp
+++ b/src/multimedia/platform/android/mediaplayer/qandroidmetadata.cpp
@@ -37,7 +37,7 @@
**
****************************************************************************/
-#include "qandroidmetadatareadercontrol_p.h"
+#include "qandroidmetadata_p.h"
#include "androidmediametadataretriever_p.h"
#include <QtMultimedia/qmediametadata.h>
@@ -71,90 +71,14 @@ static const char* qt_ID3GenreNames[] =
"Euro-House", "Dance Hall"
};
-typedef QList<QAndroidMetaDataReaderControl *> AndroidMetaDataReaders;
-Q_GLOBAL_STATIC(AndroidMetaDataReaders, g_metaDataReaders)
-Q_GLOBAL_STATIC(QMutex, g_metaDataReadersMtx)
-
-QAndroidMetaDataReaderControl::QAndroidMetaDataReaderControl(QObject *parent)
- : QMetaDataReaderControl(parent)
- , m_available(false)
-{
-}
-
-QAndroidMetaDataReaderControl::~QAndroidMetaDataReaderControl()
-{
- QMutexLocker l(g_metaDataReadersMtx());
- const int idx = g_metaDataReaders->indexOf(this);
- if (idx != -1)
- g_metaDataReaders->remove(idx);
-}
-
-bool QAndroidMetaDataReaderControl::isMetaDataAvailable() const
-{
- const QMutexLocker l(&m_mtx);
- return m_available && !m_metadata.isEmpty();
-}
-
-QVariant QAndroidMetaDataReaderControl::metaData(const QString &key) const
-{
- const QMutexLocker l(&m_mtx);
- return m_metadata.value(key);
-}
-
-QStringList QAndroidMetaDataReaderControl::availableMetaData() const
-{
- const QMutexLocker l(&m_mtx);
- return m_metadata.keys();
-}
-
-void QAndroidMetaDataReaderControl::onMediaChanged(const QUrl &media)
-{
- const QMutexLocker l(&m_mtx);
- m_metadata.clear();
- m_mediaContent = media;
-}
-
-void QAndroidMetaDataReaderControl::onUpdateMetaData()
+QMediaMetaData QAndroidMetaData::extractMetadata(const QUrl &url)
{
- {
- const QMutexLocker l(g_metaDataReadersMtx());
- if (!g_metaDataReaders->contains(this))
- g_metaDataReaders->append(this);
- }
-
- const QMutexLocker ml(&m_mtx);
- if (m_mediaContent.isEmpty())
- return;
-
- (void)QtConcurrent::run(&extractMetadata, this, m_mediaContent);
-}
-
-void QAndroidMetaDataReaderControl::updateData(const QVariantMap &metadata, const QUrl &url)
-{
- const QMutexLocker l(&m_mtx);
-
- if (m_mediaContent != url)
- return;
-
- const bool oldAvailable = m_available;
- m_metadata = metadata;
- m_available = !m_metadata.isEmpty();
-
- if (m_available != oldAvailable)
- Q_EMIT metaDataAvailableChanged(m_available);
-
- Q_EMIT metaDataChanged();
-}
-
-void QAndroidMetaDataReaderControl::extractMetadata(QAndroidMetaDataReaderControl *caller,
- const QUrl &url)
-{
- QVariantMap metadata;
+ QMediaMetaData metadata;
if (!url.isEmpty()) {
AndroidMediaMetadataRetriever retriever;
if (!retriever.setDataSource(url))
- return;
+ return metadata;
QString mimeType = retriever.extractMetadata(AndroidMediaMetadataRetriever::MimeType);
if (!mimeType.isNull())
@@ -175,12 +99,12 @@ void QAndroidMetaDataReaderControl::extractMetadata(QAndroidMetaDataReaderContro
if (!string.isNull()) {
metadata.insert(isVideo ? QMediaMetaData::LeadPerformer
: QMediaMetaData::ContributingArtist,
- string.split('/', Qt::SkipEmptyParts));
+ string.split(QLatin1Char('/'), Qt::SkipEmptyParts));
}
string = retriever.extractMetadata(AndroidMediaMetadataRetriever::Author);
if (!string.isNull())
- metadata.insert(QMediaMetaData::Author, string.split('/', Qt::SkipEmptyParts));
+ metadata.insert(QMediaMetaData::Author, string.split(QLatin1Char('/'), Qt::SkipEmptyParts));
string = retriever.extractMetadata(AndroidMediaMetadataRetriever::Bitrate);
if (!string.isNull()) {
@@ -195,7 +119,7 @@ void QAndroidMetaDataReaderControl::extractMetadata(QAndroidMetaDataReaderContro
string = retriever.extractMetadata(AndroidMediaMetadataRetriever::Composer);
if (!string.isNull())
- metadata.insert(QMediaMetaData::Composer, string.split('/', Qt::SkipEmptyParts));
+ metadata.insert(QMediaMetaData::Composer, string.split(QLatin1Char('/'), Qt::SkipEmptyParts));
string = retriever.extractMetadata(AndroidMediaMetadataRetriever::Date);
if (!string.isNull())
@@ -208,7 +132,7 @@ void QAndroidMetaDataReaderControl::extractMetadata(QAndroidMetaDataReaderContro
string = retriever.extractMetadata(AndroidMediaMetadataRetriever::Genre);
if (!string.isNull()) {
// The genre can be returned as an ID3v2 id, get the name for it in that case
- if (string.startsWith('(') && string.endsWith(')')) {
+ if (string.startsWith(QLatin1Char('(')) && string.endsWith(QLatin1Char(')'))) {
bool ok = false;
const int genreId = QStringView{string}.mid(1, string.length() - 2).toInt(&ok);
if (ok && genreId >= 0 && genreId <= 125)
@@ -228,20 +152,16 @@ void QAndroidMetaDataReaderControl::extractMetadata(QAndroidMetaDataReaderContro
metadata.insert(QMediaMetaData::Resolution, QSize(width, height));
}
- string = retriever.extractMetadata(AndroidMediaMetadataRetriever::Writer);
- if (!string.isNull())
- metadata.insert(QMediaMetaData::Writer, string.split('/', Qt::SkipEmptyParts));
+// string = retriever.extractMetadata(AndroidMediaMetadataRetriever::Writer);
+// if (!string.isNull())
+// metadata.insert(QMediaMetaData::Writer, string.split('/', Qt::SkipEmptyParts));
string = retriever.extractMetadata(AndroidMediaMetadataRetriever::Year);
if (!string.isNull())
metadata.insert(QMediaMetaData::Year, string.toInt());
}
- const QMutexLocker lock(g_metaDataReadersMtx());
- if (!g_metaDataReaders->contains(caller))
- return;
-
- caller->updateData(metadata, url);
+ return metadata;
}
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/darwin/camera/avfcamerametadatacontrol_p.h b/src/multimedia/platform/android/mediaplayer/qandroidmetadata_p.h
index 45addb946..4ce65dc09 100644
--- a/src/multimedia/platform/darwin/camera/avfcamerametadatacontrol_p.h
+++ b/src/multimedia/platform/android/mediaplayer/qandroidmetadata_p.h
@@ -37,8 +37,8 @@
**
****************************************************************************/
-#ifndef AVFCAMERAMETADATACONTROL_H
-#define AVFCAMERAMETADATACONTROL_H
+#ifndef QANDROIDMETADATA_H
+#define QANDROIDMETADATA_H
//
// W A R N I N G
@@ -51,31 +51,21 @@
// We mean it.
//
-#include <qmetadatawritercontrol.h>
-#include <QtCore/qvariant.h>
+#include <qmediametadata.h>
+#include <qurl.h>
+#include <QMutex>
+#include <QVariant>
QT_BEGIN_NAMESPACE
-class AVFMediaRecorderControl;
+class AndroidMediaMetadataRetriever;
-class AVFCameraMetaDataControl : public QMetaDataWriterControl
+class QAndroidMetaData : public QMediaMetaData
{
- 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;
+ static QMediaMetaData extractMetadata(const QUrl &url);
};
QT_END_NAMESPACE
-#endif
+#endif // QANDROIDMETADATA_H
diff --git a/src/multimedia/platform/android/mediaplayer/qandroidmetadatareadercontrol_p.h b/src/multimedia/platform/android/mediaplayer/qandroidmetadatareadercontrol_p.h
deleted file mode 100644
index 1f372ae17..000000000
--- a/src/multimedia/platform/android/mediaplayer/qandroidmetadatareadercontrol_p.h
+++ /dev/null
@@ -1,91 +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 QANDROIDMETADATAREADERCONTROL_H
-#define QANDROIDMETADATAREADERCONTROL_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 <QMetaDataReaderControl>
-#include <qurl.h>
-#include <QMutex>
-#include <QVariant>
-
-QT_BEGIN_NAMESPACE
-
-class AndroidMediaMetadataRetriever;
-
-class QAndroidMetaDataReaderControl : public QMetaDataReaderControl
-{
- Q_OBJECT
-public:
- explicit QAndroidMetaDataReaderControl(QObject *parent = 0);
- ~QAndroidMetaDataReaderControl() override;
-
- bool isMetaDataAvailable() const override;
-
- QVariant metaData(const QString &key) const override;
- QStringList availableMetaData() const override;
-
-public Q_SLOTS:
- void onMediaChanged(const QUrl &media);
- void onUpdateMetaData();
-
-private:
- void updateData(const QVariantMap &metadata, const QUrl &url);
- static void extractMetadata(QAndroidMetaDataReaderControl *caller, const QUrl &url);
-
- mutable QMutex m_mtx;
- QUrl m_mediaContent;
- bool m_available;
- QVariantMap m_metadata;
-};
-
-QT_END_NAMESPACE
-
-#endif // QANDROIDMETADATAREADERCONTROL_H
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/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 \
diff --git a/src/multimedia/platform/gstreamer/common/common.pri b/src/multimedia/platform/gstreamer/common/common.pri
index 54167b557..944e0ed60 100644
--- a/src/multimedia/platform/gstreamer/common/common.pri
+++ b/src/multimedia/platform/gstreamer/common/common.pri
@@ -2,6 +2,7 @@ HEADERS += \
$$PWD/qgstappsrc_p.h \
$$PWD/qgstreamerbushelper_p.h \
$$PWD/qgstreamermessage_p.h \
+ $$PWD/qgstreamermetadata_p.h \
$$PWD/qgstutils_p.h \
$$PWD/qgstvideobuffer_p.h \
$$PWD/qgstreamerbufferprobe_p.h \
@@ -18,6 +19,7 @@ SOURCES += \
$$PWD/qgstappsrc.cpp \
$$PWD/qgstreamerbushelper.cpp \
$$PWD/qgstreamermessage.cpp \
+ $$PWD/qgstreamermetadata.cpp \
$$PWD/qgstutils.cpp \
$$PWD/qgstvideobuffer.cpp \
$$PWD/qgstreamerbufferprobe.cpp \
diff --git a/src/multimedia/platform/gstreamer/common/qgstreamermetadata.cpp b/src/multimedia/platform/gstreamer/common/qgstreamermetadata.cpp
new file mode 100644
index 000000000..494bc8167
--- /dev/null
+++ b/src/multimedia/platform/gstreamer/common/qgstreamermetadata.cpp
@@ -0,0 +1,290 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+
+#include "qgstreamermetadata_p.h"
+#include <private/qgstreamerplayersession_p.h>
+#include <QDebug>
+#include <QtMultimedia/qmediametadata.h>
+#include <QtCore/qdatetime.h>
+
+#include <gst/gstversion.h>
+#include <private/qgstutils_p.h>
+
+QT_BEGIN_NAMESPACE
+
+struct {
+ const char *tag;
+ QMediaMetaData::Key key;
+} gstTagToMetaDataKey[] = {
+ { GST_TAG_TITLE, QMediaMetaData::Title },
+ { GST_TAG_COMMENT, QMediaMetaData::Comment },
+ { GST_TAG_DESCRIPTION, QMediaMetaData::Description },
+ { GST_TAG_GENRE, QMediaMetaData::Genre },
+ { "year", QMediaMetaData::Year },
+
+ { GST_TAG_LANGUAGE_CODE, QMediaMetaData::Language },
+
+ { GST_TAG_ORGANIZATION, QMediaMetaData::Publisher },
+ { GST_TAG_COPYRIGHT, QMediaMetaData::Copyright },
+
+ // Media
+ { GST_TAG_DURATION, QMediaMetaData::Duration },
+
+ // Audio
+ { GST_TAG_BITRATE, QMediaMetaData::AudioBitRate },
+ { GST_TAG_AUDIO_CODEC, QMediaMetaData::AudioCodec },
+
+ // Music
+ { GST_TAG_ALBUM, QMediaMetaData::AlbumTitle },
+ { GST_TAG_ALBUM_ARTIST, QMediaMetaData::AlbumArtist },
+ { GST_TAG_ARTIST, QMediaMetaData::ContributingArtist },
+ { GST_TAG_TRACK_NUMBER, QMediaMetaData::TrackNumber },
+
+ { GST_TAG_PREVIEW_IMAGE, QMediaMetaData::ThumbnailImage },
+ { GST_TAG_IMAGE, QMediaMetaData::CoverArtImage },
+
+ // Image/Video
+ { "resolution", QMediaMetaData::Resolution },
+ { GST_TAG_IMAGE_ORIENTATION, QMediaMetaData::Orientation },
+
+ // Video
+ { GST_TAG_VIDEO_CODEC, QMediaMetaData::VideoCodec },
+
+ // Movie
+ { GST_TAG_PERFORMER, QMediaMetaData::LeadPerformer },
+
+ { nullptr, QMediaMetaData::Title }
+};
+
+static QMediaMetaData::Key tagToKey(const char *tag)
+{
+ auto *map = gstTagToMetaDataKey;
+ while (map->tag) {
+ if (!strcmp(map->tag, tag))
+ return map->key;
+ ++map;
+ }
+ return QMediaMetaData::Key(-1);
+}
+
+static const char *keyToTag(QMediaMetaData::Key key)
+{
+ auto *map = gstTagToMetaDataKey;
+ while (map->tag) {
+ if (map->key == key)
+ return map->tag;
+ ++map;
+ }
+ return nullptr;
+}
+
+//internal
+static void addTagToMap(const GstTagList *list,
+ const gchar *tag,
+ gpointer user_data)
+{
+ QMediaMetaData::Key key = tagToKey(tag);
+ if (key == QMediaMetaData::Key(-1))
+ return;
+
+ auto *map = reinterpret_cast<QHash<QMediaMetaData::Key, QVariant>* >(user_data);
+
+ GValue val;
+ val.g_type = 0;
+ gst_tag_list_copy_value(&val, list, tag);
+
+
+ switch( G_VALUE_TYPE(&val) ) {
+ case G_TYPE_STRING:
+ {
+ const gchar *str_value = g_value_get_string(&val);
+ map->insert(key, QString::fromUtf8(str_value));
+ break;
+ }
+ case G_TYPE_INT:
+ map->insert(key, g_value_get_int(&val));
+ break;
+ case G_TYPE_UINT:
+ map->insert(key, g_value_get_uint(&val));
+ break;
+ case G_TYPE_LONG:
+ map->insert(key, qint64(g_value_get_long(&val)));
+ break;
+ case G_TYPE_BOOLEAN:
+ map->insert(key, g_value_get_boolean(&val));
+ break;
+ case G_TYPE_CHAR:
+ map->insert(key, g_value_get_schar(&val));
+ break;
+ case G_TYPE_DOUBLE:
+ map->insert(key, g_value_get_double(&val));
+ break;
+ default:
+ // GST_TYPE_DATE is a function, not a constant, so pull it out of the switch
+ if (G_VALUE_TYPE(&val) == G_TYPE_DATE) {
+ const GDate *date = (const GDate *)g_value_get_boxed(&val);
+ if (g_date_valid(date)) {
+ int year = g_date_get_year(date);
+ int month = g_date_get_month(date);
+ int day = g_date_get_day(date);
+ map->insert(key, QDate(year,month,day));
+ if (!map->contains(QMediaMetaData::Year))
+ map->insert(QMediaMetaData::Year, year);
+ }
+ } else if (G_VALUE_TYPE(&val) == GST_TYPE_DATE_TIME) {
+ const GstDateTime *dateTime = (const GstDateTime *)g_value_get_boxed(&val);
+ int year = gst_date_time_has_year(dateTime) ? gst_date_time_get_year(dateTime) : 0;
+ int month = gst_date_time_has_month(dateTime) ? gst_date_time_get_month(dateTime) : 0;
+ int day = gst_date_time_has_day(dateTime) ? gst_date_time_get_day(dateTime) : 0;
+ if (gst_date_time_has_time(dateTime)) {
+ int hour = gst_date_time_get_hour(dateTime);
+ int minute = gst_date_time_get_minute(dateTime);
+ int second = gst_date_time_get_second(dateTime);
+ float tz = gst_date_time_get_time_zone_offset(dateTime);
+ QDateTime dateTime(QDate(year, month, day), QTime(hour, minute, second),
+ Qt::OffsetFromUTC, tz * 60 * 60);
+ map->insert(key, dateTime);
+ } else if (year > 0 && month > 0 && day > 0) {
+ map->insert(key, QDate(year,month,day));
+ }
+ if (!map->contains(QMediaMetaData::Year) && year > 0)
+ map->insert(QMediaMetaData::Year, year);
+ } else if (G_VALUE_TYPE(&val) == GST_TYPE_SAMPLE) {
+ GstSample *sample = (GstSample *)g_value_get_boxed(&val);
+ GstCaps* caps = gst_sample_get_caps(sample);
+ if (caps && !gst_caps_is_empty(caps)) {
+ GstStructure *structure = gst_caps_get_structure(caps, 0);
+ const gchar *name = gst_structure_get_name(structure);
+ if (QByteArray(name).startsWith("image/")) {
+ GstBuffer *buffer = gst_sample_get_buffer(sample);
+ if (buffer) {
+ GstMapInfo info;
+ gst_buffer_map(buffer, &info, GST_MAP_READ);
+ map->insert(key, QImage::fromData(info.data, info.size, name));
+ gst_buffer_unmap(buffer, &info);
+ }
+ }
+ }
+ } else if (G_VALUE_TYPE(&val) == GST_TYPE_FRACTION) {
+ int nom = gst_value_get_fraction_numerator(&val);
+ int denom = gst_value_get_fraction_denominator(&val);
+
+ if (denom > 0) {
+ map->insert(key, double(nom)/denom);
+ }
+ }
+ break;
+ }
+
+ g_value_unset(&val);
+}
+
+
+QGstreamerMetaData QGstreamerMetaData::fromGstTagList(const GstTagList *tags)
+{
+ QGstreamerMetaData m;
+ gst_tag_list_foreach(tags, addTagToMap, &m.data);
+ return m;
+}
+
+
+void QGstreamerMetaData::setMetaData(GstElement *element)
+{
+ if (!GST_IS_TAG_SETTER(element))
+ return;
+
+ gst_tag_setter_reset_tags(GST_TAG_SETTER(element));
+
+ for (auto it = data.cbegin(), end = data.cend(); it != end; ++it) {
+ const char *tagName = keyToTag(it.key());
+ const QVariant &tagValue = it.value();
+
+ switch (tagValue.typeId()) {
+ case QMetaType::QString:
+ gst_tag_setter_add_tags(GST_TAG_SETTER(element),
+ GST_TAG_MERGE_REPLACE,
+ tagName,
+ tagValue.toString().toUtf8().constData(),
+ nullptr);
+ break;
+ case QMetaType::Int:
+ case QMetaType::LongLong:
+ gst_tag_setter_add_tags(GST_TAG_SETTER(element),
+ GST_TAG_MERGE_REPLACE,
+ tagName,
+ tagValue.toInt(),
+ nullptr);
+ break;
+ case QMetaType::Double:
+ gst_tag_setter_add_tags(GST_TAG_SETTER(element),
+ GST_TAG_MERGE_REPLACE,
+ tagName,
+ tagValue.toDouble(),
+ nullptr);
+ break;
+ case QMetaType::QDateTime: {
+ QDateTime date = tagValue.toDateTime().toLocalTime();
+ gst_tag_setter_add_tags(GST_TAG_SETTER(element),
+ GST_TAG_MERGE_REPLACE,
+ tagName,
+ gst_date_time_new_local_time(
+ date.date().year(), date.date().month(), date.date().day(),
+ date.time().hour(), date.time().minute(), date.time().second()),
+ nullptr);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+}
+
+void QGstreamerMetaData::setMetaData(GstBin *bin)
+{
+ GstIterator *elements = gst_bin_iterate_all_by_interface(bin, GST_TYPE_TAG_SETTER);
+ GValue item = G_VALUE_INIT;
+ while (gst_iterator_next(elements, &item) == GST_ITERATOR_OK) {
+ GstElement * const element = GST_ELEMENT(g_value_get_object(&item));
+ setMetaData(element);
+ }
+ gst_iterator_free(elements);
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/multimedia/platform/qnx/mediaplayer/mmrenderermetadatareadercontrol_p.h b/src/multimedia/platform/gstreamer/common/qgstreamermetadata_p.h
index f540f3f93..9088215a5 100644
--- a/src/multimedia/platform/qnx/mediaplayer/mmrenderermetadatareadercontrol_p.h
+++ b/src/multimedia/platform/gstreamer/common/qgstreamermetadata_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 Research In Motion
+** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Toolkit.
@@ -36,8 +36,9 @@
** $QT_END_LICENSE$
**
****************************************************************************/
-#ifndef MMRENDERERMETADATAREADERCONTROL_H
-#define MMRENDERERMETADATAREADERCONTROL_H
+
+#ifndef QGSTREAMERMETADATA_H
+#define QGSTREAMERMETADATA_H
//
// W A R N I N G
@@ -50,28 +51,25 @@
// We mean it.
//
-#include "mmrenderermetadata_p.h"
-#include <qmetadatareadercontrol.h>
+#include <qmediametadata.h>
+#include <qvariant.h>
+
+#include <gst/gst.h>
QT_BEGIN_NAMESPACE
-class MmRendererMetaDataReaderControl : public QMetaDataReaderControl
+class QGstreamerPlayerSession;
+
+class QGstreamerMetaData : public QMediaMetaData
{
- Q_OBJECT
public:
- explicit MmRendererMetaDataReaderControl(QObject *parent = 0);
-
- bool isMetaDataAvailable() const override;
-
- QVariant metaData(const QString &key) const override;
- QStringList availableMetaData() const override;
-
- void setMetaData(const MmRendererMetaData &data);
+ static QGstreamerMetaData fromGstTagList(const GstTagList *tags);
+ GstTagList *toGstTagList() const;
-private:
- MmRendererMetaData m_metaData;
+ void setMetaData(GstBin *bin);
+ void setMetaData(GstElement *element);
};
QT_END_NAMESPACE
-#endif
+#endif // QGSTREAMERMETADATA_H
diff --git a/src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol.cpp b/src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol.cpp
index ef4161748..c8fdd00a3 100644
--- a/src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol.cpp
+++ b/src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol.cpp
@@ -71,6 +71,7 @@ QGstreamerPlayerControl::QGstreamerPlayerControl(QGstreamerPlayerSession *sessio
connect(m_session, &QGstreamerPlayerSession::error, this, &QGstreamerPlayerControl::error);
connect(m_session, &QGstreamerPlayerSession::invalidMedia, this, &QGstreamerPlayerControl::handleInvalidMedia);
connect(m_session, &QGstreamerPlayerSession::playbackRateChanged, this, &QGstreamerPlayerControl::playbackRateChanged);
+ connect(m_session, &QGstreamerPlayerSession::metaDataChanged, this, &QGstreamerPlayerControl::metaDataChanged);
}
QGstreamerPlayerControl::~QGstreamerPlayerControl()
@@ -379,6 +380,11 @@ QAudioDeviceInfo QGstreamerPlayerControl::audioOutput() const
return m_session->audioOutputDevice();
}
+QMediaMetaData QGstreamerPlayerControl::metaData() const
+{
+ return m_session->metaData();
+}
+
void QGstreamerPlayerControl::setVideoOutput(QObject *output)
{
m_session->setVideoRenderer(output);
diff --git a/src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol_p.h b/src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol_p.h
index 66deb54e7..1c4321663 100644
--- a/src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol_p.h
+++ b/src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol_p.h
@@ -99,6 +99,8 @@ public:
bool setAudioOutput(const QAudioDeviceInfo &) override;
QAudioDeviceInfo audioOutput() const override;
+ QMediaMetaData metaData() const override;
+
public Q_SLOTS:
void setPosition(qint64 pos) override;
diff --git a/src/multimedia/platform/gstreamer/common/qgstreamerplayersession.cpp b/src/multimedia/platform/gstreamer/common/qgstreamerplayersession.cpp
index 92ec8d7ec..6f4bb61d5 100644
--- a/src/multimedia/platform/gstreamer/common/qgstreamerplayersession.cpp
+++ b/src/multimedia/platform/gstreamer/common/qgstreamerplayersession.cpp
@@ -43,6 +43,7 @@
#include <private/qgstreamervideorendererinterface_p.h>
#include <private/qgstutils_p.h>
#include <private/qgstvideorenderersink_p.h>
+#include <private/qgstreamermetadata_p.h>
#include <gst/gstvalue.h>
#include <gst/base/gstbasesrc.h>
@@ -247,8 +248,8 @@ void QGstreamerPlayerSession::loadFromStream(const QNetworkRequest &request, QIO
m_appSrc->setStream(appSrcStream);
if (!parsePipeline() && m_playbin) {
- m_tags.clear();
- emit tagsChanged();
+ m_metaData.clear();
+ emit metaDataChanged();
g_object_set(G_OBJECT(m_playbin), "uri", "appsrc://", nullptr);
@@ -279,8 +280,8 @@ void QGstreamerPlayerSession::loadFromUri(const QNetworkRequest &request)
#endif
if (!parsePipeline() && m_playbin) {
- m_tags.clear();
- emit tagsChanged();
+ m_metaData.clear();
+ emit metaDataChanged();
g_object_set(G_OBJECT(m_playbin), "uri", m_request.url().toEncoded().constData(), nullptr);
@@ -921,14 +922,11 @@ bool QGstreamerPlayerSession::processBusMessage(const QGstreamerMessage &message
GstTagList *tag_list;
gst_message_parse_tag(gm, &tag_list);
- QMap<QByteArray, QVariant> newTags = QGstUtils::gstTagListToMap(tag_list);
- QMap<QByteArray, QVariant>::const_iterator it = newTags.constBegin();
- for ( ; it != newTags.constEnd(); ++it)
- m_tags.insert(it.key(), it.value()); // overwrite existing tags
+ m_metaData = QGstreamerMetaData::fromGstTagList(tag_list);
gst_tag_list_free(tag_list);
- emit tagsChanged();
+ emit metaDataChanged();
} else if (GST_MESSAGE_TYPE(gm) == GST_MESSAGE_DURATION) {
updateDuration();
}
@@ -1207,7 +1205,7 @@ void QGstreamerPlayerSession::getStreamsInfo()
if (!m_playbin)
return;
- QList< QMap<QString,QVariant> > oldProperties = m_streamProperties;
+ QList<QMediaMetaData> oldProperties = m_streamProperties;
QList<QMediaStreamsControl::StreamType> oldTypes = m_streamTypes;
QMap<QMediaStreamsControl::StreamType, int> oldOffset = m_playbin2StreamOffset;
@@ -1244,7 +1242,7 @@ void QGstreamerPlayerSession::getStreamsInfo()
for (int i=0; i<m_streamTypes.count(); i++) {
QMediaStreamsControl::StreamType streamType = m_streamTypes[i];
- QMap<QString, QVariant> streamProperties;
+ QMediaMetaData streamProperties;
int streamIndex = i - m_playbin2StreamOffset[streamType];
@@ -1322,22 +1320,16 @@ void QGstreamerPlayerSession::updateVideoResolutionTag()
gst_object_unref(GST_OBJECT(pad));
- QSize currentSize = m_tags.value("resolution").toSize();
- QSize currentAspectRatio = m_tags.value("pixel-aspect-ratio").toSize();
-
- if (currentSize != size || currentAspectRatio != aspectRatio) {
- if (aspectRatio.isEmpty())
- m_tags.remove("pixel-aspect-ratio");
+ QSize currentSize = m_metaData.value(QMediaMetaData::Resolution).toSize();
+ if (currentSize != size) {
if (size.isEmpty()) {
- m_tags.remove("resolution");
+ m_metaData.remove(QMediaMetaData::Resolution);
} else {
- m_tags.insert("resolution", QVariant(size));
- if (!aspectRatio.isEmpty())
- m_tags.insert("pixel-aspect-ratio", QVariant(aspectRatio));
+ m_metaData.insert(QMediaMetaData::Resolution, QVariant(size));
}
- emit tagsChanged();
+ emit metaDataChanged();
}
}
diff --git a/src/multimedia/platform/gstreamer/common/qgstreamerplayersession_p.h b/src/multimedia/platform/gstreamer/common/qgstreamerplayersession_p.h
index 187d942e7..1a3b329a7 100644
--- a/src/multimedia/platform/gstreamer/common/qgstreamerplayersession_p.h
+++ b/src/multimedia/platform/gstreamer/common/qgstreamerplayersession_p.h
@@ -119,8 +119,7 @@ public:
QMediaTimeRange availablePlaybackRanges() const;
- QMap<QByteArray ,QVariant> tags() const { return m_tags; }
- QMap<QString,QVariant> streamProperties(int streamNumber) const { return m_streamProperties[streamNumber]; }
+ QMediaMetaData streamProperties(int streamNumber) const { return m_streamProperties[streamNumber]; }
int streamCount() const { return m_streamProperties.count(); }
QMediaStreamsControl::StreamType streamType(int streamNumber) { return m_streamTypes.value(streamNumber, QMediaStreamsControl::UnknownStream); }
@@ -143,6 +142,8 @@ public:
void finishAudioOutputChange();
+ QMediaMetaData metaData() const { return m_metaData; }
+
public slots:
void loadFromUri(const QNetworkRequest &url);
void loadFromStream(const QNetworkRequest &url, QIODevice *stream);
@@ -167,7 +168,7 @@ signals:
void videoAvailableChanged(bool videoAvailable);
void bufferingProgressChanged(int percentFilled);
void playbackFinished();
- void tagsChanged();
+ void metaDataChanged();
void streamsChanged();
void seekableChanged(bool);
void error(int error, const QString &errorString);
@@ -229,8 +230,8 @@ private:
QGstAppSrc *m_appSrc = nullptr;
#endif
- QMap<QByteArray, QVariant> m_tags;
- QList< QMap<QString,QVariant> > m_streamProperties;
+ QMediaMetaData m_metaData;
+ QList<QMediaMetaData> m_streamProperties;
QList<QMediaStreamsControl::StreamType> m_streamTypes;
QMap<QMediaStreamsControl::StreamType, int> m_playbin2StreamOffset;
diff --git a/src/multimedia/platform/gstreamer/common/qgstutils.cpp b/src/multimedia/platform/gstreamer/common/qgstutils.cpp
index 2e44924b5..9baae11b7 100644
--- a/src/multimedia/platform/gstreamer/common/qgstutils.cpp
+++ b/src/multimedia/platform/gstreamer/common/qgstutils.cpp
@@ -62,125 +62,6 @@ template<typename T, int N> static int lengthOf(const T (&)[N]) { return N; }
QT_BEGIN_NAMESPACE
-//internal
-static void addTagToMap(const GstTagList *list,
- const gchar *tag,
- gpointer user_data)
-{
- QMap<QByteArray, QVariant> *map = reinterpret_cast<QMap<QByteArray, QVariant>* >(user_data);
-
- GValue val;
- val.g_type = 0;
- gst_tag_list_copy_value(&val,list,tag);
-
- switch( G_VALUE_TYPE(&val) ) {
- case G_TYPE_STRING:
- {
- const gchar *str_value = g_value_get_string(&val);
- map->insert(QByteArray(tag), QString::fromUtf8(str_value));
- break;
- }
- case G_TYPE_INT:
- map->insert(QByteArray(tag), g_value_get_int(&val));
- break;
- case G_TYPE_UINT:
- map->insert(QByteArray(tag), g_value_get_uint(&val));
- break;
- case G_TYPE_LONG:
- map->insert(QByteArray(tag), qint64(g_value_get_long(&val)));
- break;
- case G_TYPE_BOOLEAN:
- map->insert(QByteArray(tag), g_value_get_boolean(&val));
- break;
- case G_TYPE_CHAR:
-#if GLIB_CHECK_VERSION(2,32,0)
- map->insert(QByteArray(tag), g_value_get_schar(&val));
-#else
- map->insert(QByteArray(tag), g_value_get_char(&val));
-#endif
- break;
- case G_TYPE_DOUBLE:
- map->insert(QByteArray(tag), g_value_get_double(&val));
- break;
- default:
- // GST_TYPE_DATE is a function, not a constant, so pull it out of the switch
- if (G_VALUE_TYPE(&val) == G_TYPE_DATE) {
- const GDate *date = (const GDate *)g_value_get_boxed(&val);
- if (g_date_valid(date)) {
- int year = g_date_get_year(date);
- int month = g_date_get_month(date);
- int day = g_date_get_day(date);
- map->insert(QByteArray(tag), QDate(year,month,day));
- if (!map->contains("year"))
- map->insert("year", year);
- }
- } else if (G_VALUE_TYPE(&val) == GST_TYPE_DATE_TIME) {
- const GstDateTime *dateTime = (const GstDateTime *)g_value_get_boxed(&val);
- int year = gst_date_time_has_year(dateTime) ? gst_date_time_get_year(dateTime) : 0;
- int month = gst_date_time_has_month(dateTime) ? gst_date_time_get_month(dateTime) : 0;
- int day = gst_date_time_has_day(dateTime) ? gst_date_time_get_day(dateTime) : 0;
- if (gst_date_time_has_time(dateTime)) {
- int hour = gst_date_time_get_hour(dateTime);
- int minute = gst_date_time_get_minute(dateTime);
- int second = gst_date_time_get_second(dateTime);
- float tz = gst_date_time_get_time_zone_offset(dateTime);
- QDateTime dateTime(QDate(year, month, day), QTime(hour, minute, second),
- Qt::OffsetFromUTC, tz * 60 * 60);
- map->insert(QByteArray(tag), dateTime);
- } else if (year > 0 && month > 0 && day > 0) {
- map->insert(QByteArray(tag), QDate(year,month,day));
- }
- if (!map->contains("year") && year > 0)
- map->insert("year", year);
- } else if (G_VALUE_TYPE(&val) == GST_TYPE_SAMPLE) {
- GstSample *sample = (GstSample *)g_value_get_boxed(&val);
- GstCaps* caps = gst_sample_get_caps(sample);
- if (caps && !gst_caps_is_empty(caps)) {
- GstStructure *structure = gst_caps_get_structure(caps, 0);
- const gchar *name = gst_structure_get_name(structure);
- if (QByteArray(name).startsWith("image/")) {
- GstBuffer *buffer = gst_sample_get_buffer(sample);
- if (buffer) {
- GstMapInfo info;
- gst_buffer_map(buffer, &info, GST_MAP_READ);
- map->insert(QByteArray(tag), QImage::fromData(info.data, info.size, name));
- gst_buffer_unmap(buffer, &info);
- }
- }
- }
- } else if (G_VALUE_TYPE(&val) == GST_TYPE_FRACTION) {
- int nom = gst_value_get_fraction_numerator(&val);
- int denom = gst_value_get_fraction_denominator(&val);
-
- if (denom > 0) {
- map->insert(QByteArray(tag), double(nom)/denom);
- }
- }
- break;
- }
-
- g_value_unset(&val);
-}
-
-/*!
- \class QGstUtils
- \internal
-*/
-
-/*!
- Convert GstTagList structure to QMap<QByteArray, QVariant>.
-
- Mapping to int, bool, char, string, fractions and date are supported.
- Fraction values are converted to doubles.
-*/
-QMap<QByteArray, QVariant> QGstUtils::gstTagListToMap(const GstTagList *tags)
-{
- QMap<QByteArray, QVariant> res;
- gst_tag_list_foreach(tags, addTagToMap, &res);
-
- return res;
-}
-
/*!
Returns resolution of \a caps.
If caps doesn't have a valid size, an empty QSize is returned.
diff --git a/src/multimedia/platform/gstreamer/common/qgstutils_p.h b/src/multimedia/platform/gstreamer/common/qgstutils_p.h
index 8dee7b704..36de4d0e8 100644
--- a/src/multimedia/platform/gstreamer/common/qgstutils_p.h
+++ b/src/multimedia/platform/gstreamer/common/qgstutils_p.h
@@ -72,8 +72,6 @@ class QImage;
class QVideoSurfaceFormat;
namespace QGstUtils {
- Q_MULTIMEDIA_EXPORT QMap<QByteArray, QVariant> gstTagListToMap(const GstTagList *list);
-
Q_MULTIMEDIA_EXPORT QSize capsResolution(const GstCaps *caps);
Q_MULTIMEDIA_EXPORT QSize capsCorrectedResolution(const GstCaps *caps);
Q_MULTIMEDIA_EXPORT QAudioFormat audioFormatForCaps(const GstCaps *caps);
diff --git a/src/multimedia/platform/gstreamer/mediacapture/mediacapture.pri b/src/multimedia/platform/gstreamer/mediacapture/mediacapture.pri
index 5e8f76192..3f3b10f2c 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/mediacapture.pri
+++ b/src/multimedia/platform/gstreamer/mediacapture/mediacapture.pri
@@ -4,7 +4,6 @@ HEADERS += $$PWD/qgstreamercaptureservice_p.h \
$$PWD/qgstreamercapturesession_p.h \
$$PWD/qgstreamerrecordercontrol_p.h \
$$PWD/qgstreamercameracontrol_p.h \
- $$PWD/qgstreamercapturemetadatacontrol_p.h \
$$PWD/qgstreamerimagecapturecontrol_p.h \
$$PWD/qgstreamervideoinput_p.h
@@ -12,7 +11,6 @@ SOURCES += $$PWD/qgstreamercaptureservice.cpp \
$$PWD/qgstreamercapturesession.cpp \
$$PWD/qgstreamerrecordercontrol.cpp \
$$PWD/qgstreamercameracontrol.cpp \
- $$PWD/qgstreamercapturemetadatacontrol.cpp \
$$PWD/qgstreamerimagecapturecontrol.cpp \
$$PWD/qgstreamervideoinput.cpp
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturemetadatacontrol.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturemetadatacontrol.cpp
deleted file mode 100644
index ba4a757a3..000000000
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturemetadatacontrol.cpp
+++ /dev/null
@@ -1,169 +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$
-**
-****************************************************************************/
-
-#include "qgstreamercapturemetadatacontrol_p.h"
-
-#include <QtMultimedia/qmediametadata.h>
-
-#include <gst/gst.h>
-#include <gst/gstversion.h>
-
-
-typedef QMap<QString, QByteArray> QGstreamerMetaDataKeyLookup;
-Q_GLOBAL_STATIC(QGstreamerMetaDataKeyLookup, metadataKeys)
-
-static const QGstreamerMetaDataKeyLookup *qt_gstreamerMetaDataKeys()
-{
- if (metadataKeys->isEmpty()) {
- metadataKeys->insert(QMediaMetaData::Title, GST_TAG_TITLE);
- metadataKeys->insert(QMediaMetaData::SubTitle, 0);
- //metadataKeys->insert(QMediaMetaData::Author, 0);
- metadataKeys->insert(QMediaMetaData::Comment, GST_TAG_COMMENT);
- metadataKeys->insert(QMediaMetaData::Date, GST_TAG_DATE_TIME);
- metadataKeys->insert(QMediaMetaData::Description, GST_TAG_DESCRIPTION);
- //metadataKeys->insert(QMediaMetaData::Category, 0);
- metadataKeys->insert(QMediaMetaData::Genre, GST_TAG_GENRE);
- //metadataKeys->insert(QMediaMetaData::Year, 0);
- //metadataKeys->insert(QMediaMetaData::UserRating, 0);
-
- metadataKeys->insert(QMediaMetaData::Language, GST_TAG_LANGUAGE_CODE);
-
- metadataKeys->insert(QMediaMetaData::Publisher, GST_TAG_ORGANIZATION);
- metadataKeys->insert(QMediaMetaData::Copyright, GST_TAG_COPYRIGHT);
- //metadataKeys->insert(QMediaMetaData::ParentalRating, 0);
- //metadataKeys->insert(QMediaMetaData::RatingOrganisation, 0);
-
- // Media
- //metadataKeys->insert(QMediaMetaData::Size, 0);
- //metadataKeys->insert(QMediaMetaData::MediaType, 0);
- metadataKeys->insert(QMediaMetaData::Duration, GST_TAG_DURATION);
-
- // Audio
- metadataKeys->insert(QMediaMetaData::AudioBitRate, GST_TAG_BITRATE);
- metadataKeys->insert(QMediaMetaData::AudioCodec, GST_TAG_AUDIO_CODEC);
- //metadataKeys->insert(QMediaMetaData::ChannelCount, 0);
- //metadataKeys->insert(QMediaMetaData::SampleRate, 0);
-
- // Music
- metadataKeys->insert(QMediaMetaData::AlbumTitle, GST_TAG_ALBUM);
- metadataKeys->insert(QMediaMetaData::AlbumArtist, GST_TAG_ARTIST);
- metadataKeys->insert(QMediaMetaData::ContributingArtist, GST_TAG_PERFORMER);
- metadataKeys->insert(QMediaMetaData::Composer, GST_TAG_COMPOSER);
- //metadataKeys->insert(QMediaMetaData::Conductor, 0);
- //metadataKeys->insert(QMediaMetaData::Lyrics, 0);
- //metadataKeys->insert(QMediaMetaData::Mood, 0);
- metadataKeys->insert(QMediaMetaData::TrackNumber, GST_TAG_TRACK_NUMBER);
-
- //metadataKeys->insert(QMediaMetaData::CoverArtUrlSmall, 0);
- //metadataKeys->insert(QMediaMetaData::CoverArtUrlLarge, 0);
-
- // Image/Video
- //metadataKeys->insert(QMediaMetaData::Resolution, 0);
- //metadataKeys->insert(QMediaMetaData::PixelAspectRatio, 0);
-
- // Video
- //metadataKeys->insert(QMediaMetaData::VideoFrameRate, 0);
- //metadataKeys->insert(QMediaMetaData::VideoBitRate, 0);
- metadataKeys->insert(QMediaMetaData::VideoCodec, GST_TAG_VIDEO_CODEC);
-
- //metadataKeys->insert(QMediaMetaData::PosterUrl, 0);
-
- // Movie
- //metadataKeys->insert(QMediaMetaData::ChapterNumber, 0);
- //metadataKeys->insert(QMediaMetaData::Director, 0);
- metadataKeys->insert(QMediaMetaData::LeadPerformer, GST_TAG_PERFORMER);
- //metadataKeys->insert(QMediaMetaData::Writer, 0);
-
- // Photos
- metadataKeys->insert(QMediaMetaData::CameraManufacturer, GST_TAG_DEVICE_MANUFACTURER);
- metadataKeys->insert(QMediaMetaData::CameraModel, GST_TAG_DEVICE_MODEL);
- //metadataKeys->insert(QMediaMetaData::Event, 0, QMetaType::QString));
- //metadataKeys->insert(QMediaMetaData::Subject, 0, QMetaType::QString));
-
- metadataKeys->insert(QMediaMetaData::Orientation, GST_TAG_IMAGE_ORIENTATION);
-
- // GPS
- metadataKeys->insert(QMediaMetaData::GPSLatitude, GST_TAG_GEO_LOCATION_LATITUDE);
- metadataKeys->insert(QMediaMetaData::GPSLongitude, GST_TAG_GEO_LOCATION_LONGITUDE);
- metadataKeys->insert(QMediaMetaData::GPSAltitude, GST_TAG_GEO_LOCATION_ELEVATION);
- metadataKeys->insert(QMediaMetaData::GPSTrack, GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION);
- metadataKeys->insert(QMediaMetaData::GPSSpeed, GST_TAG_GEO_LOCATION_MOVEMENT_SPEED);
- metadataKeys->insert(QMediaMetaData::GPSImgDirection, GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION);
- }
-
- return metadataKeys;
-}
-
-QGstreamerCaptureMetaDataControl::QGstreamerCaptureMetaDataControl(QObject *parent)
- :QMetaDataWriterControl(parent)
-{
-}
-
-QVariant QGstreamerCaptureMetaDataControl::metaData(const QString &key) const
-{
- QGstreamerMetaDataKeyLookup::const_iterator it = qt_gstreamerMetaDataKeys()->find(key);
- if (it != qt_gstreamerMetaDataKeys()->constEnd())
- return m_values.value(it.value());
-
- return QVariant();
-}
-
-void QGstreamerCaptureMetaDataControl::setMetaData(const QString &key, const QVariant &value)
-{
- QGstreamerMetaDataKeyLookup::const_iterator it = qt_gstreamerMetaDataKeys()->find(key);
- if (it != qt_gstreamerMetaDataKeys()->constEnd()) {
- m_values.insert(it.value(), value);
-
- emit QMetaDataWriterControl::metaDataChanged();
- emit QMetaDataWriterControl::metaDataChanged(key, value);
- emit metaDataChanged(m_values);
- }
-}
-
-QStringList QGstreamerCaptureMetaDataControl::availableMetaData() const
-{
- QStringList res;
- for (auto it = m_values.keyBegin(), end = m_values.keyEnd(); it != end; ++it) {
- QString tag = qt_gstreamerMetaDataKeys()->key(*it);
- if (!tag.isEmpty())
- res.append(tag);
- }
-
- return res;
-}
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturemetadatacontrol_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturemetadatacontrol_p.h
deleted file mode 100644
index 6e2106019..000000000
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturemetadatacontrol_p.h
+++ /dev/null
@@ -1,83 +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 QGSTREAMERCAPTUREMETADATACONTROL_H
-#define QGSTREAMERCAPTUREMETADATACONTROL_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 <qvariant.h>
-
-QT_BEGIN_NAMESPACE
-
-class QGstreamerCaptureMetaDataControl : public QMetaDataWriterControl
-{
- Q_OBJECT
-public:
- QGstreamerCaptureMetaDataControl(QObject *parent);
- ~QGstreamerCaptureMetaDataControl() {}
-
-
- bool isMetaDataAvailable() const override { return true; }
- bool isWritable() const override { return true; }
-
- QVariant metaData(const QString &key) const override;
- void setMetaData(const QString &key, const QVariant &value) override;
- QStringList availableMetaData() const override;
-
-Q_SIGNALS:
- void metaDataChanged(const QMap<QByteArray, QVariant>&);
-
-private:
- QMap<QByteArray, QVariant> m_values;
-};
-
-QT_END_NAMESPACE
-
-#endif // QGSTREAMERCAPTUREMETADATACONTROL_H
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp
index 191fb4575..56ba1da3e 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp
@@ -42,7 +42,6 @@
#include "qgstreamerrecordercontrol_p.h"
#include "qgstreamercameracontrol_p.h"
#include <private/qgstreamerbushelper_p.h>
-#include "qgstreamercapturemetadatacontrol_p.h"
#if defined(USE_GSTREAMER_CAMERA)
#include "qgstreamervideoinput_p.h"
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp
index 578e4d511..528d295c9 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp
@@ -862,13 +862,13 @@ void QGstreamerCaptureSession::setAudioCaptureDevice(const QAudioDeviceInfo &dev
m_audioDevice = device;
}
-void QGstreamerCaptureSession::setMetaData(const QMap<QByteArray, QVariant> &data)
+void QGstreamerCaptureSession::setMetaData(const QGstreamerMetaData &data)
{
//qDebug() << "QGstreamerCaptureSession::setMetaData" << data;
m_metaData = data;
if (m_encodeBin)
- QGstUtils::setMetaData(GST_BIN(m_encodeBin), data);
+ m_metaData.setMetaData(GST_BIN(m_encodeBin));
}
bool QGstreamerCaptureSession::processBusMessage(const QGstreamerMessage &message)
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h
index fc16b1d6a..56641af49 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h
@@ -63,6 +63,7 @@
#include <private/qgstreamerbushelper_p.h>
#include <private/qgstreamerbufferprobe_p.h>
+#include <private/qgstreamermetadata_p.h>
QT_BEGIN_NAMESPACE
@@ -157,7 +158,7 @@ public slots:
void dumpGraph(const QString &fileName);
- void setMetaData(const QMap<QByteArray, QVariant>&);
+ void setMetaData(const QGstreamerMetaData &);
void setMuted(bool);
void setVolume(qreal volume);
@@ -184,7 +185,7 @@ private:
bool m_waitingForEos;
PipelineMode m_pipelineMode;
QGstreamerCaptureSession::CaptureMode m_captureMode;
- QMap<QByteArray, QVariant> m_metaData;
+ QGstreamerMetaData m_metaData;
QGstreamerElementFactory *m_audioPreviewFactory;
QGstreamerVideoInput *m_videoInputFactory;
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp
index caeec0994..5c13fccb4 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp
@@ -38,7 +38,6 @@
****************************************************************************/
#include "qgstreamerrecordercontrol_p.h"
-#include "qgstreamercapturemetadatacontrol_p.h"
#include <QtCore/QDebug>
#include <QtGui/qdesktopservices.h>
#include <QStandardPaths>
@@ -57,15 +56,10 @@ QGstreamerRecorderControl::QGstreamerRecorderControl(QGstreamerCaptureSession *s
connect(m_session, SIGNAL(mutedChanged(bool)), SIGNAL(mutedChanged(bool)));
connect(m_session, SIGNAL(volumeChanged(qreal)), SIGNAL(volumeChanged(qreal)));
m_hasPreviewState = m_session->captureMode() != QGstreamerCaptureSession::Audio;
-
- m_metaData = new QGstreamerCaptureMetaDataControl(this);
- connect(m_metaData, SIGNAL(metaDataChanged(QMap<QByteArray,QVariant>)),
- m_session, SLOT(setMetaData(QMap<QByteArray,QVariant>)));
}
QGstreamerRecorderControl::~QGstreamerRecorderControl()
{
- delete m_metaData;
}
QUrl QGstreamerRecorderControl::outputLocation() const
@@ -243,7 +237,12 @@ QMediaEncoderSettings QGstreamerRecorderControl::resolvedEncoderSettings() const
return f;
}
-QMetaDataWriterControl *QGstreamerRecorderControl::metaDataControl()
+void QGstreamerRecorderControl::setMetaData(const QMediaMetaData &metaData)
+{
+ m_metaData = static_cast<const QGstreamerMetaData &>(metaData);
+}
+
+QMediaMetaData QGstreamerRecorderControl::metaData() const
{
return m_metaData;
}
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol_p.h
index 340337058..0196ef835 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol_p.h
@@ -60,6 +60,7 @@
QT_BEGIN_NAMESPACE
class QGstreamerCaptureMetaDataControl;
+class QMediaMetaData;
class QGstreamerRecorderControl : public QMediaRecorderControl
{
@@ -89,7 +90,8 @@ public:
QMediaEncoderSettings encoderSettings() const { return m_settings; }
QMediaEncoderSettings resolvedEncoderSettings() const;
- QMetaDataWriterControl *metaDataControl() override;
+ void setMetaData(const QMediaMetaData &) override;
+ QMediaMetaData metaData() const override;
public slots:
void setState(QMediaRecorder::State state) override;
@@ -110,7 +112,7 @@ private:
QUrl m_outputLocation;
QMediaEncoderSettings m_settings;
QGstreamerCaptureSession *m_session;
- QGstreamerCaptureMetaDataControl *m_metaData = nullptr;;
+ QGstreamerMetaData m_metaData;
QMediaRecorder::State m_state;
QMediaRecorder::Status m_status;
bool m_hasPreviewState;
diff --git a/src/multimedia/platform/gstreamer/mediaplayer/mediaplayer.pri b/src/multimedia/platform/gstreamer/mediaplayer/mediaplayer.pri
index 1a0d7cefc..1071b25a2 100644
--- a/src/multimedia/platform/gstreamer/mediaplayer/mediaplayer.pri
+++ b/src/multimedia/platform/gstreamer/mediaplayer/mediaplayer.pri
@@ -3,9 +3,7 @@ INCLUDEPATH += $$PWD
HEADERS += \
$$PWD/qgstreamerplayerservice_p.h \
$$PWD/qgstreamerstreamscontrol_p.h \
- $$PWD/qgstreamermetadataprovider_p.h
SOURCES += \
$$PWD/qgstreamerplayerservice.cpp \
$$PWD/qgstreamerstreamscontrol.cpp \
- $$PWD/qgstreamermetadataprovider.cpp
diff --git a/src/multimedia/platform/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp b/src/multimedia/platform/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp
deleted file mode 100644
index 578bbb8db..000000000
--- a/src/multimedia/platform/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp
+++ /dev/null
@@ -1,184 +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$
-**
-****************************************************************************/
-
-#include "qgstreamermetadataprovider_p.h"
-#include <private/qgstreamerplayersession_p.h>
-#include <QDebug>
-#include <QtMultimedia/qmediametadata.h>
-
-#include <gst/gstversion.h>
-#include <private/qgstutils_p.h>
-
-QT_BEGIN_NAMESPACE
-
-typedef QMap<QByteArray, QString> QGstreamerMetaDataKeyLookup;
-Q_GLOBAL_STATIC(QGstreamerMetaDataKeyLookup, metadataKeys)
-
-static const QGstreamerMetaDataKeyLookup *qt_gstreamerMetaDataKeys()
-{
- if (metadataKeys->isEmpty()) {
- metadataKeys->insert(GST_TAG_TITLE, QMediaMetaData::Title);
- //metadataKeys->insert(0, QMediaMetaData::SubTitle);
- //metadataKeys->insert(0, QMediaMetaData::Author);
- metadataKeys->insert(GST_TAG_COMMENT, QMediaMetaData::Comment);
- metadataKeys->insert(GST_TAG_DESCRIPTION, QMediaMetaData::Description);
- //metadataKeys->insert(0, QMediaMetaData::Category);
- metadataKeys->insert(GST_TAG_GENRE, QMediaMetaData::Genre);
- metadataKeys->insert("year", QMediaMetaData::Year);
- //metadataKeys->insert(0, QMediaMetaData::UserRating);
-
- metadataKeys->insert(GST_TAG_LANGUAGE_CODE, QMediaMetaData::Language);
-
- metadataKeys->insert(GST_TAG_ORGANIZATION, QMediaMetaData::Publisher);
- metadataKeys->insert(GST_TAG_COPYRIGHT, QMediaMetaData::Copyright);
- //metadataKeys->insert(0, QMediaMetaData::ParentalRating);
- //metadataKeys->insert(0, QMediaMetaData::RatingOrganisation);
-
- // Media
- //metadataKeys->insert(0, QMediaMetaData::Size);
- //metadataKeys->insert(0,QMediaMetaData::MediaType );
- metadataKeys->insert(GST_TAG_DURATION, QMediaMetaData::Duration);
-
- // Audio
- metadataKeys->insert(GST_TAG_BITRATE, QMediaMetaData::AudioBitRate);
- metadataKeys->insert(GST_TAG_AUDIO_CODEC, QMediaMetaData::AudioCodec);
- //metadataKeys->insert(0, QMediaMetaData::ChannelCount);
- //metadataKeys->insert(0, QMediaMetaData::SampleRate);
-
- // Music
- metadataKeys->insert(GST_TAG_ALBUM, QMediaMetaData::AlbumTitle);
- metadataKeys->insert(GST_TAG_ALBUM_ARTIST, QMediaMetaData::AlbumArtist);
- metadataKeys->insert(GST_TAG_ARTIST, QMediaMetaData::ContributingArtist);
- //metadataKeys->insert(0, QMediaMetaData::Conductor);
- //metadataKeys->insert(0, QMediaMetaData::Lyrics);
- //metadataKeys->insert(0, QMediaMetaData::Mood);
- metadataKeys->insert(GST_TAG_TRACK_NUMBER, QMediaMetaData::TrackNumber);
-
- //metadataKeys->insert(0, QMediaMetaData::CoverArtUrlSmall);
- //metadataKeys->insert(0, QMediaMetaData::CoverArtUrlLarge);
- metadataKeys->insert(GST_TAG_PREVIEW_IMAGE, QMediaMetaData::ThumbnailImage);
- metadataKeys->insert(GST_TAG_IMAGE, QMediaMetaData::CoverArtImage);
-
- // Image/Video
- metadataKeys->insert("resolution", QMediaMetaData::Resolution);
- metadataKeys->insert("pixel-aspect-ratio", QMediaMetaData::PixelAspectRatio);
- metadataKeys->insert(GST_TAG_IMAGE_ORIENTATION, QMediaMetaData::Orientation);
-
- // Video
- //metadataKeys->insert(0, QMediaMetaData::VideoFrameRate);
- //metadataKeys->insert(0, QMediaMetaData::VideoBitRate);
- metadataKeys->insert(GST_TAG_VIDEO_CODEC, QMediaMetaData::VideoCodec);
-
- //metadataKeys->insert(0, QMediaMetaData::PosterUrl);
-
- // Movie
- //metadataKeys->insert(0, QMediaMetaData::ChapterNumber);
- //metadataKeys->insert(0, QMediaMetaData::Director);
- metadataKeys->insert(GST_TAG_PERFORMER, QMediaMetaData::LeadPerformer);
- //metadataKeys->insert(0, QMediaMetaData::Writer);
-
- // Photos
- //metadataKeys->insert(0, QMediaMetaData::CameraManufacturer);
- //metadataKeys->insert(0, QMediaMetaData::CameraModel);
- //metadataKeys->insert(0, QMediaMetaData::Event);
- //metadataKeys->insert(0, QMediaMetaData::Subject);
- }
-
- return metadataKeys;
-}
-
-QGstreamerMetaDataProvider::QGstreamerMetaDataProvider(QGstreamerPlayerSession *session, QObject *parent)
- :QMetaDataReaderControl(parent), m_session(session)
-{
- connect(m_session, SIGNAL(tagsChanged()), SLOT(updateTags()));
-}
-
-QGstreamerMetaDataProvider::~QGstreamerMetaDataProvider()
-{
-}
-
-bool QGstreamerMetaDataProvider::isMetaDataAvailable() const
-{
- return !m_session->tags().isEmpty();
-}
-
-bool QGstreamerMetaDataProvider::isWritable() const
-{
- return false;
-}
-
-QVariant QGstreamerMetaDataProvider::metaData(const QString &key) const
-{
- if (key == QMediaMetaData::Orientation)
- return QGstUtils::fromGStreamerOrientation(m_tags.value(key));
- return m_tags.value(key);
-}
-
-QStringList QGstreamerMetaDataProvider::availableMetaData() const
-{
- return m_tags.keys();
-}
-
-void QGstreamerMetaDataProvider::updateTags()
-{
- QVariantMap oldTags = m_tags;
- m_tags.clear();
- bool changed = false;
-
- const auto tags = m_session->tags();
- for (auto i = tags.cbegin(), end = tags.cend(); i != end; ++i) {
- //use gstreamer native keys for elements not in our key map
- QString key = qt_gstreamerMetaDataKeys()->value(i.key(), i.key());
- m_tags.insert(key, i.value());
- if (i.value() != oldTags.value(key)) {
- changed = true;
- emit metaDataChanged(key, i.value());
- }
- }
-
- if (oldTags.isEmpty() != m_tags.isEmpty()) {
- emit metaDataAvailableChanged(isMetaDataAvailable());
- changed = true;
- }
-
- if (changed)
- emit metaDataChanged();
-}
-
-QT_END_NAMESPACE
diff --git a/src/multimedia/platform/gstreamer/mediaplayer/qgstreamermetadataprovider_p.h b/src/multimedia/platform/gstreamer/mediaplayer/qgstreamermetadataprovider_p.h
deleted file mode 100644
index 468ab060b..000000000
--- a/src/multimedia/platform/gstreamer/mediaplayer/qgstreamermetadataprovider_p.h
+++ /dev/null
@@ -1,84 +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 QGSTREAMERMETADATAPROVIDER_H
-#define QGSTREAMERMETADATAPROVIDER_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 <qmetadatareadercontrol.h>
-#include <qvariant.h>
-
-QT_BEGIN_NAMESPACE
-
-class QGstreamerPlayerSession;
-
-class QGstreamerMetaDataProvider : public QMetaDataReaderControl
-{
- Q_OBJECT
-public:
- QGstreamerMetaDataProvider( QGstreamerPlayerSession *session, QObject *parent );
- virtual ~QGstreamerMetaDataProvider();
-
- bool isMetaDataAvailable() const override;
- bool isWritable() const;
-
- QVariant metaData(const QString &key) const override;
- QStringList availableMetaData() const override;
-
-private slots:
- void updateTags();
-
-private:
- QGstreamerPlayerSession *m_session = nullptr;
- QVariantMap m_tags;
-};
-
-QT_END_NAMESPACE
-
-#endif // QGSTREAMERMETADATAPROVIDER_H
diff --git a/src/multimedia/platform/gstreamer/mediaplayer/qgstreamerplayerservice.cpp b/src/multimedia/platform/gstreamer/mediaplayer/qgstreamerplayerservice.cpp
index 6da43f03b..3a00d7673 100644
--- a/src/multimedia/platform/gstreamer/mediaplayer/qgstreamerplayerservice.cpp
+++ b/src/multimedia/platform/gstreamer/mediaplayer/qgstreamerplayerservice.cpp
@@ -43,7 +43,6 @@
#include "qgstreamerplayerservice_p.h"
-#include "qgstreamermetadataprovider_p.h"
#include <private/qgstreamervideowindow_p.h>
#include <private/qgstreamervideorenderer_p.h>
@@ -59,7 +58,6 @@ QGstreamerPlayerService::QGstreamerPlayerService()
{
m_session = new QGstreamerPlayerSession(this);
m_control = new QGstreamerPlayerControl(m_session, this);
- m_metaData = new QGstreamerMetaDataProvider(m_session, this);
m_streamsControl = new QGstreamerStreamsControl(m_session,this);
m_videoRenderer = new QGstreamerVideoRenderer(this);
m_videoWindow = new QGstreamerVideoWindow(this);
@@ -80,9 +78,6 @@ QObject *QGstreamerPlayerService::requestControl(const char *name)
if (qstrcmp(name,QMediaPlayerControl_iid) == 0)
return m_control;
- if (qstrcmp(name,QMetaDataReaderControl_iid) == 0)
- return m_metaData;
-
if (!m_videoOutput) {
if (qstrcmp(name, QVideoRendererControl_iid) == 0)
m_videoOutput = m_videoRenderer;
@@ -116,11 +111,6 @@ QMediaPlayerControl *QGstreamerPlayerService::player()
return m_control;
}
-QMetaDataReaderControl *QGstreamerPlayerService::dataReader()
-{
- return m_metaData;
-}
-
QMediaStreamsControl *QGstreamerPlayerService::streams()
{
return m_streamsControl;
@@ -160,32 +150,4 @@ void QGstreamerPlayerService::decreaseVideoRef()
m_videoReferenceCount--;
}
-#if 0
-// ### Re-add something similar to be able to check for support of certain file formats
-QMultimedia::SupportEstimate QGstreamerPlayerServicePlugin::hasSupport(const QString &mimeType,
- const QStringList &codecs) const
-{
- if (m_supportedMimeTypeSet.isEmpty())
- updateSupportedMimeTypes();
-
- return QGstUtils::hasSupport(mimeType, codecs, m_supportedMimeTypeSet);
-}
-
-static bool isDecoderOrDemuxer(GstElementFactory *factory)
-{
- return gst_element_factory_list_is_type(factory, GST_ELEMENT_FACTORY_TYPE_DEMUXER)
- || gst_element_factory_list_is_type(factory, GST_ELEMENT_FACTORY_TYPE_DECODER);
-}
-
-void QGstreamerPlayerServicePlugin::updateSupportedMimeTypes() const
-{
- m_supportedMimeTypeSet = QGstUtils::supportedMimeTypes(isDecoderOrDemuxer);
-}
-
-QStringList QGstreamerPlayerServicePlugin::supportedMimeTypes() const
-{
- return QStringList();
-}
-#endif
-
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/gstreamer/mediaplayer/qgstreamerplayerservice_p.h b/src/multimedia/platform/gstreamer/mediaplayer/qgstreamerplayerservice_p.h
index 0a7663e51..52cd7f848 100644
--- a/src/multimedia/platform/gstreamer/mediaplayer/qgstreamerplayerservice_p.h
+++ b/src/multimedia/platform/gstreamer/mediaplayer/qgstreamerplayerservice_p.h
@@ -62,7 +62,6 @@ class QMediaPlayerControl;
class QGstreamerMetaData;
class QGstreamerPlayerControl;
class QGstreamerPlayerSession;
-class QGstreamerMetaDataProvider;
class QGstreamerStreamsControl;
class QGstreamerVideoRenderer;
class QGstreamerVideoWindow;
@@ -81,7 +80,6 @@ public:
// QMediaPlatformPlayerInterface
QMediaPlayerControl *player() override;
- QMetaDataReaderControl *dataReader() override;
QMediaStreamsControl *streams() override;
QVideoRendererControl *createVideoRenderer() override;
@@ -90,7 +88,6 @@ public:
private:
QGstreamerPlayerControl *m_control = nullptr;
QGstreamerPlayerSession *m_session = nullptr;
- QGstreamerMetaDataProvider *m_metaData = nullptr;
QGstreamerStreamsControl *m_streamsControl = nullptr;
QObject *m_videoOutput = nullptr;
diff --git a/src/multimedia/platform/gstreamer/mediaplayer/qgstreamerstreamscontrol.cpp b/src/multimedia/platform/gstreamer/mediaplayer/qgstreamerstreamscontrol.cpp
index a4a2f46ec..4dc36fca4 100644
--- a/src/multimedia/platform/gstreamer/mediaplayer/qgstreamerstreamscontrol.cpp
+++ b/src/multimedia/platform/gstreamer/mediaplayer/qgstreamerstreamscontrol.cpp
@@ -60,9 +60,9 @@ QMediaStreamsControl::StreamType QGstreamerStreamsControl::streamType(int stream
return m_session->streamType(streamNumber);
}
-QVariant QGstreamerStreamsControl::metaData(int streamNumber, const QString &key)
+QMediaMetaData QGstreamerStreamsControl::metaData(int streamNumber)
{
- return m_session->streamProperties(streamNumber).value(key);
+ return m_session->streamProperties(streamNumber);
}
bool QGstreamerStreamsControl::isActive(int streamNumber)
diff --git a/src/multimedia/platform/gstreamer/mediaplayer/qgstreamerstreamscontrol_p.h b/src/multimedia/platform/gstreamer/mediaplayer/qgstreamerstreamscontrol_p.h
index 730dcba3a..57d57045a 100644
--- a/src/multimedia/platform/gstreamer/mediaplayer/qgstreamerstreamscontrol_p.h
+++ b/src/multimedia/platform/gstreamer/mediaplayer/qgstreamerstreamscontrol_p.h
@@ -67,7 +67,7 @@ public:
int streamCount() override;
StreamType streamType(int streamNumber) override;
- QVariant metaData(int streamNumber, const QString &key) override;
+ QMediaMetaData metaData(int streamNumber) override;
bool isActive(int streamNumber) override;
void setActive(int streamNumber, bool state) override;
diff --git a/src/multimedia/platform/qmediaplatformplayerinterface_p.h b/src/multimedia/platform/qmediaplatformplayerinterface_p.h
index a58cae316..b3598eb86 100644
--- a/src/multimedia/platform/qmediaplatformplayerinterface_p.h
+++ b/src/multimedia/platform/qmediaplatformplayerinterface_p.h
@@ -56,7 +56,6 @@
QT_BEGIN_NAMESPACE
class QMediaPlayerControl;
-class QMetaDataReaderControl;
class QMediaStreamsControl;
class QVideoRendererControl;
class QVideoWindowControl;
@@ -68,7 +67,6 @@ public:
virtual ~QMediaPlatformPlayerInterface();
virtual QMediaPlayerControl *player() = 0;
- virtual QMetaDataReaderControl *dataReader() { return nullptr; }
// ### nothing in the frontend uses the stream info currently. Needs implementation in QMediaPlayer
virtual QMediaStreamsControl *streams() { return nullptr; }
diff --git a/src/multimedia/platform/qnx/mediaplayer/mediaplayer.pri b/src/multimedia/platform/qnx/mediaplayer/mediaplayer.pri
index a44790b7d..5ab7516ab 100644
--- a/src/multimedia/platform/qnx/mediaplayer/mediaplayer.pri
+++ b/src/multimedia/platform/qnx/mediaplayer/mediaplayer.pri
@@ -4,7 +4,6 @@ HEADERS += \
$$PWD/mmrenderermediaplayercontrol_p.h \
$$PWD/mmrenderermediaplayerservice_p.h \
$$PWD/mmrenderermetadata_p.h \
- $$PWD/mmrenderermetadatareadercontrol_p.h \
$$PWD/mmrendererplayervideorenderercontrol_p.h \
$$PWD/mmrendererutil_p.h \
$$PWD/mmrenderervideowindowcontrol_p.h \
@@ -14,7 +13,6 @@ SOURCES += \
$$PWD/mmrenderermediaplayercontrol.cpp \
$$PWD/mmrenderermediaplayerservice.cpp \
$$PWD/mmrenderermetadata.cpp \
- $$PWD/mmrenderermetadatareadercontrol.cpp \
$$PWD/mmrendererplayervideorenderercontrol.cpp \
$$PWD/mmrendererutil.cpp \
$$PWD/mmrenderervideowindowcontrol.cpp \
diff --git a/src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp b/src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp
index 6c622c275..b253ab36b 100644
--- a/src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp
+++ b/src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp
@@ -39,7 +39,6 @@
#include "mmrendereraudiorolecontrol_p.h"
#include "mmrenderercustomaudiorolecontrol_p.h"
#include "mmrenderermediaplayercontrol_p.h"
-#include "mmrenderermetadatareadercontrol_p.h"
#include "mmrendererplayervideorenderercontrol_p.h"
#include "mmrendererutil_p.h"
#include "mmrenderervideowindowcontrol_p.h"
@@ -599,11 +598,6 @@ void MmRendererMediaPlayerControl::setVideoWindowControl(MmRendererVideoWindowCo
m_videoWindowControl = videoControl;
}
-void MmRendererMediaPlayerControl::setMetaDataReaderControl(MmRendererMetaDataReaderControl *metaDataReaderControl)
-{
- m_metaDataReaderControl = metaDataReaderControl;
-}
-
void MmRendererMediaPlayerControl::setMmPosition(qint64 newPosition)
{
if (newPosition != 0 && newPosition != m_position) {
@@ -635,9 +629,7 @@ void MmRendererMediaPlayerControl::updateMetaData(const strm_dict *dict)
if (m_videoWindowControl)
m_videoWindowControl->setMetaData(m_metaData);
- if (m_metaDataReaderControl)
- m_metaDataReaderControl->setMetaData(m_metaData);
-
+ // ### convert to QMediaMetaData and notify the player about metadata changes
emit durationChanged(m_metaData.duration());
emit audioAvailableChanged(m_metaData.hasAudio());
emit videoAvailableChanged(m_metaData.hasVideo());
diff --git a/src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayercontrol_p.h b/src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayercontrol_p.h
index d6a75c597..f65db2eb4 100644
--- a/src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayercontrol_p.h
+++ b/src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayercontrol_p.h
@@ -65,7 +65,6 @@ QT_BEGIN_NAMESPACE
class MmRendererAudioRoleControl;
class MmRendererCustomAudioRoleControl;
-class MmRendererMetaDataReaderControl;
class MmRendererPlayerVideoRendererControl;
class MmRendererVideoWindowControl;
@@ -121,7 +120,6 @@ public:
MmRendererVideoWindowControl *videoWindowControl() const;
void setVideoWindowControl(MmRendererVideoWindowControl *videoControl);
- void setMetaDataReaderControl(MmRendererMetaDataReaderControl *metaDataReaderControl);
protected:
virtual void startMonitoring() = 0;
@@ -178,7 +176,6 @@ private:
qreal m_rate;
QPointer<MmRendererPlayerVideoRendererControl> m_videoRendererControl;
QPointer<MmRendererVideoWindowControl> m_videoWindowControl;
- QPointer<MmRendererMetaDataReaderControl> m_metaDataReaderControl;
MmRendererMetaData m_metaData;
qint64 m_position;
QMediaPlayer::MediaStatus m_mediaStatus;
diff --git a/src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayerservice.cpp b/src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayerservice.cpp
index 407a54c83..00b4e76bb 100644
--- a/src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayerservice.cpp
+++ b/src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayerservice.cpp
@@ -39,7 +39,6 @@
#include "mmrenderermediaplayerservice_p.h"
#include "mmrenderermediaplayercontrol_p.h"
-#include "mmrenderermetadatareadercontrol_p.h"
#include "mmrendererplayervideorenderercontrol_p.h"
#include "mmrendererutil_p.h"
#include "mmrenderervideowindowcontrol_p.h"
@@ -53,7 +52,6 @@ MmRendererMediaPlayerService::MmRendererMediaPlayerService(QObject *parent)
m_videoRendererControl(0),
m_videoWindowControl(0),
m_mediaPlayerControl(0),
- m_metaDataReaderControl(0),
m_appHasDrmPermission(false),
m_appHasDrmPermissionChecked(false)
{
@@ -65,7 +63,6 @@ MmRendererMediaPlayerService::~MmRendererMediaPlayerService()
delete m_videoRendererControl;
delete m_videoWindowControl;
delete m_mediaPlayerControl;
- delete m_metaDataReaderControl;
}
QObject *MmRendererMediaPlayerService::requestControl(const char *name)
@@ -76,12 +73,6 @@ QObject *MmRendererMediaPlayerService::requestControl(const char *name)
updateControls();
}
return m_mediaPlayerControl;
- } else if (qstrcmp(name, QMetaDataReaderControl_iid) == 0) {
- if (!m_metaDataReaderControl) {
- m_metaDataReaderControl = new MmRendererMetaDataReaderControl();
- updateControls();
- }
- return m_metaDataReaderControl;
} else if (qstrcmp(name, QVideoRendererControl_iid) == 0) {
if (!m_appHasDrmPermissionChecked) {
m_appHasDrmPermission = checkForDrmPermission();
@@ -118,8 +109,6 @@ void MmRendererMediaPlayerService::releaseControl(QObject *control)
m_videoWindowControl = 0;
if (control == m_mediaPlayerControl)
m_mediaPlayerControl = 0;
- if (control == m_metaDataReaderControl)
- m_metaDataReaderControl = 0;
delete control;
}
@@ -130,9 +119,6 @@ void MmRendererMediaPlayerService::updateControls()
if (m_videoWindowControl && m_mediaPlayerControl)
m_mediaPlayerControl->setVideoWindowControl(m_videoWindowControl);
-
- if (m_metaDataReaderControl && m_mediaPlayerControl)
- m_mediaPlayerControl->setMetaDataReaderControl(m_metaDataReaderControl);
}
QMediaPlayerControl *MmRendererMediaPlayerService::player()
@@ -140,11 +126,6 @@ QMediaPlayerControl *MmRendererMediaPlayerService::player()
return m_mediaPlayerControl;
}
-QMetaDataReaderControl *MmRendererMediaPlayerService::dataReader()
-{
- return m_metaDataReaderControl;
-}
-
QVideoRendererControl *MmRendererMediaPlayerService::createVideoRenderer()
{
return m_videoRendererControl;
diff --git a/src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayerservice_p.h b/src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayerservice_p.h
index eeb3b024a..441ebfd61 100644
--- a/src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayerservice_p.h
+++ b/src/multimedia/platform/qnx/mediaplayer/mmrenderermediaplayerservice_p.h
@@ -56,7 +56,6 @@
QT_BEGIN_NAMESPACE
class MmRendererMediaPlayerControl;
-class MmRendererMetaDataReaderControl;
class MmRendererPlayerVideoRendererControl;
class MmRendererVideoWindowControl;
@@ -72,7 +71,6 @@ public:
// QMediaPlatformPlayerInterface
QMediaPlayerControl *player() override;
- QMetaDataReaderControl *dataReader() override;
// QMediaStreamsControl *streams() override;
QVideoRendererControl *createVideoRenderer() override;
@@ -84,7 +82,6 @@ private:
QPointer<MmRendererPlayerVideoRendererControl> m_videoRendererControl;
QPointer<MmRendererVideoWindowControl> m_videoWindowControl;
QPointer<MmRendererMediaPlayerControl> m_mediaPlayerControl;
- QPointer<MmRendererMetaDataReaderControl> m_metaDataReaderControl;
bool m_appHasDrmPermission : 1;
bool m_appHasDrmPermissionChecked : 1;
diff --git a/src/multimedia/platform/qnx/mediaplayer/mmrenderermetadatareadercontrol.cpp b/src/multimedia/platform/qnx/mediaplayer/mmrenderermetadatareadercontrol.cpp
deleted file mode 100644
index 76ad98cb3..000000000
--- a/src/multimedia/platform/qnx/mediaplayer/mmrenderermetadatareadercontrol.cpp
+++ /dev/null
@@ -1,170 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Research In Motion
-** 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 "mmrenderermetadatareadercontrol_p.h"
-#include <QtMultimedia/qmediametadata.h>
-
-QT_BEGIN_NAMESPACE
-
-MmRendererMetaDataReaderControl::MmRendererMetaDataReaderControl(QObject *parent)
- : QMetaDataReaderControl(parent)
-{
-}
-
-bool MmRendererMetaDataReaderControl::isMetaDataAvailable() const
-{
- return !availableMetaData().isEmpty();
-}
-
-QVariant MmRendererMetaDataReaderControl::metaData(const QString &key) const
-{
- if (key == QMediaMetaData::Title)
- return m_metaData.title();
- else if (key == QMediaMetaData::AlbumArtist)
- return m_metaData.artist();
- else if (key == QMediaMetaData::Comment)
- return m_metaData.comment();
- else if (key == QMediaMetaData::Genre)
- return m_metaData.genre();
- else if (key == QMediaMetaData::Year)
- return m_metaData.year();
- else if (key == QMediaMetaData::MediaType)
- return m_metaData.mediaType();
- else if (key == QMediaMetaData::Duration)
- return m_metaData.duration();
- else if (key == QMediaMetaData::AudioBitRate)
- return m_metaData.audioBitRate();
- else if (key == QMediaMetaData::SampleRate)
- return m_metaData.sampleRate();
- else if (key == QMediaMetaData::AlbumTitle)
- return m_metaData.album();
- else if (key == QMediaMetaData::TrackNumber)
- return m_metaData.track();
- else if (key == QMediaMetaData::Resolution)
- return m_metaData.resolution();
-
- return QVariant();
-}
-
-QStringList MmRendererMetaDataReaderControl::availableMetaData() const
-{
- QStringList metaData;
-
- if (!m_metaData.title().isEmpty())
- metaData << QMediaMetaData::Title;
- if (!m_metaData.artist().isEmpty())
- metaData << QMediaMetaData::Author;
- if (!m_metaData.comment().isEmpty())
- metaData << QMediaMetaData::Comment;
- if (!m_metaData.genre().isEmpty())
- metaData << QMediaMetaData::Genre;
- if (m_metaData.year() != 0)
- metaData << QMediaMetaData::Year;
- if (!m_metaData.mediaType().isEmpty())
- metaData << QMediaMetaData::MediaType;
- if (m_metaData.duration() != 0)
- metaData << QMediaMetaData::Duration;
- if (m_metaData.audioBitRate() != 0)
- metaData << QMediaMetaData::AudioBitRate;
- if (m_metaData.sampleRate() != 0)
- metaData << QMediaMetaData::SampleRate;
- if (!m_metaData.album().isEmpty())
- metaData << QMediaMetaData::AlbumTitle;
- if (m_metaData.track() != 0)
- metaData << QMediaMetaData::TrackNumber;
- if (m_metaData.resolution().isValid())
- metaData << QMediaMetaData::Resolution;
-
- return metaData;
-}
-
-void MmRendererMetaDataReaderControl::setMetaData(const MmRendererMetaData &data)
-{
- const MmRendererMetaData oldMetaData = m_metaData;
- const bool oldMetaDataAvailable = isMetaDataAvailable();
-
- m_metaData = data;
-
- bool changed = false;
- if (m_metaData.title() != oldMetaData.title()) {
- changed = true;
- emit metaDataChanged(QMediaMetaData::Title, m_metaData.title());
- } else if (m_metaData.artist() != oldMetaData.artist()) {
- changed = true;
- emit metaDataChanged(QMediaMetaData::Author, m_metaData.artist());
- } else if (m_metaData.comment() != oldMetaData.comment()) {
- changed = true;
- emit metaDataChanged(QMediaMetaData::Comment, m_metaData.comment());
- } else if (m_metaData.genre() != oldMetaData.genre()) {
- changed = true;
- emit metaDataChanged(QMediaMetaData::Genre, m_metaData.genre());
- } else if (m_metaData.year() != oldMetaData.year()) {
- changed = true;
- emit metaDataChanged(QMediaMetaData::Year, m_metaData.year());
- } else if (m_metaData.mediaType() != oldMetaData.mediaType()) {
- changed = true;
- emit metaDataChanged(QMediaMetaData::MediaType, m_metaData.mediaType());
- } else if (m_metaData.duration() != oldMetaData.duration()) {
- changed = true;
- emit metaDataChanged(QMediaMetaData::Duration, m_metaData.duration());
- } else if (m_metaData.audioBitRate() != oldMetaData.audioBitRate()) {
- changed = true;
- emit metaDataChanged(QMediaMetaData::AudioBitRate, m_metaData.audioBitRate());
- } else if (m_metaData.sampleRate() != oldMetaData.sampleRate()) {
- changed = true;
- emit metaDataChanged(QMediaMetaData::SampleRate, m_metaData.sampleRate());
- } else if (m_metaData.album() != oldMetaData.album()) {
- changed = true;
- emit metaDataChanged(QMediaMetaData::AlbumTitle, m_metaData.album());
- } else if (m_metaData.track() != oldMetaData.track()) {
- changed = true;
- emit metaDataChanged(QMediaMetaData::TrackNumber, m_metaData.track());
- } else if (m_metaData.resolution() != oldMetaData.resolution()) {
- changed = true;
- emit metaDataChanged(QMediaMetaData::Resolution, m_metaData.resolution());
- }
-
- if (changed)
- emit metaDataChanged();
-
- const bool metaDataAvailable = isMetaDataAvailable();
- if (metaDataAvailable != oldMetaDataAvailable)
- emit metaDataAvailableChanged(metaDataAvailable);
-}
-
-QT_END_NAMESPACE
diff --git a/src/multimedia/platform/windows/player/mfmetadata.cpp b/src/multimedia/platform/windows/player/mfmetadata.cpp
new file mode 100644
index 000000000..632ba3686
--- /dev/null
+++ b/src/multimedia/platform/windows/player/mfmetadata.cpp
@@ -0,0 +1,337 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Mobility Components.
+**
+** $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 <qmediametadata.h>
+#include <qdatetime.h>
+#include <qimage.h>
+
+#include "mfmetadata_p.h"
+#include "mfplayerservice_p.h"
+#include "Propkey.h"
+
+//#define DEBUG_MEDIAFOUNDATION
+
+static QString nameForGUID(GUID guid)
+{
+ // Audio formats
+ if (guid == MFAudioFormat_AAC)
+ return QStringLiteral("MPEG AAC Audio");
+ else if (guid == MFAudioFormat_ADTS)
+ return QStringLiteral("MPEG ADTS AAC Audio");
+ else if (guid == MFAudioFormat_Dolby_AC3_SPDIF)
+ return QStringLiteral("Dolby AC-3 SPDIF");
+ else if (guid == MFAudioFormat_DRM)
+ return QStringLiteral("DRM");
+ else if (guid == MFAudioFormat_DTS)
+ return QStringLiteral("Digital Theater Systems Audio (DTS)");
+ else if (guid == MFAudioFormat_Float)
+ return QStringLiteral("IEEE Float Audio");
+ else if (guid == MFAudioFormat_MP3)
+ return QStringLiteral("MPEG Audio Layer-3 (MP3)");
+ else if (guid == MFAudioFormat_MPEG)
+ return QStringLiteral("MPEG-1 Audio");
+ else if (guid == MFAudioFormat_MSP1)
+ return QStringLiteral("Windows Media Audio Voice");
+ else if (guid == MFAudioFormat_PCM)
+ return QStringLiteral("Uncompressed PCM Audio");
+ else if (guid == MFAudioFormat_WMASPDIF)
+ return QStringLiteral("Windows Media Audio 9 SPDIF");
+ else if (guid == MFAudioFormat_WMAudioV8)
+ return QStringLiteral("Windows Media Audio 8 (WMA2)");
+ else if (guid == MFAudioFormat_WMAudioV9)
+ return QStringLiteral("Windows Media Audio 9 (WMA3");
+ else if (guid == MFAudioFormat_WMAudio_Lossless)
+ return QStringLiteral("Windows Media Audio 9 Lossless");
+
+ // Video formats
+ if (guid == MFVideoFormat_DV25)
+ return QStringLiteral("DVCPRO 25 (DV25)");
+ else if (guid == MFVideoFormat_DV50)
+ return QStringLiteral("DVCPRO 50 (DV50)");
+ else if (guid == MFVideoFormat_DVC)
+ return QStringLiteral("DVC/DV Video");
+ else if (guid == MFVideoFormat_DVH1)
+ return QStringLiteral("DVCPRO 100 (DVH1)");
+ else if (guid == MFVideoFormat_DVHD)
+ return QStringLiteral("HD-DVCR (DVHD)");
+ else if (guid == MFVideoFormat_DVSD)
+ return QStringLiteral("SDL-DVCR (DVSD)");
+ else if (guid == MFVideoFormat_DVSL)
+ return QStringLiteral("SD-DVCR (DVSL)");
+ else if (guid == MFVideoFormat_H264)
+ return QStringLiteral("H.264 Video");
+ else if (guid == MFVideoFormat_M4S2)
+ return QStringLiteral("MPEG-4 part 2 Video (M4S2)");
+ else if (guid == MFVideoFormat_MJPG)
+ return QStringLiteral("Motion JPEG (MJPG)");
+ else if (guid == MFVideoFormat_MP43)
+ return QStringLiteral("Microsoft MPEG 4 version 3 (MP43)");
+ else if (guid == MFVideoFormat_MP4S)
+ return QStringLiteral("ISO MPEG 4 version 1 (MP4S)");
+ else if (guid == MFVideoFormat_MP4V)
+ return QStringLiteral("MPEG-4 part 2 Video (MP4V)");
+ else if (guid == MFVideoFormat_MPEG2)
+ return QStringLiteral("MPEG-2 Video");
+ else if (guid == MFVideoFormat_MPG1)
+ return QStringLiteral("MPEG-1 Video");
+ else if (guid == MFVideoFormat_MSS1)
+ return QStringLiteral("Windows Media Screen 1 (MSS1)");
+ else if (guid == MFVideoFormat_MSS2)
+ return QStringLiteral("Windows Media Video 9 Screen (MSS2)");
+ else if (guid == MFVideoFormat_WMV1)
+ return QStringLiteral("Windows Media Video 7 (WMV1)");
+ else if (guid == MFVideoFormat_WMV2)
+ return QStringLiteral("Windows Media Video 8 (WMV2)");
+ else if (guid == MFVideoFormat_WMV3)
+ return QStringLiteral("Windows Media Video 9 (WMV3)");
+ else if (guid == MFVideoFormat_WVC1)
+ return QStringLiteral("Windows Media Video VC1 (WVC1)");
+
+ else
+ return QStringLiteral("Unknown codec");
+}
+
+static QVariant convertValue(const PROPVARIANT& var)
+{
+ QVariant value;
+ switch (var.vt) {
+ case VT_LPWSTR:
+ value = QString::fromUtf16(reinterpret_cast<const char16_t *>(var.pwszVal));
+ break;
+ case VT_UI4:
+ value = uint(var.ulVal);
+ break;
+ case VT_UI8:
+ value = qulonglong(var.uhVal.QuadPart);
+ break;
+ case VT_BOOL:
+ value = bool(var.boolVal);
+ break;
+ case VT_FILETIME:
+ SYSTEMTIME sysDate;
+ if (!FileTimeToSystemTime(&var.filetime, &sysDate))
+ break;
+ value = QDate(sysDate.wYear, sysDate.wMonth, sysDate.wDay);
+ break;
+ case VT_STREAM:
+ {
+ STATSTG stat;
+ if (FAILED(var.pStream->Stat(&stat, STATFLAG_NONAME)))
+ break;
+ void *data = malloc(stat.cbSize.QuadPart);
+ ULONG read = 0;
+ if (FAILED(var.pStream->Read(data, stat.cbSize.QuadPart, &read))) {
+ free(data);
+ break;
+ }
+ value = QImage::fromData((const uchar*)data, read);
+ free(data);
+ }
+ break;
+ case VT_VECTOR | VT_LPWSTR:
+ QStringList vList;
+ for (ULONG i = 0; i < var.calpwstr.cElems; ++i)
+ vList.append(QString::fromUtf16(reinterpret_cast<const char16_t *>(var.calpwstr.pElems[i])));
+ value = vList;
+ break;
+ }
+ return value;
+}
+
+static QVariant metaDataValue(IPropertyStore *m_content, const PROPERTYKEY &key)
+{
+ QVariant value;
+
+ PROPVARIANT var;
+ PropVariantInit(&var);
+ HRESULT hr = S_FALSE;
+ if (m_content)
+ hr = m_content->GetValue(key, &var);
+
+ if (SUCCEEDED(hr)) {
+ value = convertValue(var);
+
+ // some metadata needs to be reformatted
+ if (value.isValid() && m_content) {
+ if (key == PKEY_Media_ClassPrimaryID /*QMediaMetaData::MediaType*/) {
+ QString v = value.toString();
+ if (v == QLatin1String("{D1607DBC-E323-4BE2-86A1-48A42A28441E}"))
+ value = QStringLiteral("Music");
+ else if (v == QLatin1String("{DB9830BD-3AB3-4FAB-8A37-1A995F7FF74B}"))
+ value = QStringLiteral("Video");
+ else if (v == QLatin1String("{01CD0F29-DA4E-4157-897B-6275D50C4F11}"))
+ value = QStringLiteral("Audio");
+ else if (v == QLatin1String("{FCF24A76-9A57-4036-990D-E35DD8B244E1}"))
+ value = QStringLiteral("Other");
+ } else if (key == PKEY_Media_Duration) {
+ // duration is provided in 100-nanosecond units, convert to milliseconds
+ value = (value.toLongLong() + 10000) / 10000;
+ } else if (key == PKEY_Audio_Format || key == PKEY_Video_Compression) {
+ GUID guid;
+ if (SUCCEEDED(CLSIDFromString((const WCHAR*)value.toString().utf16(), &guid)))
+ value = nameForGUID(guid);
+ } else if (key == PKEY_Video_FrameHeight /*Resolution*/) {
+ QSize res;
+ res.setHeight(value.toUInt());
+ if (m_content && SUCCEEDED(m_content->GetValue(PKEY_Video_FrameWidth, &var)))
+ res.setWidth(convertValue(var).toUInt());
+ value = res;
+ } else if (key == PKEY_Video_Orientation) {
+ uint orientation = 0;
+ if (m_content && SUCCEEDED(m_content->GetValue(PKEY_Video_Orientation, &var)))
+ orientation = convertValue(var).toUInt();
+ value = orientation;
+ } else if (key == PKEY_Video_FrameRate) {
+ value = value.toReal() / 1000.f;
+ }
+ }
+ }
+
+ PropVariantClear(&var);
+ return value;
+}
+
+QMediaMetaData MFMetaData::fromNative(IMFMediaSource* mediaSource)
+{
+ QMediaMetaData metaData;
+
+ IPropertyStore *m_content = nullptr;
+ if (!SUCCEEDED(MFGetService(mediaSource, MF_PROPERTY_HANDLER_SERVICE, IID_PPV_ARGS(&m_content))))
+ return metaData;
+
+ Q_ASSERT(m_content);
+ DWORD cProps;
+ if (SUCCEEDED(m_content->GetCount(&cProps))) {
+ for (DWORD i = 0; i < cProps; i++)
+ {
+ PROPERTYKEY key;
+ if (FAILED(m_content->GetAt(i, &key)))
+ continue;
+ QMediaMetaData::Key mediaKey;
+ if (key == PKEY_Author) {
+ mediaKey = QMediaMetaData::Author;
+ } else if (key == PKEY_Title) {
+ mediaKey = QMediaMetaData::Title;
+// } else if (key == PKEY_Media_SubTitle) {
+// mediaKey = QMediaMetaData::SubTitle;
+// } else if (key == PKEY_ParentalRating) {
+// mediaKey = QMediaMetaData::ParentalRating;
+ } else if (key == PKEY_Media_EncodingSettings) {
+ mediaKey = QMediaMetaData::Description;
+ } else if (key == PKEY_Copyright) {
+ mediaKey = QMediaMetaData::Copyright;
+ } else if (key == PKEY_Comment) {
+ mediaKey = QMediaMetaData::Comment;
+ } else if (key == PKEY_Media_ProviderStyle) {
+ mediaKey = QMediaMetaData::Genre;
+ } else if (key == PKEY_Media_Year) {
+ mediaKey = QMediaMetaData::Year;
+ } else if (key == PKEY_Media_DateEncoded) {
+ mediaKey = QMediaMetaData::Date;
+// } else if (key == PKEY_Rating) {
+// mediaKey = QMediaMetaData::UserRating;
+// } else if (key == PKEY_Keywords) {
+// mediaKey = QMediaMetaData::Keywords;
+ } else if (key == PKEY_Language) {
+ mediaKey = QMediaMetaData::Language;
+ } else if (key == PKEY_Media_Publisher) {
+ mediaKey = QMediaMetaData::Publisher;
+ } else if (key == PKEY_Media_ClassPrimaryID) {
+ mediaKey = QMediaMetaData::MediaType;
+ } else if (key == PKEY_Media_Duration) {
+ mediaKey = QMediaMetaData::Duration;
+ } else if (key == PKEY_Audio_EncodingBitrate) {
+ mediaKey = QMediaMetaData::AudioBitRate;
+ } else if (key == PKEY_Audio_Format) {
+ mediaKey = QMediaMetaData::AudioCodec;
+// } else if (key == PKEY_Media_AverageLevel) {
+// mediaKey = QMediaMetaData::AverageLevel;
+// } else if (key == PKEY_Audio_ChannelCount) {
+// mediaKey = QMediaMetaData::ChannelCount;
+// } else if (key == PKEY_Audio_PeakValue) {
+// mediaKey = QMediaMetaData::PeakValue;
+// } else if (key == PKEY_Audio_SampleRate) {
+// mediaKey = QMediaMetaData::SampleRate;
+ } else if (key == PKEY_Music_AlbumTitle) {
+ mediaKey = QMediaMetaData::AlbumTitle;
+ } else if (key == PKEY_Music_AlbumArtist) {
+ mediaKey = QMediaMetaData::AlbumArtist;
+ } else if (key == PKEY_Music_Artist) {
+ mediaKey = QMediaMetaData::ContributingArtist;
+ } else if (key == PKEY_Music_Composer) {
+ mediaKey = QMediaMetaData::Composer;
+// } else if (key == PKEY_Music_Conductor) {
+// mediaKey = QMediaMetaData::Conductor;
+// } else if (key == PKEY_Music_Lyrics) {
+// mediaKey = QMediaMetaData::Lyrics;
+// } else if (key == PKEY_Music_Mood) {
+// mediaKey = QMediaMetaData::Mood;
+ } else if (key == PKEY_Music_TrackNumber) {
+ mediaKey = QMediaMetaData::TrackNumber;
+ } else if (key == PKEY_Music_Genre) {
+ mediaKey = QMediaMetaData::Genre;
+ } else if (key == PKEY_ThumbnailStream) {
+ mediaKey = QMediaMetaData::ThumbnailImage;
+ } else if (key == PKEY_Video_FrameHeight) {
+ mediaKey = QMediaMetaData::Resolution;
+ } else if (key == PKEY_Video_Orientation) {
+ mediaKey = QMediaMetaData::Orientation;
+// } else if (key == PKEY_Video_HorizontalAspectRatio) {
+// mediaKey = QMediaMetaData::PixelAspectRatio;
+// } else if (key == PKEY_Video_FrameRate) {
+// mediaKey = QMediaMetaData::VideoFrameRate;
+ } else if (key == PKEY_Video_EncodingBitrate) {
+ mediaKey = QMediaMetaData::VideoBitRate;
+ } else if (key == PKEY_Video_Compression) {
+ mediaKey = QMediaMetaData::VideoCodec;
+// } else if (key == PKEY_Video_Director) {
+// mediaKey = QMediaMetaData::Director;
+// } else if (key == PKEY_Media_Writer) {
+// mediaKey = QMediaMetaData::Writer;
+ } else {
+ continue;
+ }
+ metaData.insert(mediaKey, metaDataValue(m_content, key));
+ }
+ }
+
+ m_content->Release();
+
+ return metaData;
+}
diff --git a/src/multimedia/platform/windows/player/mfmetadatacontrol_p.h b/src/multimedia/platform/windows/player/mfmetadata_p.h
index dcce5bb1d..813b42cf3 100644
--- a/src/multimedia/platform/windows/player/mfmetadatacontrol_p.h
+++ b/src/multimedia/platform/windows/player/mfmetadata_p.h
@@ -51,33 +51,15 @@
// We mean it.
//
-#include <qmetadatareadercontrol.h>
+#include <qmediametadata.h>
#include "Mfidl.h"
QT_USE_NAMESPACE
-class MFMetaDataControl : public QMetaDataReaderControl
+class MFMetaData
{
- Q_OBJECT
public:
- MFMetaDataControl(QObject *parent = 0);
- ~MFMetaDataControl();
-
- bool isMetaDataAvailable() const;
-
- QVariant metaData(const QString &key) const;
- QStringList availableMetaData() const;
-
- void updateSource(IMFPresentationDescriptor* sourcePD, IMFMediaSource* mediaSource);
-
-private:
- QVariant convertValue(const PROPVARIANT& var) const;
- IPropertyStore *m_content; //for Windows7
- IMFMetadata *m_metaData; //for Vista
-
- QStringList m_availableMetaDatas;
- QList<PROPERTYKEY> m_commonKeys; //for Windows7
- QStringList m_commonNames; //for Vista
+ static QMediaMetaData fromNative(IMFMediaSource* mediaSource);
};
#endif
diff --git a/src/multimedia/platform/windows/player/mfmetadatacontrol.cpp b/src/multimedia/platform/windows/player/mfmetadatacontrol.cpp
deleted file mode 100644
index b7cf771e8..000000000
--- a/src/multimedia/platform/windows/player/mfmetadatacontrol.cpp
+++ /dev/null
@@ -1,431 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Mobility Components.
-**
-** $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 <qmediametadata.h>
-#include <qdatetime.h>
-#include <qimage.h>
-
-#include "mfmetadatacontrol_p.h"
-#include "mfplayerservice_p.h"
-#include "Propkey.h"
-
-//#define DEBUG_MEDIAFOUNDATION
-
-static QString nameForGUID(GUID guid)
-{
- // Audio formats
- if (guid == MFAudioFormat_AAC)
- return QStringLiteral("MPEG AAC Audio");
- else if (guid == MFAudioFormat_ADTS)
- return QStringLiteral("MPEG ADTS AAC Audio");
- else if (guid == MFAudioFormat_Dolby_AC3_SPDIF)
- return QStringLiteral("Dolby AC-3 SPDIF");
- else if (guid == MFAudioFormat_DRM)
- return QStringLiteral("DRM");
- else if (guid == MFAudioFormat_DTS)
- return QStringLiteral("Digital Theater Systems Audio (DTS)");
- else if (guid == MFAudioFormat_Float)
- return QStringLiteral("IEEE Float Audio");
- else if (guid == MFAudioFormat_MP3)
- return QStringLiteral("MPEG Audio Layer-3 (MP3)");
- else if (guid == MFAudioFormat_MPEG)
- return QStringLiteral("MPEG-1 Audio");
- else if (guid == MFAudioFormat_MSP1)
- return QStringLiteral("Windows Media Audio Voice");
- else if (guid == MFAudioFormat_PCM)
- return QStringLiteral("Uncompressed PCM Audio");
- else if (guid == MFAudioFormat_WMASPDIF)
- return QStringLiteral("Windows Media Audio 9 SPDIF");
- else if (guid == MFAudioFormat_WMAudioV8)
- return QStringLiteral("Windows Media Audio 8 (WMA2)");
- else if (guid == MFAudioFormat_WMAudioV9)
- return QStringLiteral("Windows Media Audio 9 (WMA3");
- else if (guid == MFAudioFormat_WMAudio_Lossless)
- return QStringLiteral("Windows Media Audio 9 Lossless");
-
- // Video formats
- if (guid == MFVideoFormat_DV25)
- return QStringLiteral("DVCPRO 25 (DV25)");
- else if (guid == MFVideoFormat_DV50)
- return QStringLiteral("DVCPRO 50 (DV50)");
- else if (guid == MFVideoFormat_DVC)
- return QStringLiteral("DVC/DV Video");
- else if (guid == MFVideoFormat_DVH1)
- return QStringLiteral("DVCPRO 100 (DVH1)");
- else if (guid == MFVideoFormat_DVHD)
- return QStringLiteral("HD-DVCR (DVHD)");
- else if (guid == MFVideoFormat_DVSD)
- return QStringLiteral("SDL-DVCR (DVSD)");
- else if (guid == MFVideoFormat_DVSL)
- return QStringLiteral("SD-DVCR (DVSL)");
- else if (guid == MFVideoFormat_H264)
- return QStringLiteral("H.264 Video");
- else if (guid == MFVideoFormat_M4S2)
- return QStringLiteral("MPEG-4 part 2 Video (M4S2)");
- else if (guid == MFVideoFormat_MJPG)
- return QStringLiteral("Motion JPEG (MJPG)");
- else if (guid == MFVideoFormat_MP43)
- return QStringLiteral("Microsoft MPEG 4 version 3 (MP43)");
- else if (guid == MFVideoFormat_MP4S)
- return QStringLiteral("ISO MPEG 4 version 1 (MP4S)");
- else if (guid == MFVideoFormat_MP4V)
- return QStringLiteral("MPEG-4 part 2 Video (MP4V)");
- else if (guid == MFVideoFormat_MPEG2)
- return QStringLiteral("MPEG-2 Video");
- else if (guid == MFVideoFormat_MPG1)
- return QStringLiteral("MPEG-1 Video");
- else if (guid == MFVideoFormat_MSS1)
- return QStringLiteral("Windows Media Screen 1 (MSS1)");
- else if (guid == MFVideoFormat_MSS2)
- return QStringLiteral("Windows Media Video 9 Screen (MSS2)");
- else if (guid == MFVideoFormat_WMV1)
- return QStringLiteral("Windows Media Video 7 (WMV1)");
- else if (guid == MFVideoFormat_WMV2)
- return QStringLiteral("Windows Media Video 8 (WMV2)");
- else if (guid == MFVideoFormat_WMV3)
- return QStringLiteral("Windows Media Video 9 (WMV3)");
- else if (guid == MFVideoFormat_WVC1)
- return QStringLiteral("Windows Media Video VC1 (WVC1)");
-
- else
- return QStringLiteral("Unknown codec");
-}
-
-MFMetaDataControl::MFMetaDataControl(QObject *parent)
- : QMetaDataReaderControl(parent)
- , m_metaData(0)
- , m_content(0)
-{
-}
-
-MFMetaDataControl::~MFMetaDataControl()
-{
- if (m_metaData)
- m_metaData->Release();
- if (m_content)
- m_content->Release();
-}
-
-bool MFMetaDataControl::isMetaDataAvailable() const
-{
- return m_content || m_metaData;
-}
-
-QVariant MFMetaDataControl::metaData(const QString &key) const
-{
- QVariant value;
- if (!isMetaDataAvailable())
- return value;
-
- int index = m_availableMetaDatas.indexOf(key);
- if (index < 0)
- return value;
-
- PROPVARIANT var;
- PropVariantInit(&var);
- HRESULT hr = S_FALSE;
- if (m_content)
- hr = m_content->GetValue(m_commonKeys[index], &var);
- else if (m_metaData)
- hr = m_metaData->GetProperty(reinterpret_cast<LPCWSTR>(m_commonNames[index].utf16()), &var);
-
- if (SUCCEEDED(hr)) {
- value = convertValue(var);
-
- // some metadata needs to be reformatted
- if (value.isValid() && m_content) {
- if (key == QMediaMetaData::MediaType) {
- QString v = value.toString();
- if (v == QLatin1String("{D1607DBC-E323-4BE2-86A1-48A42A28441E}"))
- value = QStringLiteral("Music");
- else if (v == QLatin1String("{DB9830BD-3AB3-4FAB-8A37-1A995F7FF74B}"))
- value = QStringLiteral("Video");
- else if (v == QLatin1String("{01CD0F29-DA4E-4157-897B-6275D50C4F11}"))
- value = QStringLiteral("Audio");
- else if (v == QLatin1String("{FCF24A76-9A57-4036-990D-E35DD8B244E1}"))
- value = QStringLiteral("Other");
- } else if (key == QMediaMetaData::Duration) {
- // duration is provided in 100-nanosecond units, convert to milliseconds
- value = (value.toLongLong() + 10000) / 10000;
- } else if (key == QMediaMetaData::AudioCodec || key == QMediaMetaData::VideoCodec) {
- GUID guid;
- if (SUCCEEDED(CLSIDFromString((const WCHAR*)value.toString().utf16(), &guid)))
- value = nameForGUID(guid);
- } else if (key == QMediaMetaData::Resolution) {
- QSize res;
- res.setHeight(value.toUInt());
- if (m_content && SUCCEEDED(m_content->GetValue(PKEY_Video_FrameWidth, &var)))
- res.setWidth(convertValue(var).toUInt());
- value = res;
- } else if (key == QMediaMetaData::Orientation) {
- uint orientation = 0;
- if (m_content && SUCCEEDED(m_content->GetValue(PKEY_Video_Orientation, &var)))
- orientation = convertValue(var).toUInt();
- value = orientation;
- } else if (key == QMediaMetaData::PixelAspectRatio) {
- QSize aspectRatio;
- aspectRatio.setWidth(value.toUInt());
- if (m_content && SUCCEEDED(m_content->GetValue(PKEY_Video_VerticalAspectRatio, &var)))
- aspectRatio.setHeight(convertValue(var).toUInt());
- value = aspectRatio;
- } else if (key == QMediaMetaData::VideoFrameRate) {
- value = value.toReal() / 1000.f;
- }
- }
- }
-
- PropVariantClear(&var);
- return value;
-}
-
-QVariant MFMetaDataControl::convertValue(const PROPVARIANT& var) const
-{
- QVariant value;
- switch (var.vt) {
- case VT_LPWSTR:
- value = QString::fromUtf16(reinterpret_cast<const ushort*>(var.pwszVal));
- break;
- case VT_UI4:
- value = uint(var.ulVal);
- break;
- case VT_UI8:
- value = qulonglong(var.uhVal.QuadPart);
- break;
- case VT_BOOL:
- value = bool(var.boolVal);
- break;
- case VT_FILETIME:
- SYSTEMTIME sysDate;
- if (!FileTimeToSystemTime(&var.filetime, &sysDate))
- break;
- value = QDate(sysDate.wYear, sysDate.wMonth, sysDate.wDay);
- break;
- case VT_STREAM:
- {
- STATSTG stat;
- if (FAILED(var.pStream->Stat(&stat, STATFLAG_NONAME)))
- break;
- void *data = malloc(stat.cbSize.QuadPart);
- ULONG read = 0;
- if (FAILED(var.pStream->Read(data, stat.cbSize.QuadPart, &read))) {
- free(data);
- break;
- }
- value = QImage::fromData((const uchar*)data, read);
- free(data);
- }
- break;
- case VT_VECTOR | VT_LPWSTR:
- QStringList vList;
- for (ULONG i = 0; i < var.calpwstr.cElems; ++i)
- vList.append(QString::fromUtf16(reinterpret_cast<const ushort*>(var.calpwstr.pElems[i])));
- value = vList;
- break;
- }
- return value;
-}
-
-QStringList MFMetaDataControl::availableMetaData() const
-{
- return m_availableMetaDatas;
-}
-
-void MFMetaDataControl::updateSource(IMFPresentationDescriptor* sourcePD, IMFMediaSource* mediaSource)
-{
- if (m_metaData) {
- m_metaData->Release();
- m_metaData = 0;
- }
-
- if (m_content) {
- m_content->Release();
- m_content = 0;
- }
-
- m_availableMetaDatas.clear();
- m_commonKeys.clear();
- m_commonNames.clear();
-
- if (SUCCEEDED(MFGetService(mediaSource, MF_PROPERTY_HANDLER_SERVICE, IID_PPV_ARGS(&m_content)))) {
- DWORD cProps;
- if (SUCCEEDED(m_content->GetCount(&cProps))) {
- for (DWORD i = 0; i < cProps; i++)
- {
- PROPERTYKEY key;
- if (FAILED(m_content->GetAt(i, &key)))
- continue;
- bool common = true;
- if (key == PKEY_Author) {
- m_availableMetaDatas.push_back(QMediaMetaData::Author);
- } else if (key == PKEY_Title) {
- m_availableMetaDatas.push_back(QMediaMetaData::Title);
- } else if (key == PKEY_Media_SubTitle) {
- m_availableMetaDatas.push_back(QMediaMetaData::SubTitle);
- } else if (key == PKEY_ParentalRating) {
- m_availableMetaDatas.push_back(QMediaMetaData::ParentalRating);
- } else if (key == PKEY_Media_EncodingSettings) {
- m_availableMetaDatas.push_back(QMediaMetaData::Description);
- } else if (key == PKEY_Copyright) {
- m_availableMetaDatas.push_back(QMediaMetaData::Copyright);
- } else if (key == PKEY_Comment) {
- m_availableMetaDatas.push_back(QMediaMetaData::Comment);
- } else if (key == PKEY_Media_ProviderStyle) {
- m_availableMetaDatas.push_back(QMediaMetaData::Genre);
- } else if (key == PKEY_Media_Year) {
- m_availableMetaDatas.push_back(QMediaMetaData::Year);
- } else if (key == PKEY_Media_DateEncoded) {
- m_availableMetaDatas.push_back(QMediaMetaData::Date);
- } else if (key == PKEY_Rating) {
- m_availableMetaDatas.push_back(QMediaMetaData::UserRating);
- } else if (key == PKEY_Keywords) {
- m_availableMetaDatas.push_back(QMediaMetaData::Keywords);
- } else if (key == PKEY_Language) {
- m_availableMetaDatas.push_back(QMediaMetaData::Language);
- } else if (key == PKEY_Media_Publisher) {
- m_availableMetaDatas.push_back(QMediaMetaData::Publisher);
- } else if (key == PKEY_Media_ClassPrimaryID) {
- m_availableMetaDatas.push_back(QMediaMetaData::MediaType);
- } else if (key == PKEY_Media_Duration) {
- m_availableMetaDatas.push_back(QMediaMetaData::Duration);
- } else if (key == PKEY_Audio_EncodingBitrate) {
- m_availableMetaDatas.push_back(QMediaMetaData::AudioBitRate);
- } else if (key == PKEY_Audio_Format) {
- m_availableMetaDatas.push_back(QMediaMetaData::AudioCodec);
- } else if (key == PKEY_Media_AverageLevel) {
- m_availableMetaDatas.push_back(QMediaMetaData::AverageLevel);
- } else if (key == PKEY_Audio_ChannelCount) {
- m_availableMetaDatas.push_back(QMediaMetaData::ChannelCount);
- } else if (key == PKEY_Audio_PeakValue) {
- m_availableMetaDatas.push_back(QMediaMetaData::PeakValue);
- } else if (key == PKEY_Audio_SampleRate) {
- m_availableMetaDatas.push_back(QMediaMetaData::SampleRate);
- } else if (key == PKEY_Music_AlbumTitle) {
- m_availableMetaDatas.push_back(QMediaMetaData::AlbumTitle);
- } else if (key == PKEY_Music_AlbumArtist) {
- m_availableMetaDatas.push_back(QMediaMetaData::AlbumArtist);
- } else if (key == PKEY_Music_Artist) {
- m_availableMetaDatas.push_back(QMediaMetaData::ContributingArtist);
- } else if (key == PKEY_Music_Composer) {
- m_availableMetaDatas.push_back(QMediaMetaData::Composer);
- } else if (key == PKEY_Music_Conductor) {
- m_availableMetaDatas.push_back(QMediaMetaData::Conductor);
- } else if (key == PKEY_Music_Lyrics) {
- m_availableMetaDatas.push_back(QMediaMetaData::Lyrics);
- } else if (key == PKEY_Music_Mood) {
- m_availableMetaDatas.push_back(QMediaMetaData::Mood);
- } else if (key == PKEY_Music_TrackNumber) {
- m_availableMetaDatas.push_back(QMediaMetaData::TrackNumber);
- } else if (key == PKEY_Music_Genre) {
- m_availableMetaDatas.push_back(QMediaMetaData::Genre);
- } else if (key == PKEY_ThumbnailStream) {
- m_availableMetaDatas.push_back(QMediaMetaData::ThumbnailImage);
- } else if (key == PKEY_Video_FrameHeight) {
- m_availableMetaDatas.push_back(QMediaMetaData::Resolution);
- } else if (key == PKEY_Video_Orientation) {
- m_availableMetaDatas.push_back(QMediaMetaData::Orientation);
- } else if (key == PKEY_Video_HorizontalAspectRatio) {
- m_availableMetaDatas.push_back(QMediaMetaData::PixelAspectRatio);
- } else if (key == PKEY_Video_FrameRate) {
- m_availableMetaDatas.push_back(QMediaMetaData::VideoFrameRate);
- } else if (key == PKEY_Video_EncodingBitrate) {
- m_availableMetaDatas.push_back(QMediaMetaData::VideoBitRate);
- } else if (key == PKEY_Video_Compression) {
- m_availableMetaDatas.push_back(QMediaMetaData::VideoCodec);
- } else if (key == PKEY_Video_Director) {
- m_availableMetaDatas.push_back(QMediaMetaData::Director);
- } else if (key == PKEY_Media_Writer) {
- m_availableMetaDatas.push_back(QMediaMetaData::Writer);
- } else {
- common = false;
- //TODO: add more extended keys
- }
- if (common)
- m_commonKeys.push_back(key);
- }
- } else {
- m_content->Release();
- m_content = NULL;
- }
- }
-
- if (!m_content) {
- //fallback to Vista approach
- IMFMetadataProvider *provider = NULL;
- if (SUCCEEDED(MFGetService(mediaSource, MF_METADATA_PROVIDER_SERVICE, IID_PPV_ARGS(&provider)))) {
- if (SUCCEEDED(provider->GetMFMetadata(sourcePD, 0, 0, &m_metaData))) {
- PROPVARIANT varNames;
- PropVariantInit(&varNames);
- if (SUCCEEDED(m_metaData->GetAllPropertyNames(&varNames)) && varNames.vt == (VT_VECTOR | VT_LPWSTR)) {
- ULONG cElements = varNames.calpwstr.cElems;
- for (ULONG i = 0; i < cElements; i++)
- {
- const WCHAR* sName = varNames.calpwstr.pElems[i];
-#ifdef DEBUG_MEDIAFOUNDATION
- qDebug() << "metadata: " << QString::fromUtf16(sName);
-#endif
- if (wcscmp(sName, L"Author") == 0) {
- m_availableMetaDatas.push_back(QMediaMetaData::Author);
- } else if (wcscmp(sName, L"Title") == 0) {
- m_availableMetaDatas.push_back(QMediaMetaData::Title);
- } else if (wcscmp(sName, L"Rating") == 0) {
- m_availableMetaDatas.push_back(QMediaMetaData::ParentalRating);
- } else if (wcscmp(sName, L"Description") == 0) {
- m_availableMetaDatas.push_back(QMediaMetaData::Description);
- } else if (wcscmp(sName, L"Copyright") == 0) {
- m_availableMetaDatas.push_back(QMediaMetaData::Copyright);
- //TODO: add more common keys
- } else {
- m_availableMetaDatas.push_back(QString::fromUtf16(reinterpret_cast<const ushort*>(sName)));
- }
- m_commonNames.push_back(QString::fromUtf16(reinterpret_cast<const ushort*>(sName)));
- }
- }
- PropVariantClear(&varNames);
- } else {
- qWarning("Failed to get IMFMetadata");
- }
- provider->Release();
- } else {
- qWarning("Failed to get IMFMetadataProvider from source");
- }
- }
-
- emit metaDataChanged();
- emit metaDataAvailableChanged(m_metaData || m_content);
-}
diff --git a/src/multimedia/platform/windows/player/mfplayerservice.cpp b/src/multimedia/platform/windows/player/mfplayerservice.cpp
index 0a0096fb1..5099a1706 100644
--- a/src/multimedia/platform/windows/player/mfplayerservice.cpp
+++ b/src/multimedia/platform/windows/player/mfplayerservice.cpp
@@ -46,13 +46,11 @@
#include "mfvideorenderercontrol_p.h"
#include "mfplayerservice_p.h"
#include "mfplayersession_p.h"
-#include "mfmetadatacontrol_p.h"
MFPlayerService::MFPlayerService()
{
m_session = new MFPlayerSession(this);
m_player = new MFPlayerControl(m_session);
- m_metaDataControl = new MFMetaDataControl(this);
}
MFPlayerService::~MFPlayerService()
@@ -72,8 +70,6 @@ QObject *MFPlayerService::requestControl(const char *name)
{
if (qstrcmp(name, QMediaPlayerControl_iid) == 0) {
return m_player;
- } else if (qstrcmp(name, QMetaDataReaderControl_iid) == 0) {
- return m_metaDataControl;
} else if (qstrcmp(name, QVideoRendererControl_iid) == 0) {
if (!m_videoRendererControl && !m_videoWindowControl) {
m_videoRendererControl = new MFVideoRendererControl;
@@ -111,11 +107,6 @@ QMediaPlayerControl *MFPlayerService::player()
return m_player;
}
-QMetaDataReaderControl *MFPlayerService::dataReader()
-{
- return m_metaDataControl;
-}
-
QVideoRendererControl *MFPlayerService::createVideoRenderer()
{
return m_videoRendererControl;
@@ -135,8 +126,3 @@ MFEvrVideoWindowControl* MFPlayerService::videoWindowControl() const
{
return m_videoWindowControl;
}
-
-MFMetaDataControl* MFPlayerService::metaDataControl() const
-{
- return m_metaDataControl;
-}
diff --git a/src/multimedia/platform/windows/player/mfplayerservice_p.h b/src/multimedia/platform/windows/player/mfplayerservice_p.h
index e896660d5..7c0685a78 100644
--- a/src/multimedia/platform/windows/player/mfplayerservice_p.h
+++ b/src/multimedia/platform/windows/player/mfplayerservice_p.h
@@ -68,7 +68,6 @@ QT_USE_NAMESPACE
class MFEvrVideoWindowControl;
class MFVideoRendererControl;
class MFPlayerControl;
-class MFMetaDataControl;
class MFPlayerSession;
class MFPlayerService : public QMediaPlatformPlayerInterface
@@ -82,7 +81,6 @@ public:
void releaseControl(QObject *control) override;
QMediaPlayerControl *player() override;
- QMetaDataReaderControl *dataReader() override;
// ### QMediaStreamsControl *streams() override;
virtual QVideoRendererControl *createVideoRenderer() override;
@@ -90,14 +88,12 @@ public:
MFVideoRendererControl* videoRendererControl() const;
MFEvrVideoWindowControl* videoWindowControl() const;
- MFMetaDataControl* metaDataControl() const;
private:
MFPlayerSession *m_session = nullptr;
MFVideoRendererControl *m_videoRendererControl = nullptr;
MFEvrVideoWindowControl *m_videoWindowControl = nullptr;
MFPlayerControl *m_player = nullptr;
- MFMetaDataControl *m_metaDataControl = nullptr;
};
#endif
diff --git a/src/multimedia/platform/windows/player/mfplayersession.cpp b/src/multimedia/platform/windows/player/mfplayersession.cpp
index 359748832..7972ffd5b 100644
--- a/src/multimedia/platform/windows/player/mfplayersession.cpp
+++ b/src/multimedia/platform/windows/player/mfplayersession.cpp
@@ -50,10 +50,10 @@
#include "mfplayercontrol_p.h"
#include "mfevrvideowindowcontrol_p.h"
#include "mfvideorenderercontrol_p.h"
+#include "mfmetadata_p.h"
#include "mfplayersession_p.h"
#include "mfplayerservice_p.h"
-#include "mfmetadatacontrol_p.h"
#include <mferror.h>
#include <nserror.h>
#include "private/sourceresolver_p.h"
@@ -67,8 +67,8 @@
//#define DEBUG_MEDIAFOUNDATION
MFPlayerSession::MFPlayerSession(MFPlayerService *playerService)
- : m_playerService(playerService)
- , m_cRef(1)
+ : m_cRef(1)
+ , m_playerService(playerService)
, m_session(0)
, m_presentationClock(0)
, m_rateControl(0)
@@ -235,7 +235,8 @@ void MFPlayerSession::handleMediaSourceReady()
hr = mediaSource->CreatePresentationDescriptor(&sourcePD);
if (SUCCEEDED(hr)) {
m_duration = 0;
- m_playerService->metaDataControl()->updateSource(sourcePD, mediaSource);
+ m_metaData = MFMetaData::fromNative(mediaSource);
+ emit metaDataChanged();
sourcePD->GetUINT64(MF_PD_DURATION, &m_duration);
//convert from 100 nanosecond to milisecond
emit durationUpdate(qint64(m_duration / 10000));
diff --git a/src/multimedia/platform/windows/player/mfplayersession_p.h b/src/multimedia/platform/windows/player/mfplayersession_p.h
index 302f22556..adc3c392b 100644
--- a/src/multimedia/platform/windows/player/mfplayersession_p.h
+++ b/src/multimedia/platform/windows/player/mfplayersession_p.h
@@ -75,7 +75,6 @@ QT_USE_NAMESPACE
class SourceResolver;
class MFVideoRendererControl;
class MFPlayerControl;
-class MFMetaDataControl;
class MFPlayerService;
class AudioSampleGrabberCallback;
class MFTransform;
@@ -127,6 +126,8 @@ public:
bool setAudioOutput(const QAudioDeviceInfo &device);
QAudioDeviceInfo audioOutput() const { return m_audioOutput; }
+ QMediaMetaData metaData() const { return m_metaData; }
+
Q_SIGNALS:
void error(QMediaPlayer::Error error, QString errorString, bool isFatal);
void sessionEvent(IMFMediaEvent *sessionEvent);
@@ -140,6 +141,7 @@ Q_SIGNALS:
void volumeChanged(int volume);
void mutedChanged(bool muted);
void bufferStatusChanged(int percentFilled);
+ void metaDataChanged();
private Q_SLOTS:
void handleMediaSourceReady();
@@ -221,6 +223,7 @@ private:
bool m_muted;
QAudioDeviceInfo m_audioOutput;
+ QMediaMetaData m_metaData;
IMFActivate *m_currentAudioActivate = nullptr;
diff --git a/src/multimedia/platform/windows/player/player.pri b/src/multimedia/platform/windows/player/player.pri
index b7990b21d..2008bc092 100644
--- a/src/multimedia/platform/windows/player/player.pri
+++ b/src/multimedia/platform/windows/player/player.pri
@@ -8,7 +8,7 @@ HEADERS += \
$$PWD/mfplayersession_p.h \
$$PWD/mfplayercontrol_p.h \
$$PWD/mfvideorenderercontrol_p.h \
- $$PWD/mfmetadatacontrol_p.h \
+ $$PWD/mfmetadata_p.h \
$$PWD/mfevrvideowindowcontrol_p.h \
$$PWD/samplegrabber_p.h \
$$PWD/mftvideo_p.h \
@@ -19,7 +19,7 @@ SOURCES += \
$$PWD/mfplayersession.cpp \
$$PWD/mfplayercontrol.cpp \
$$PWD/mfvideorenderercontrol.cpp \
- $$PWD/mfmetadatacontrol.cpp \
+ $$PWD/mfmetadata.cpp \
$$PWD/mfevrvideowindowcontrol.cpp \
$$PWD/samplegrabber.cpp \
$$PWD/mftvideo.cpp \
diff --git a/src/multimedia/playback/qplaylistfileparser.cpp b/src/multimedia/playback/qplaylistfileparser.cpp
index 29a9fcf39..885129823 100644
--- a/src/multimedia/playback/qplaylistfileparser.cpp
+++ b/src/multimedia/playback/qplaylistfileparser.cpp
@@ -164,9 +164,9 @@ public:
}
} else {
QUrl url = expandToFullPath(root, line);
- m_extraInfo[QLatin1String("url")] = url;
+ m_extraInfo[QMediaMetaData::Url] = url;
m_parent->playlist.append(url);
- newItemFound(QVariant(m_extraInfo));
+ newItemFound(QVariant::fromValue(m_extraInfo));
m_extraInfo.clear();
}
@@ -191,7 +191,7 @@ public:
}
private:
- QVariantMap m_extraInfo;
+ QMediaMetaData m_extraInfo;
bool m_extendedFormat;
};
diff --git a/src/multimedia/qmediametadata.cpp b/src/multimedia/qmediametadata.cpp
index 5607bd5d2..5ab262357 100644
--- a/src/multimedia/qmediametadata.cpp
+++ b/src/multimedia/qmediametadata.cpp
@@ -38,147 +38,17 @@
****************************************************************************/
#include "qmediametadata.h"
+#include <qvariant.h>
QT_BEGIN_NAMESPACE
-/*
- When these conditions are satisfied, QStringLiteral is implemented by
- gcc's statement-expression extension. However, in this file it will
- not work, because "statement-expressions are not allowed outside functions
- nor in template-argument lists".
- MSVC 2012 produces an internal compiler error on encountering
- QStringLiteral in this context.
-
- Fall back to the less-performant QLatin1String in this case.
-*/
-#if defined(Q_CC_GNU) && defined(Q_COMPILER_LAMBDA)
-# define Q_DEFINE_METADATA(key) const QString QMediaMetaData::key(QStringLiteral(#key))
-#else
-# define Q_DEFINE_METADATA(key) const QString QMediaMetaData::key(QLatin1String(#key))
-#endif
-
-// Common
-Q_DEFINE_METADATA(Title);
-Q_DEFINE_METADATA(SubTitle);
-Q_DEFINE_METADATA(Author);
-Q_DEFINE_METADATA(Comment);
-Q_DEFINE_METADATA(Description);
-Q_DEFINE_METADATA(Category);
-Q_DEFINE_METADATA(Genre);
-Q_DEFINE_METADATA(Year);
-Q_DEFINE_METADATA(Date);
-Q_DEFINE_METADATA(UserRating);
-Q_DEFINE_METADATA(Keywords);
-Q_DEFINE_METADATA(Language);
-Q_DEFINE_METADATA(Publisher);
-Q_DEFINE_METADATA(Copyright);
-Q_DEFINE_METADATA(ParentalRating);
-Q_DEFINE_METADATA(RatingOrganization);
-
-// Media
-Q_DEFINE_METADATA(Size);
-Q_DEFINE_METADATA(MediaType);
-Q_DEFINE_METADATA(Duration);
-
-// Audio
-Q_DEFINE_METADATA(AudioBitRate);
-Q_DEFINE_METADATA(AudioCodec);
-Q_DEFINE_METADATA(AverageLevel);
-Q_DEFINE_METADATA(ChannelCount);
-Q_DEFINE_METADATA(PeakValue);
-Q_DEFINE_METADATA(SampleRate);
-
-// Music
-Q_DEFINE_METADATA(AlbumTitle);
-Q_DEFINE_METADATA(AlbumArtist);
-Q_DEFINE_METADATA(ContributingArtist);
-Q_DEFINE_METADATA(Composer);
-Q_DEFINE_METADATA(Conductor);
-Q_DEFINE_METADATA(Lyrics);
-Q_DEFINE_METADATA(Mood);
-Q_DEFINE_METADATA(TrackNumber);
-Q_DEFINE_METADATA(TrackCount);
-
-Q_DEFINE_METADATA(CoverArtUrlSmall);
-Q_DEFINE_METADATA(CoverArtUrlLarge);
-
-// Image/Video
-Q_DEFINE_METADATA(Resolution);
-Q_DEFINE_METADATA(PixelAspectRatio);
-Q_DEFINE_METADATA(Orientation);
-
-// Video
-Q_DEFINE_METADATA(VideoFrameRate);
-Q_DEFINE_METADATA(VideoBitRate);
-Q_DEFINE_METADATA(VideoCodec);
-
-Q_DEFINE_METADATA(PosterUrl);
-
-// Movie
-Q_DEFINE_METADATA(ChapterNumber);
-Q_DEFINE_METADATA(Director);
-Q_DEFINE_METADATA(LeadPerformer);
-Q_DEFINE_METADATA(Writer);
-
-// Photos
-Q_DEFINE_METADATA(CameraManufacturer);
-Q_DEFINE_METADATA(CameraModel);
-Q_DEFINE_METADATA(Event);
-Q_DEFINE_METADATA(Subject);
-Q_DEFINE_METADATA(ExposureTime);
-Q_DEFINE_METADATA(FNumber);
-Q_DEFINE_METADATA(ExposureProgram);
-Q_DEFINE_METADATA(ISOSpeedRatings);
-Q_DEFINE_METADATA(ExposureBiasValue);
-Q_DEFINE_METADATA(DateTimeOriginal);
-Q_DEFINE_METADATA(DateTimeDigitized);
-Q_DEFINE_METADATA(SubjectDistance);
-Q_DEFINE_METADATA(LightSource);
-Q_DEFINE_METADATA(Flash);
-Q_DEFINE_METADATA(FocalLength);
-Q_DEFINE_METADATA(ExposureMode);
-Q_DEFINE_METADATA(WhiteBalance);
-Q_DEFINE_METADATA(DigitalZoomRatio);
-Q_DEFINE_METADATA(FocalLengthIn35mmFilm);
-Q_DEFINE_METADATA(SceneCaptureType);
-Q_DEFINE_METADATA(GainControl);
-Q_DEFINE_METADATA(Contrast);
-Q_DEFINE_METADATA(Saturation);
-Q_DEFINE_METADATA(Sharpness);
-Q_DEFINE_METADATA(DeviceSettingDescription);
-
-// Location
-Q_DEFINE_METADATA(GPSLatitude);
-Q_DEFINE_METADATA(GPSLongitude);
-Q_DEFINE_METADATA(GPSAltitude);
-Q_DEFINE_METADATA(GPSTimeStamp);
-Q_DEFINE_METADATA(GPSSatellites);
-Q_DEFINE_METADATA(GPSStatus);
-Q_DEFINE_METADATA(GPSDOP);
-Q_DEFINE_METADATA(GPSSpeed);
-Q_DEFINE_METADATA(GPSTrack);
-Q_DEFINE_METADATA(GPSTrackRef);
-Q_DEFINE_METADATA(GPSImgDirection);
-Q_DEFINE_METADATA(GPSImgDirectionRef);
-Q_DEFINE_METADATA(GPSMapDatum);
-Q_DEFINE_METADATA(GPSProcessingMethod);
-Q_DEFINE_METADATA(GPSAreaInformation);
-
-Q_DEFINE_METADATA(PosterImage);
-Q_DEFINE_METADATA(CoverArtImage);
-Q_DEFINE_METADATA(ThumbnailImage);
-
-
/*!
- \namespace QMediaMetaData
- \ingroup multimedia-namespaces
- \ingroup multimedia
+ \class QMediaMetaData
\inmodule QtMultimedia
- \brief Provides identifiers for meta-data attributes.
+ \brief Provides meta-data for media files.
- \note Not all identifiers are supported on all platforms. Please consult vendor documentation for specific support
- on different platforms.
+ \note Not all identifiers are supported on all platforms.
\table 60%
\header \li {3,1}
@@ -347,4 +217,20 @@ Q_DEFINE_METADATA(ThumbnailImage);
\endtable
*/
+//QMetaType QMediaMetaData::typeForKey(QMediaMetaData::Key k)
+//{
+
+//}
+
+QVariant QMediaMetaData::value(QMediaMetaData::Key k) const
+{
+ return data.value(k);
+}
+
+void QMediaMetaData::insert(QMediaMetaData::Key k, const QVariant &value)
+{
+ data.insert(k, value);
+}
+
+
QT_END_NAMESPACE
diff --git a/src/multimedia/qmediametadata.h b/src/multimedia/qmediametadata.h
index bea76b8a5..0bf43309b 100644
--- a/src/multimedia/qmediametadata.h
+++ b/src/multimedia/qmediametadata.h
@@ -41,9 +41,9 @@
#define QMEDIAMETADATA_H
#include <QtCore/qpair.h>
-#include <QtCore/qmetatype.h>
+#include <QtCore/qvariant.h>
#include <QtCore/qstring.h>
-
+#include <QtCore/qhash.h>
#include <QtMultimedia/qtmultimediaglobal.h>
QT_BEGIN_NAMESPACE
@@ -51,10 +51,65 @@ QT_BEGIN_NAMESPACE
// Class forward declaration required for QDoc bug
class QString;
-#define Q_DECLARE_METADATA(key) Q_MULTIMEDIA_EXPORT extern const QString key
+class Q_MULTIMEDIA_EXPORT QMediaMetaData {
+public:
+ enum Key {
+ Title,
+ Author,
+ Comment,
+ Description,
+ Genre,
+ Year,
+ Date,
+
+ Language,
+ Publisher,
+ Copyright,
+ Url,
+
+ Duration,
+
+ MediaType,
+ AudioBitRate,
+ AudioCodec,
+ VideoBitRate,
+ VideoCodec,
+
+ AlbumTitle,
+ AlbumArtist,
+ ContributingArtist,
+ TrackNumber,
+ Composer,
+
+ ThumbnailImage,
+ CoverArtImage,
+ Orientation,
+
+ Resolution,
+ LeadPerformer,
+ };
+
+// QMetaType typeForKey(Key k);
+ QVariant value(Key k) const;
+ void insert(Key k, const QVariant &value);
+ void remove(Key k) { data.remove(k); }
+ QList<Key> keys() const { return data.keys(); }
+
+ QVariant &operator[](Key k) { return data[k]; }
+ void clear() { data.clear(); }
+
+ bool isEmpty() const { return data.isEmpty(); }
+
+protected:
+ friend bool operator==(const QMediaMetaData &a, const QMediaMetaData &b)
+ { return a.data == b.data; }
+ friend bool operator!=(const QMediaMetaData &a, const QMediaMetaData &b)
+ { return a.data != b.data; }
+
+ QHash<Key, QVariant> data;
-namespace QMediaMetaData {
#ifdef Q_QDOC
+ // ### For reference right now, remove
// QDoc does not like macros, so try to keep this in sync :)
QString Title;
QString SubTitle;
@@ -165,121 +220,8 @@ namespace QMediaMetaData {
QString PosterImage;
QString CoverArtImage;
QString ThumbnailImage;
-#else
- // Common
- Q_DECLARE_METADATA(Title);
- Q_DECLARE_METADATA(SubTitle);
- Q_DECLARE_METADATA(Author);
- Q_DECLARE_METADATA(Comment);
- Q_DECLARE_METADATA(Description);
- Q_DECLARE_METADATA(Category);
- Q_DECLARE_METADATA(Genre);
- Q_DECLARE_METADATA(Year);
- Q_DECLARE_METADATA(Date);
- Q_DECLARE_METADATA(UserRating);
- Q_DECLARE_METADATA(Keywords);
- Q_DECLARE_METADATA(Language);
- Q_DECLARE_METADATA(Publisher);
- Q_DECLARE_METADATA(Copyright);
- Q_DECLARE_METADATA(ParentalRating);
- Q_DECLARE_METADATA(RatingOrganization);
-
- // Media
- Q_DECLARE_METADATA(Size);
- Q_DECLARE_METADATA(MediaType);
- Q_DECLARE_METADATA(Duration);
-
- // Audio
- Q_DECLARE_METADATA(AudioBitRate);
- Q_DECLARE_METADATA(AudioCodec);
- Q_DECLARE_METADATA(AverageLevel);
- Q_DECLARE_METADATA(ChannelCount);
- Q_DECLARE_METADATA(PeakValue);
- Q_DECLARE_METADATA(SampleRate);
-
- // Music
- Q_DECLARE_METADATA(AlbumTitle);
- Q_DECLARE_METADATA(AlbumArtist);
- Q_DECLARE_METADATA(ContributingArtist);
- Q_DECLARE_METADATA(Composer);
- Q_DECLARE_METADATA(Conductor);
- Q_DECLARE_METADATA(Lyrics);
- Q_DECLARE_METADATA(Mood);
- Q_DECLARE_METADATA(TrackNumber);
- Q_DECLARE_METADATA(TrackCount);
-
- Q_DECLARE_METADATA(CoverArtUrlSmall);
- Q_DECLARE_METADATA(CoverArtUrlLarge);
-
- // Image/Video
- Q_DECLARE_METADATA(Resolution);
- Q_DECLARE_METADATA(PixelAspectRatio);
-
- // Video
- Q_DECLARE_METADATA(VideoFrameRate);
- Q_DECLARE_METADATA(VideoBitRate);
- Q_DECLARE_METADATA(VideoCodec);
-
- Q_DECLARE_METADATA(PosterUrl);
-
- // Movie
- Q_DECLARE_METADATA(ChapterNumber);
- Q_DECLARE_METADATA(Director);
- Q_DECLARE_METADATA(LeadPerformer);
- Q_DECLARE_METADATA(Writer);
-
- // Photos
- Q_DECLARE_METADATA(CameraManufacturer);
- Q_DECLARE_METADATA(CameraModel);
- Q_DECLARE_METADATA(Event);
- Q_DECLARE_METADATA(Subject);
- Q_DECLARE_METADATA(Orientation);
- Q_DECLARE_METADATA(ExposureTime);
- Q_DECLARE_METADATA(FNumber);
- Q_DECLARE_METADATA(ExposureProgram);
- Q_DECLARE_METADATA(ISOSpeedRatings);
- Q_DECLARE_METADATA(ExposureBiasValue);
- Q_DECLARE_METADATA(DateTimeOriginal);
- Q_DECLARE_METADATA(DateTimeDigitized);
- Q_DECLARE_METADATA(SubjectDistance);
- Q_DECLARE_METADATA(LightSource);
- Q_DECLARE_METADATA(Flash);
- Q_DECLARE_METADATA(FocalLength);
- Q_DECLARE_METADATA(ExposureMode);
- Q_DECLARE_METADATA(WhiteBalance);
- Q_DECLARE_METADATA(DigitalZoomRatio);
- Q_DECLARE_METADATA(FocalLengthIn35mmFilm);
- Q_DECLARE_METADATA(SceneCaptureType);
- Q_DECLARE_METADATA(GainControl);
- Q_DECLARE_METADATA(Contrast);
- Q_DECLARE_METADATA(Saturation);
- Q_DECLARE_METADATA(Sharpness);
- Q_DECLARE_METADATA(DeviceSettingDescription);
-
- // Location
- Q_DECLARE_METADATA(GPSLatitude);
- Q_DECLARE_METADATA(GPSLongitude);
- Q_DECLARE_METADATA(GPSAltitude);
- Q_DECLARE_METADATA(GPSTimeStamp);
- Q_DECLARE_METADATA(GPSSatellites);
- Q_DECLARE_METADATA(GPSStatus);
- Q_DECLARE_METADATA(GPSDOP);
- Q_DECLARE_METADATA(GPSSpeed);
- Q_DECLARE_METADATA(GPSTrack);
- Q_DECLARE_METADATA(GPSTrackRef);
- Q_DECLARE_METADATA(GPSImgDirection);
- Q_DECLARE_METADATA(GPSImgDirectionRef);
- Q_DECLARE_METADATA(GPSMapDatum);
- Q_DECLARE_METADATA(GPSProcessingMethod);
- Q_DECLARE_METADATA(GPSAreaInformation);
-
- Q_DECLARE_METADATA(PosterImage);
- Q_DECLARE_METADATA(CoverArtImage);
- Q_DECLARE_METADATA(ThumbnailImage);
#endif
-}
-
-#undef Q_DECLARE_METADATA
+};
QT_END_NAMESPACE
diff --git a/src/multimedia/qmediasource.cpp b/src/multimedia/qmediasource.cpp
index 55c1c9f1f..f807e823e 100644
--- a/src/multimedia/qmediasource.cpp
+++ b/src/multimedia/qmediasource.cpp
@@ -43,8 +43,8 @@
#include "qmediasource_p.h"
#include <qmediaservice.h>
-#include <qmetadatareadercontrol.h>
#include <qmediasink.h>
+#include <qmediametadata.h>
QT_BEGIN_NAMESPACE
@@ -216,8 +216,6 @@ QMediaSource::QMediaSource(QObject *parent, QMediaService *service)
connect(d->notifyTimer, SIGNAL(timeout()), SLOT(_q_notify()));
d->service = service;
-
- setupControls();
}
/*!
@@ -234,8 +232,6 @@ QMediaSource::QMediaSource(QMediaSourcePrivate &dd, QObject *parent, QMediaServi
connect(d->notifyTimer, SIGNAL(timeout()), SLOT(_q_notify()));
d->service = service;
-
- setupControls();
}
/*!
@@ -299,48 +295,13 @@ void QMediaSource::removePropertyWatch(QByteArray const &name)
*/
/*!
- Returns true if there is meta-data associated with this media object, else false.
-*/
-
-bool QMediaSource::isMetaDataAvailable() const
-{
- Q_D(const QMediaSource);
-
- return d->metaDataControl
- ? d->metaDataControl->isMetaDataAvailable()
- : false;
-}
-
-/*!
- \fn QMediaSource::metaDataAvailableChanged(bool available)
-
- Signals that the \a available state of a media object's meta-data has changed.
-*/
-
-/*!
Returns the value associated with a meta-data \a key.
See the list of predefined \l {QMediaMetaData}{meta-data keys}.
*/
-QVariant QMediaSource::metaData(const QString &key) const
+QMediaMetaData QMediaSource::metaData() const
{
- Q_D(const QMediaSource);
-
- return d->metaDataControl
- ? d->metaDataControl->metaData(key)
- : QVariant();
-}
-
-/*!
- Returns a list of keys there is meta-data available for.
-*/
-QStringList QMediaSource::availableMetaData() const
-{
- Q_D(const QMediaSource);
-
- return d->metaDataControl
- ? d->metaDataControl->availableMetaData()
- : QStringList();
+ return QMediaMetaData();
}
/*!
@@ -353,33 +314,6 @@ QStringList QMediaSource::availableMetaData() const
for each of them with metaDataChanged() changed emitted once.
*/
-/*!
- \fn QMediaSource::metaDataChanged(const QString &key, const QVariant &value)
-
- Signal the changes of one meta-data element \a value with the given \a key.
-*/
-
-
-void QMediaSource::setupControls()
-{
- Q_D(QMediaSource);
-
- if (d->service != nullptr) {
- d->metaDataControl = qobject_cast<QMetaDataReaderControl*>(
- d->service->requestControl(QMetaDataReaderControl_iid));
-
- if (d->metaDataControl) {
- connect(d->metaDataControl, SIGNAL(metaDataChanged()), SIGNAL(metaDataChanged()));
- connect(d->metaDataControl,
- SIGNAL(metaDataChanged(QString,QVariant)),
- SIGNAL(metaDataChanged(QString,QVariant)));
- connect(d->metaDataControl,
- SIGNAL(metaDataAvailableChanged(bool)),
- SIGNAL(metaDataAvailableChanged(bool)));
- }
- }
-}
-
QT_END_NAMESPACE
#include "moc_qmediasource.cpp"
diff --git a/src/multimedia/qmediasource.h b/src/multimedia/qmediasource.h
index 65a9cbbde..8f376eeaf 100644
--- a/src/multimedia/qmediasource.h
+++ b/src/multimedia/qmediasource.h
@@ -51,6 +51,7 @@ QT_BEGIN_NAMESPACE
class QMediaService;
class QMediaSink;
+class QMediaMetaData;
class QMediaSourcePrivate;
class Q_MULTIMEDIA_EXPORT QMediaSource : public QObject
@@ -74,17 +75,12 @@ public:
bool bind(QMediaSink *);
void unbind(QMediaSink *);
- bool isMetaDataAvailable() const;
-
- QVariant metaData(const QString &key) const;
- QStringList availableMetaData() const;
+ virtual QMediaMetaData metaData() const;
Q_SIGNALS:
void notifyIntervalChanged(int milliSeconds);
- void metaDataAvailableChanged(bool available);
void metaDataChanged();
- void metaDataChanged(const QString &key, const QVariant &value);
protected:
QMediaSource(QObject *parent, QMediaService *service);
@@ -94,8 +90,6 @@ protected:
void removePropertyWatch(QByteArray const &name);
private:
- void setupControls();
-
Q_DECLARE_PRIVATE(QMediaSource)
Q_PRIVATE_SLOT(d_func(), void _q_notify())
};
diff --git a/src/multimedia/qmediasource_p.h b/src/multimedia/qmediasource_p.h
index 73dbfb894..e6000e11e 100644
--- a/src/multimedia/qmediasource_p.h
+++ b/src/multimedia/qmediasource_p.h
@@ -60,9 +60,6 @@
QT_BEGIN_NAMESPACE
-
-class QMetaDataReaderControl;
-
#define Q_DECLARE_NON_CONST_PUBLIC(Class) \
inline Class* q_func() { return static_cast<Class *>(q_ptr); } \
friend class Class;
@@ -73,13 +70,12 @@ class QMediaSourcePrivate : public QObjectPrivate
Q_DECLARE_PUBLIC(QMediaSource)
public:
- QMediaSourcePrivate() : service(nullptr), metaDataControl(nullptr), notifyTimer(nullptr) {}
+ QMediaSourcePrivate() : service(nullptr), notifyTimer(nullptr) {}
virtual ~QMediaSourcePrivate() {}
void _q_notify();
QMediaService *service;
- QMetaDataReaderControl *metaDataControl;
QTimer* notifyTimer;
QSet<int> notifyProperties;
diff --git a/src/multimedia/recording/qmediarecorder.cpp b/src/multimedia/recording/qmediarecorder.cpp
index 23da8b547..2fa14fd4e 100644
--- a/src/multimedia/recording/qmediarecorder.cpp
+++ b/src/multimedia/recording/qmediarecorder.cpp
@@ -43,7 +43,6 @@
#include <qmediarecordercontrol.h>
#include "qmediasource_p.h"
#include <qmediaservice.h>
-#include <qmetadatawritercontrol.h>
#include <qaudiodeviceinfo.h>
#include <qcamera.h>
#include <qcameracontrol.h>
@@ -118,7 +117,6 @@ void QMediaRecorderPrivate::_q_serviceDestroyed()
{
mediaSource = nullptr;
control = nullptr;
- metaDataControl = nullptr;
settingsChanged = true;
}
@@ -290,23 +288,12 @@ bool QMediaRecorder::setMediaSource(QMediaSource *object)
if (service) {
disconnect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed()));
- if (d->metaDataControl) {
- disconnect(d->metaDataControl, SIGNAL(metaDataChanged()),
- this, SIGNAL(metaDataChanged()));
- disconnect(d->metaDataControl, SIGNAL(metaDataChanged(QString,QVariant)),
- this, SIGNAL(metaDataChanged(QString,QVariant)));
- disconnect(d->metaDataControl, SIGNAL(metaDataAvailableChanged(bool)),
- this, SIGNAL(metaDataAvailableChanged(bool)));
- disconnect(d->metaDataControl, SIGNAL(writableChanged(bool)),
- this, SIGNAL(metaDataWritableChanged(bool)));
- }
if (d->control)
service->releaseControl(d->control);
}
}
d->control = nullptr;
- d->metaDataControl = nullptr;
d->mediaSource = object;
@@ -320,21 +307,6 @@ bool QMediaRecorder::setMediaSource(QMediaSource *object)
d->control = qobject_cast<QMediaRecorderControl*>(service->requestControl(QMediaRecorderControl_iid));
if (d->control) {
- d->metaDataControl = d->control->metaDataControl();
- Q_ASSERT(d->metaDataControl);
-
- connect(d->metaDataControl,
- SIGNAL(metaDataChanged()),
- SIGNAL(metaDataChanged()));
- connect(d->metaDataControl, SIGNAL(metaDataChanged(QString,QVariant)),
- this, SIGNAL(metaDataChanged(QString,QVariant)));
- connect(d->metaDataControl,
- SIGNAL(metaDataAvailableChanged(bool)),
- SIGNAL(metaDataAvailableChanged(bool)));
- connect(d->metaDataControl,
- SIGNAL(writableChanged(bool)),
- SIGNAL(metaDataWritableChanged(bool)));
-
connect(d->control, SIGNAL(stateChanged(QMediaRecorder::State)),
this, SLOT(_q_stateChanged(QMediaRecorder::State)));
@@ -356,6 +328,9 @@ bool QMediaRecorder::setMediaSource(QMediaSource *object)
connect(d->control, SIGNAL(error(int,QString)),
this, SLOT(_q_error(int,QString)));
+ connect(d->control, SIGNAL(metaDataChanged()),
+ this, SIGNAL(metaDataChanged()));
+
connect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed()));
@@ -715,85 +690,36 @@ void QMediaRecorder::stop()
*/
/*!
- \property QMediaRecorder::metaDataAvailable
- \brief whether access to a media object's meta-data is available.
-
- If this is true there is meta-data available, otherwise there is no meta-data available.
-*/
-
-bool QMediaRecorder::isMetaDataAvailable() const
-{
- Q_D(const QMediaRecorder);
-
- return d->metaDataControl
- ? d->metaDataControl->isMetaDataAvailable()
- : false;
-}
-
-/*!
- \fn QMediaRecorder::metaDataAvailableChanged(bool available)
-
- Signals that the \a available state of a media object's meta-data has changed.
-*/
-
-/*!
- \property QMediaRecorder::metaDataWritable
- \brief whether a media object's meta-data is writable.
-
- If this is true the meta-data is writable, otherwise the meta-data is read-only.
-*/
-
-bool QMediaRecorder::isMetaDataWritable() const
-{
- Q_D(const QMediaRecorder);
-
- return d->metaDataControl
- ? d->metaDataControl->isWritable()
- : false;
-}
-
-/*!
- \fn QMediaRecorder::metaDataWritableChanged(bool writable)
-
- Signals that the \a writable state of a media object's meta-data has changed.
+ Returns the metaData associated with the recording.
*/
-
-/*!
- Returns the value associated with a meta-data \a key.
-*/
-QVariant QMediaRecorder::metaData(const QString &key) const
+QMediaMetaData QMediaRecorder::metaData() const
{
Q_D(const QMediaRecorder);
- return d->metaDataControl
- ? d->metaDataControl->metaData(key)
- : QVariant();
+ return d->control ? d->control->metaData() : QMediaMetaData{};
}
/*!
- Sets a \a value for a meta-data \a key.
+ Sets the meta data tp \a metaData.
\note To ensure that meta data is set corretly, it should be set before starting the recording.
Once the recording is stopped, any meta data set will be attached to the next recording.
*/
-void QMediaRecorder::setMetaData(const QString &key, const QVariant &value)
+void QMediaRecorder::setMetaData(const QMediaMetaData &metaData)
{
Q_D(QMediaRecorder);
- if (d->metaDataControl)
- d->metaDataControl->setMetaData(key, value);
+ if (d->control)
+ d->control->setMetaData(metaData);
}
-/*!
- Returns a list of keys there is meta-data available for.
-*/
-QStringList QMediaRecorder::availableMetaData() const
+void QMediaRecorder::addMetaData(const QMediaMetaData &metaData)
{
- Q_D(const QMediaRecorder);
-
- return d->metaDataControl
- ? d->metaDataControl->availableMetaData()
- : QStringList();
+ auto data = this->metaData();
+ // merge data
+ for (const auto &k : metaData.keys())
+ data.insert(k, metaData.value(k));
+ setMetaData(data);
}
/*!
diff --git a/src/multimedia/recording/qmediarecorder.h b/src/multimedia/recording/qmediarecorder.h
index 65499398c..303dd3dea 100644
--- a/src/multimedia/recording/qmediarecorder.h
+++ b/src/multimedia/recording/qmediarecorder.h
@@ -45,6 +45,7 @@
#include <QtMultimedia/qmediaencodersettings.h>
#include <QtMultimedia/qmediasink.h>
#include <QtMultimedia/qmediaenumdebug.h>
+#include <QtMultimedia/qmediametadata.h>
#include <QtCore/qpair.h>
@@ -78,8 +79,7 @@ class Q_MULTIMEDIA_EXPORT QMediaRecorder : public QObject, public QMediaSink
Q_PROPERTY(QUrl actualLocation READ actualLocation NOTIFY actualLocationChanged)
Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged)
Q_PROPERTY(qreal volume READ volume WRITE setVolume NOTIFY volumeChanged)
- Q_PROPERTY(bool metaDataAvailable READ isMetaDataAvailable NOTIFY metaDataAvailableChanged)
- Q_PROPERTY(bool metaDataWritable READ isMetaDataWritable NOTIFY metaDataWritableChanged)
+ Q_PROPERTY(QMediaMetaData metaData READ metaData WRITE setMetaData NOTIFY metaDataChanged)
Q_PROPERTY(QAudioDeviceInfo audioInput READ audioInput WRITE setAudioInput NOTIFY audioInputChanged)
public:
@@ -143,12 +143,9 @@ public:
void setEncoderSettings(const QMediaEncoderSettings &);
QMediaEncoderSettings encoderSettings() const;
- bool isMetaDataAvailable() const;
- bool isMetaDataWritable() const;
-
- QVariant metaData(const QString &key) const;
- void setMetaData(const QString &key, const QVariant &value);
- QStringList availableMetaData() const;
+ QMediaMetaData metaData() const;
+ void setMetaData(const QMediaMetaData &metaData);
+ void addMetaData(const QMediaMetaData &metaData);
QAudioDeviceInfo audioInput() const;
QCameraInfo videoInput() const;
@@ -172,10 +169,7 @@ Q_SIGNALS:
void error(QMediaRecorder::Error error);
- void metaDataAvailableChanged(bool available);
- void metaDataWritableChanged(bool writable);
void metaDataChanged();
- void metaDataChanged(const QString &key, const QVariant &value);
protected:
QMediaRecorder(QMediaRecorderPrivate &dd, QMediaSource *mediaSource, QObject *parent = nullptr);
diff --git a/src/multimedia/recording/qmediarecorder_p.h b/src/multimedia/recording/qmediarecorder_p.h
index 6a7ae4039..94d5d80c9 100644
--- a/src/multimedia/recording/qmediarecorder_p.h
+++ b/src/multimedia/recording/qmediarecorder_p.h
@@ -61,7 +61,6 @@ class QMediaRecorderControl;
class QMediaContainerControl;
class QAudioEncoderSettingsControl;
class QVideoEncoderSettingsControl;
-class QMetaDataWriterControl;
class QTimer;
class QMediaRecorderPrivate
@@ -77,7 +76,6 @@ public:
QPointer<QMediaSource> mediaSource;
QMediaRecorderControl *control = nullptr;
- QMetaDataWriterControl *metaDataControl = nullptr;
bool settingsChanged = false;
diff --git a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp
index be061cce4..28390cab8 100644
--- a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp
+++ b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp
@@ -428,7 +428,7 @@ void tst_QCameraBackend::testCameraCaptureMetadata()
QCameraImageCapture imageCapture(&camera);
camera.exposure()->setFlashMode(QCameraExposure::FlashOff);
- QSignalSpy metadataSignal(&imageCapture, SIGNAL(imageMetadataAvailable(int,QString,QVariant)));
+ QSignalSpy metadataSignal(&imageCapture, SIGNAL(imageMetadataAvailable(int,const QMediaMetaData&)));
QSignalSpy savedSignal(&imageCapture, SIGNAL(imageSaved(int,QString)));
camera.start();
diff --git a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
index 886a6e817..259ccaceb 100644
--- a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
+++ b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
@@ -1055,30 +1055,22 @@ void tst_QMediaPlayerBackend::metadata()
QMediaPlayer player;
- QSignalSpy metadataAvailableSpy(&player, SIGNAL(metaDataAvailableChanged(bool)));
QSignalSpy metadataChangedSpy(&player, SIGNAL(metaDataChanged()));
player.setMedia(localFileWithMetadata);
- QTRY_VERIFY(player.isMetaDataAvailable());
- QCOMPARE(metadataAvailableSpy.count(), 1);
- QVERIFY(metadataAvailableSpy.last()[0].toBool());
QVERIFY(metadataChangedSpy.count() > 0);
- QCOMPARE(player.metaData(QMediaMetaData::Title).toString(), QStringLiteral("Nokia Tune"));
- QCOMPARE(player.metaData(QMediaMetaData::ContributingArtist).toString(), QStringLiteral("TestArtist"));
- QCOMPARE(player.metaData(QMediaMetaData::AlbumTitle).toString(), QStringLiteral("TestAlbum"));
+ QCOMPARE(player.metaData().value(QMediaMetaData::Title).toString(), QStringLiteral("Nokia Tune"));
+ QCOMPARE(player.metaData().value(QMediaMetaData::ContributingArtist).toString(), QStringLiteral("TestArtist"));
+ QCOMPARE(player.metaData().value(QMediaMetaData::AlbumTitle).toString(), QStringLiteral("TestAlbum"));
- metadataAvailableSpy.clear();
metadataChangedSpy.clear();
player.setMedia(QUrl());
- QVERIFY(!player.isMetaDataAvailable());
- QCOMPARE(metadataAvailableSpy.count(), 1);
- QVERIFY(!metadataAvailableSpy.last()[0].toBool());
QCOMPARE(metadataChangedSpy.count(), 1);
- QVERIFY(player.availableMetaData().isEmpty());
+ QVERIFY(player.metaData().isEmpty());
}
void tst_QMediaPlayerBackend::playerStateAtEOS()
diff --git a/tests/auto/unit/mockbackend/CMakeLists.txt b/tests/auto/unit/mockbackend/CMakeLists.txt
index a824459a5..34a7d8b13 100644
--- a/tests/auto/unit/mockbackend/CMakeLists.txt
+++ b/tests/auto/unit/mockbackend/CMakeLists.txt
@@ -27,8 +27,6 @@ target_sources(QtMultimediaMockBackend INTERFACE
mockmediaservice.h
mockmediasource.h
mockmediastreamscontrol.h
- mockmetadatareadercontrol.h
- mockmetadatawritercontrol.h
mockvideorenderercontrol.h
mockvideosurface.h
mockvideowindowcontrol.h
diff --git a/tests/auto/unit/mockbackend/capture.pri b/tests/auto/unit/mockbackend/capture.pri
index 9ecaf944d..f9ee0280f 100644
--- a/tests/auto/unit/mockbackend/capture.pri
+++ b/tests/auto/unit/mockbackend/capture.pri
@@ -6,5 +6,4 @@ HEADERS *= \
$$PWD/mockcameraimageprocessingcontrol.h \
$$PWD/mockmediarecordercontrol.h \
$$PWD/mockmediarecorderservice.h \
- $$PWD/mockmetadatawritercontrol.h \
$$PWD/mockvideodeviceselectorcontrol.h \
diff --git a/tests/auto/unit/mockbackend/mockcameraimagecapturecontrol.h b/tests/auto/unit/mockbackend/mockcameraimagecapturecontrol.h
index 6bb49a6bd..e68fd0570 100644
--- a/tests/auto/unit/mockbackend/mockcameraimagecapturecontrol.h
+++ b/tests/auto/unit/mockbackend/mockcameraimagecapturecontrol.h
@@ -92,17 +92,11 @@ private Q_SLOTS:
if (!m_captureCanceled) {
emit imageCaptured(m_captureRequest, QImage());
- emit imageMetadataAvailable(m_captureRequest,
- QMediaMetaData::FocalLengthIn35mmFilm,
- QVariant(50));
+ QMediaMetaData metaData;
+ metaData.insert(QMediaMetaData::Author, QString::fromUtf8("Author"));
+ metaData.insert(QMediaMetaData::Year, 2021);
- emit imageMetadataAvailable(m_captureRequest,
- QMediaMetaData::DateTimeOriginal,
- QVariant(QDateTime::currentDateTime()));
-
- emit imageMetadataAvailable(m_captureRequest,
- QLatin1String("Answer to the Ultimate Question of Life, the Universe, and Everything"),
- QVariant(42));
+ emit imageMetadataAvailable(m_captureRequest, metaData);
}
if (!m_ready)
diff --git a/tests/auto/unit/mockbackend/mockmediaplayerservice.h b/tests/auto/unit/mockbackend/mockmediaplayerservice.h
index e1f30cc16..67c7f838a 100644
--- a/tests/auto/unit/mockbackend/mockmediaplayerservice.h
+++ b/tests/auto/unit/mockbackend/mockmediaplayerservice.h
@@ -35,7 +35,6 @@
#include "mockmediastreamscontrol.h"
#include "mockvideorenderercontrol.h"
#include "mockvideowindowcontrol.h"
-#include "mockmetadatareadercontrol.h"
class MockMediaPlayerService : public QMediaPlatformPlayerInterface
{
@@ -49,7 +48,6 @@ public:
rendererControl = new MockVideoRendererControl;
rendererRef = 0;
windowControl = new MockVideoWindowControl;
- metaDataControl = new MockMetaDataReaderControl;
windowRef = 0;
}
@@ -76,8 +74,6 @@ public:
return windowControl;
}
}
- if (qstrcmp(iid, QMetaDataReaderControl_iid) == 0)
- return metaDataControl;
return 0;
}
@@ -91,7 +87,6 @@ public:
}
MockMediaPlayerControl *player() { return mockControl; }
- QMetaDataReaderControl *dataReader() { return nullptr; } // ###
QMediaStreamsControl *streams() { return nullptr; } // ###
@@ -144,7 +139,6 @@ public:
MockStreamsControl *mockStreamsControl;
MockVideoRendererControl *rendererControl;
MockVideoWindowControl *windowControl;
- MockMetaDataReaderControl *metaDataControl;
int windowRef;
int rendererRef;
};
diff --git a/tests/auto/unit/mockbackend/mockmediarecordercontrol.h b/tests/auto/unit/mockbackend/mockmediarecordercontrol.h
index 7c27861f7..1df4c05b8 100644
--- a/tests/auto/unit/mockbackend/mockmediarecordercontrol.h
+++ b/tests/auto/unit/mockbackend/mockmediarecordercontrol.h
@@ -103,6 +103,12 @@ public:
void setEncoderSettings(const QMediaEncoderSettings &) {}
+ virtual void setMetaData(const QMediaMetaData &m)
+ {
+ m_metaData = m;
+ emit metaDataChanged();
+ }
+ virtual QMediaMetaData metaData() const { return m_metaData; }
using QMediaRecorderControl::error;
@@ -166,6 +172,7 @@ public slots:
}
public:
+ QMediaMetaData m_metaData;
QAudioDeviceInfo m_audioInput;
QUrl m_sink;
QMediaRecorder::State m_state;
diff --git a/tests/auto/unit/mockbackend/mockmediarecorderservice.h b/tests/auto/unit/mockbackend/mockmediarecorderservice.h
index d061aae37..e27a6a8f5 100644
--- a/tests/auto/unit/mockbackend/mockmediarecorderservice.h
+++ b/tests/auto/unit/mockbackend/mockmediarecorderservice.h
@@ -32,7 +32,6 @@
#include "qmediaservice.h"
#include "mockmediarecordercontrol.h"
-#include "mockmetadatawritercontrol.h"
#include "mockcamerafocuscontrol.h"
#include "mockcameraimageprocessingcontrol.h"
#include "mockcameraimagecapturecontrol.h"
@@ -50,7 +49,6 @@ public:
: hasControls(true)
{
mockControl = new MockMediaRecorderControl(this);
- mockMetaDataControl = new MockMetaDataWriterControl(this);
mockCameraControl = new MockCameraControl(this);
mockExposureControl = new MockCameraExposureControl(this);
mockFocusControl = new MockCameraFocusControl(this);
@@ -69,8 +67,6 @@ public:
if (qstrcmp(name,QMediaRecorderControl_iid) == 0)
return mockControl;
- if (qstrcmp(name, QMetaDataWriterControl_iid) == 0)
- return mockMetaDataControl;
if (qstrcmp(name, QCameraControl_iid) == 0)
return mockCameraControl;
@@ -124,7 +120,6 @@ public:
int windowRef;
MockMediaRecorderControl *mockControl;
- MockMetaDataWriterControl *mockMetaDataControl;
bool hasControls;
};
diff --git a/tests/auto/unit/mockbackend/mockmediastreamscontrol.h b/tests/auto/unit/mockbackend/mockmediastreamscontrol.h
index 9242dae06..6c5bc03e6 100644
--- a/tests/auto/unit/mockbackend/mockmediastreamscontrol.h
+++ b/tests/auto/unit/mockbackend/mockmediastreamscontrol.h
@@ -42,9 +42,9 @@ public:
StreamType streamType(int index) { return _streams.at(index).type; }
void setStreamType(int index, StreamType type) { _streams[index].type = type; }
- QVariant metaData(int index, const QString &key) {
- return _streams.at(index).metaData.value(key); }
- void setMetaData(int index, const QString &key, const QVariant &value) {
+ QMediaMetaData metaData(int index) {
+ return _streams.at(index).metaData; }
+ void setMetaData(int index, QMediaMetaData::Key key, const QVariant &value) {
_streams[index].metaData.insert(key, value); }
bool isActive(int index) { return _streams.at(index).active; }
@@ -55,7 +55,7 @@ private:
{
Stream() : type(UnknownStream), active(false) {}
StreamType type;
- QMap<QString, QVariant> metaData;
+ QMediaMetaData metaData;
bool active;
};
diff --git a/tests/auto/unit/mockbackend/mockmetadatareadercontrol.h b/tests/auto/unit/mockbackend/mockmetadatareadercontrol.h
deleted file mode 100644
index 74352ab06..000000000
--- a/tests/auto/unit/mockbackend/mockmetadatareadercontrol.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef MOCKMETADATAREADERCONTROL_H
-#define MOCKMETADATAREADERCONTROL_H
-
-#include "qmetadatareadercontrol.h"
-#include <qmap.h>
-#include <qvariant.h>
-
-class MockMetaDataReaderControl : public QMetaDataReaderControl
-{
- Q_OBJECT
-public:
- MockMetaDataReaderControl(QObject *parent = 0)
- : QMetaDataReaderControl(parent)
- , m_available(false)
- {
- }
-
- bool isMetaDataAvailable() const
- {
- return m_available;
- }
- void setMetaDataAvailable(bool available)
- {
- if (m_available != available)
- emit metaDataAvailableChanged(m_available = available);
- }
- QStringList availableMetaData() const
- {
- return m_data.keys();
- }
-
- QVariant metaData(const QString &key) const
- {
- return m_data.value(key);
- }
-
- void setMetaData(const QString &key, const QVariant &value)
- {
- if (m_data[key] != value) {
- if (value.isNull())
- m_data.remove(key);
- else
- m_data[key] = value;
-
- emit metaDataChanged(key, value);
- emit metaDataChanged();
- }
- }
-
- using QMetaDataReaderControl::metaDataChanged;
-
- void populateMetaData()
- {
- m_available = true;
- }
-
- bool m_available;
- QMap<QString, QVariant> m_data;
-};
-
-#endif // MOCKMETADATAREADERCONTROL_H
diff --git a/tests/auto/unit/mockbackend/mockmetadatawritercontrol.h b/tests/auto/unit/mockbackend/mockmetadatawritercontrol.h
deleted file mode 100644
index c8cda292e..000000000
--- a/tests/auto/unit/mockbackend/mockmetadatawritercontrol.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef MOCKMETADATAWRITERCONTROL_H
-#define MOCKMETADATAWRITERCONTROL_H
-
-#include <QObject>
-#include <QMap>
-#include <qvariant.h>
-
-#include "qmetadatawritercontrol.h"
-
-class MockMetaDataWriterControl : public QMetaDataWriterControl
-{
- Q_OBJECT
-public:
- MockMetaDataWriterControl(QObject *parent = 0)
- : QMetaDataWriterControl(parent)
- , m_available(false)
- , m_writable(false)
- {
- }
-
- bool isMetaDataAvailable() const { return m_available; }
- void setMetaDataAvailable(bool available)
- {
- if (m_available != available)
- emit metaDataAvailableChanged(m_available = available);
- }
- QStringList availableMetaData() const { return m_data.keys(); }
-
- bool isWritable() const { return m_writable; }
- void setWritable(bool writable) { emit writableChanged(m_writable = writable); }
-
- QVariant metaData(const QString &key) const { return m_data.value(key); }//Getting the metadata from Multimediakit
- void setMetaData(const QString &key, const QVariant &value)
- {
- if (m_data[key] != value) {
- if (value.isNull())
- m_data.remove(key);
- else
- m_data[key] = value;
-
- emit metaDataChanged(key, value);
- emit metaDataChanged();
- }
- }
-
- using QMetaDataWriterControl::metaDataChanged;
-
- void populateMetaData()
- {
- m_available = true;
- }
- void setWritable()
- {
- emit writableChanged(true);
- }
- void setMetaDataAvailable()
- {
- emit metaDataAvailableChanged(true);
- }
-
- bool m_available;
- bool m_writable;
- QMap<QString, QVariant> m_data;
-};
-
-#endif // MOCKMETADATAWRITERCONTROL_H
diff --git a/tests/auto/unit/mockbackend/player.pri b/tests/auto/unit/mockbackend/player.pri
index ec8e41c97..3d1c21343 100644
--- a/tests/auto/unit/mockbackend/player.pri
+++ b/tests/auto/unit/mockbackend/player.pri
@@ -3,5 +3,4 @@ HEADERS += \
$$PWD/mockmediaplayercontrol.h \
$$PWD/mockmediaplayerservice.h \
$$PWD/mockmediastreamscontrol.h \
- $$PWD/mockmetadatareadercontrol.h \
diff --git a/tests/auto/unit/multimedia/CMakeLists.txt b/tests/auto/unit/multimedia/CMakeLists.txt
index 37ebc2b86..dadc0108a 100644
--- a/tests/auto/unit/multimedia/CMakeLists.txt
+++ b/tests/auto/unit/multimedia/CMakeLists.txt
@@ -16,8 +16,6 @@ add_subdirectory(qmediapluginloader)
add_subdirectory(qmediarecorder)
add_subdirectory(qmediaservice)
add_subdirectory(qmediatimerange)
-add_subdirectory(qmetadatareadercontrol)
-add_subdirectory(qmetadatawritercontrol)
add_subdirectory(qvideoframe)
add_subdirectory(qvideosurfaceformat)
add_subdirectory(qaudiobuffer)
diff --git a/tests/auto/unit/multimedia/multimedia.pro b/tests/auto/unit/multimedia/multimedia.pro
index d1be5e850..9c24c6a7d 100644
--- a/tests/auto/unit/multimedia/multimedia.pro
+++ b/tests/auto/unit/multimedia/multimedia.pro
@@ -17,8 +17,6 @@ SUBDIRS += \
qmediarecorder \
qmediaservice \
qmediatimerange \
- qmetadatareadercontrol \
- qmetadatawritercontrol \
qvideoframe \
qvideosurfaceformat \
# qwavedecoder \
diff --git a/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp b/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp
index 5d22e4432..4d3d6ab98 100644
--- a/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp
+++ b/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp
@@ -351,7 +351,7 @@ void tst_QCamera::testCameraCaptureMetadata()
QCamera camera;
QCameraImageCapture imageCapture(&camera);
- QSignalSpy metadataSignal(&imageCapture, SIGNAL(imageMetadataAvailable(int,QString,QVariant)));
+ QSignalSpy metadataSignal(&imageCapture, SIGNAL(imageMetadataAvailable(int,const QMediaMetaData&)));
QSignalSpy savedSignal(&imageCapture, SIGNAL(imageSaved(int,QString)));
camera.start();
@@ -359,24 +359,14 @@ void tst_QCamera::testCameraCaptureMetadata()
QTRY_COMPARE(savedSignal.size(), 1);
- QCOMPARE(metadataSignal.size(), 3);
+ QCOMPARE(metadataSignal.size(), 1);
QVariantList metadata = metadataSignal[0];
QCOMPARE(metadata[0].toInt(), id);
- QCOMPARE(metadata[1].toString(), QMediaMetaData::FocalLengthIn35mmFilm);
- QCOMPARE(metadata[2].value<QVariant>().toInt(), 50);
-
- metadata = metadataSignal[1];
- QCOMPARE(metadata[0].toInt(), id);
- QCOMPARE(metadata[1].toString(), QMediaMetaData::DateTimeOriginal);
- QDateTime captureTime = metadata[2].value<QVariant>().value<QDateTime>();
- const qint64 dt = captureTime.secsTo(QDateTime::currentDateTime());
- QVERIFY2(qAbs(dt) < 5, QByteArray::number(dt).constData()); // it should not take more than 5 seconds for signal to arrive here
-
- metadata = metadataSignal[2];
- QCOMPARE(metadata[0].toInt(), id);
- QCOMPARE(metadata[1].toString(), QLatin1String("Answer to the Ultimate Question of Life, the Universe, and Everything"));
- QCOMPARE(metadata[2].value<QVariant>().toInt(), 42);
+ QMediaMetaData data = metadata[1].value<QMediaMetaData>();
+ QCOMPARE(data.keys().length(), 2);
+ QCOMPARE(data[QMediaMetaData::Author].toString(), "Author");
+ QCOMPARE(data[QMediaMetaData::Year].toInt(), 2021);
}
diff --git a/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp
index baf1dd9a4..f8c2258d0 100644
--- a/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp
+++ b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp
@@ -36,7 +36,6 @@
#include <qmediaservice.h>
#include <qmediarecordercontrol.h>
#include <qmediarecorder.h>
-#include <qmetadatawritercontrol.h>
#include <qaudioformat.h>
#include <qmockintegration_p.h>
@@ -69,14 +68,7 @@ private slots:
void testVideoSettings();
void testSettingsApplied();
- void nullMetaDataControl();
- void isMetaDataAvailable();
- void isWritable();
- void metaDataChanged();
- void metaData_data();
void metaData();
- void setMetaData_data();
- void setMetaData();
void testAudioSettingsCopyConstructor();
void testAudioSettingsOperatorNotEqual();
@@ -730,114 +722,6 @@ void tst_QMediaRecorder::testSettingsApplied()
// QCOMPARE(mock->m_settingAppliedCount, 3);
}
-void tst_QMediaRecorder::nullMetaDataControl()
-{
- const QString titleKey(QLatin1String("Title"));
- const QString title(QLatin1String("Host of Seraphim"));
-
- MockMediaSource object(nullptr, service);
- QMediaRecorder recorder(&object);
- service->hasControls = false;
-
- QSignalSpy spy(&recorder, SIGNAL(metaDataChanged()));
-
- QCOMPARE(recorder.isMetaDataAvailable(), false);
- QCOMPARE(recorder.isMetaDataWritable(), false);
-
- recorder.setMetaData(QMediaMetaData::Title, title);
-
- QCOMPARE(recorder.metaData(QMediaMetaData::Title).toString(), QString());
- QCOMPARE(recorder.availableMetaData(), QStringList());
- QCOMPARE(spy.count(), 0);
-}
-
-void tst_QMediaRecorder::isMetaDataAvailable()
-{
- service->mockMetaDataControl->setMetaDataAvailable(false);
- MockMediaSource object(nullptr, service);
-
- QMediaRecorder recorder(&object);
- QCOMPARE(recorder.isMetaDataAvailable(), false);
-
- QSignalSpy spy(&recorder, SIGNAL(metaDataAvailableChanged(bool)));
- service->mockMetaDataControl->setMetaDataAvailable(true);
-
- QCOMPARE(recorder.isMetaDataAvailable(), true);
- QCOMPARE(spy.count(), 1);
- QCOMPARE(spy.at(0).at(0).toBool(), true);
-
- service->mockMetaDataControl->setMetaDataAvailable(false);
-
- QCOMPARE(recorder.isMetaDataAvailable(), false);
- QCOMPARE(spy.count(), 2);
- QCOMPARE(spy.at(1).at(0).toBool(), false);
-}
-
-void tst_QMediaRecorder::isWritable()
-{
- service->mockMetaDataControl->setWritable(false);
-
- MockMediaSource object(nullptr, service);
-
- QMediaRecorder recorder(&object);
-
- QSignalSpy spy(&recorder, SIGNAL(metaDataWritableChanged(bool)));
-
- QCOMPARE(recorder.isMetaDataWritable(), false);
-
- service->mockMetaDataControl->setWritable(true);
-
- QCOMPARE(recorder.isMetaDataWritable(), true);
- QCOMPARE(spy.count(), 1);
- QCOMPARE(spy.at(0).at(0).toBool(), true);
-
- service->mockMetaDataControl->setWritable(false);
-
- QCOMPARE(recorder.isMetaDataWritable(), false);
- QCOMPARE(spy.count(), 2);
- QCOMPARE(spy.at(1).at(0).toBool(), false);
-}
-
-void tst_QMediaRecorder::metaDataChanged()
-{
- MockMediaSource object(nullptr, service);
-
- QMediaRecorder recorder(&object);
-
- QSignalSpy changedSpy(&recorder, SIGNAL(metaDataChanged()));
- QSignalSpy changedWithValueSpy(&recorder, SIGNAL(metaDataChanged(QString,QVariant)));
-
- service->mockMetaDataControl->setMetaData("key", "Value");
- QCOMPARE(changedSpy.count(), 1);
- QCOMPARE(changedWithValueSpy.count(), 1);
- QCOMPARE(changedWithValueSpy.last()[0], QVariant("key"));
- QCOMPARE(changedWithValueSpy.last()[1].value<QVariant>(), QVariant("Value"));
-
- service->mockMetaDataControl->setMetaData("key", "Value");
- QCOMPARE(changedSpy.count(), 1);
- QCOMPARE(changedWithValueSpy.count(), 1);
-
- service->mockMetaDataControl->setMetaData("key2", "Value");
- QCOMPARE(changedSpy.count(), 2);
- QCOMPARE(changedWithValueSpy.count(), 2);
- QCOMPARE(changedWithValueSpy.last()[0], QVariant("key2"));
- QCOMPARE(changedWithValueSpy.last()[1].value<QVariant>(), QVariant("Value"));
-}
-
-void tst_QMediaRecorder::metaData_data()
-{
- QTest::addColumn<QString>("artist");
- QTest::addColumn<QString>("title");
- QTest::addColumn<QString>("genre");
- QTest::addColumn<QString>("custom");
-
- QTest::newRow("")
- << QString::fromLatin1("Dead Can Dance")
- << QString::fromLatin1("Host of Seraphim")
- << QString::fromLatin1("Awesome")
- << QString::fromLatin1("Something else");
-}
-
void tst_QMediaRecorder::metaData()
{
QFETCH(QString, artist);
@@ -845,50 +729,16 @@ void tst_QMediaRecorder::metaData()
QFETCH(QString, genre);
QFETCH(QString, custom);
- service->mockMetaDataControl->populateMetaData();
-
MockMediaSource object(nullptr, service);
QMediaRecorder recorder(&object);
- QVERIFY(object.availableMetaData().isEmpty());
-
- service->mockMetaDataControl->m_data.insert(QMediaMetaData::AlbumArtist, artist);
- service->mockMetaDataControl->m_data.insert(QMediaMetaData::Title, title);
- service->mockMetaDataControl->m_data.insert(QMediaMetaData::Genre, genre);
- service->mockMetaDataControl->m_data.insert(QLatin1String("CustomEntry"), custom );
-
- QCOMPARE(recorder.metaData(QMediaMetaData::AlbumArtist).toString(), artist);
- QCOMPARE(recorder.metaData(QMediaMetaData::Title).toString(), title);
-
- QStringList metaDataKeys = recorder.availableMetaData();
- QCOMPARE(metaDataKeys.size(), 4);
- QVERIFY(metaDataKeys.contains(QMediaMetaData::AlbumArtist));
- QVERIFY(metaDataKeys.contains(QMediaMetaData::Title));
- QVERIFY(metaDataKeys.contains(QMediaMetaData::Genre));
- QVERIFY(metaDataKeys.contains(QLatin1String("CustomEntry")));
-}
-
-void tst_QMediaRecorder::setMetaData_data()
-{
- QTest::addColumn<QString>("title");
-
- QTest::newRow("")
- << QString::fromLatin1("In the Kingdom of the Blind the One eyed are Kings");
-}
+ QVERIFY(object.metaData().isEmpty());
-void tst_QMediaRecorder::setMetaData()
-{
- QFETCH(QString, title);
-
- service->mockMetaDataControl->populateMetaData();
-
- MockMediaSource object(nullptr, service);
-
- QMediaRecorder recorder(&object);
+ QMediaMetaData data;
+ data.insert(QMediaMetaData::Author, QString::fromUtf8("John Doe"));
+ recorder.setMetaData(data);
- recorder.setMetaData(QMediaMetaData::Title, title);
- QCOMPARE(recorder.metaData(QMediaMetaData::Title).toString(), title);
- QCOMPARE(service->mockMetaDataControl->m_data.value(QMediaMetaData::Title).toString(), title);
+ QCOMPARE(recorder.metaData().value(QMediaMetaData::Author).toString(), QString::fromUtf8("John Doe"));
}
void tst_QMediaRecorder::testAudioSettingsCopyConstructor()
@@ -1037,7 +887,6 @@ void tst_QMediaRecorder::testAvailabilityStatus()
{
mockIntegration->createCaptureInterface(QMediaRecorder::AudioAndVideo);
auto *service1 = mockIntegration->lastCaptureService();
- service1->mockMetaDataControl->populateMetaData();
MockMediaSource object1(nullptr, service1);
QMediaRecorder recorder1(&object1);
QCOMPARE(recorder1.availability(), QMultimedia::Available);
@@ -1046,7 +895,6 @@ void tst_QMediaRecorder::testAvailabilityStatus()
{
mockIntegration->createCaptureInterface(QMediaRecorder::AudioAndVideo);
auto *service1 = mockIntegration->lastCaptureService();
- service1->mockMetaDataControl->populateMetaData();
MockMediaSource object1(nullptr, service1);
QMediaRecorder recorder1(&object1);
@@ -1064,7 +912,6 @@ void tst_QMediaRecorder::testIsAvailable()
mockIntegration->createCaptureInterface(QMediaRecorder::AudioAndVideo);
auto *service1 = mockIntegration->lastCaptureService();
- service1->mockMetaDataControl->populateMetaData();
MockMediaSource object1(nullptr, service1);
QMediaRecorder recorder1(&object1);
QCOMPARE(recorder1.isAvailable(), true);
diff --git a/tests/auto/unit/multimedia/qmediasink/tst_qmediasink.cpp b/tests/auto/unit/multimedia/qmediasink/tst_qmediasink.cpp
index 00cf54be9..140bddccd 100644
--- a/tests/auto/unit/multimedia/qmediasink/tst_qmediasink.cpp
+++ b/tests/auto/unit/multimedia/qmediasink/tst_qmediasink.cpp
@@ -34,10 +34,8 @@
#include <qmediaservice.h>
#include <qmediarecordercontrol.h>
#include <qmediarecorder.h>
-#include <qmetadatawritercontrol.h>
#include <qaudioformat.h>
-#include "mockmetadatawritercontrol.h"
#include "mockmediarecordercontrol.h"
#include "mockmediasource.h"
@@ -52,15 +50,12 @@ public:
mockControl(control),
hasControls(true)
{
- mockMetaDataControl = new MockMetaDataWriterControl(parent); //Creating the object for MetaData
}
QObject *requestControl(const char *name) override
{
if (hasControls && qstrcmp(name,QMediaRecorderControl_iid) == 0)
return mockControl;
- if (hasControls && qstrcmp(name, QMetaDataWriterControl_iid) == 0)
- return mockMetaDataControl;
return nullptr;
}
@@ -68,7 +63,6 @@ public:
void releaseControl(QObject *) override {}
//Initialising the objects for the media
QObject *mockControl;
- MockMetaDataWriterControl *mockMetaDataControl;
bool hasControls;
};
@@ -90,7 +84,6 @@ private slots:
{
MockMediaRecorderControl recorderControl(nullptr);
TestBindableService service(nullptr, &recorderControl);
- service.mockMetaDataControl->populateMetaData();
MockMediaSource object(nullptr, &service);
QMediaRecorder recorder(&object);
QMediaSource *obj = recorder.mediaSource();
@@ -102,7 +95,6 @@ private slots:
{
MockMediaRecorderControl recorderControl(nullptr);
TestBindableService service(nullptr, &recorderControl);
- service.mockMetaDataControl->populateMetaData();
MockMediaSource object(nullptr, &service);
QMediaRecorder *recorder = new QMediaRecorder(&object);
QVERIFY(recorder->isAvailable());
diff --git a/tests/auto/unit/multimedia/qmediasource/tst_qmediasource.cpp b/tests/auto/unit/multimedia/qmediasource/tst_qmediasource.cpp
index 217b50c09..fb581acfa 100644
--- a/tests/auto/unit/multimedia/qmediasource/tst_qmediasource.cpp
+++ b/tests/auto/unit/multimedia/qmediasource/tst_qmediasource.cpp
@@ -35,10 +35,8 @@
#include <QtMultimedia/qmediametadata.h>
#include <qmediasource.h>
#include <qmediaservice.h>
-#include <qmetadatareadercontrol.h>
#include "mockmediarecorderservice.h"
-#include "mockmetadatareadercontrol.h"
class QtTestMediaObjectService : public QMediaService
{
@@ -49,21 +47,14 @@ public:
{
}
- QObject *requestControl(const char *iid) override
+ QObject *requestControl(const char *) override
{
- if (hasMetaData && qstrcmp(iid, QMetaDataReaderControl_iid) == 0)
- return &metaData;
-
return nullptr;
}
void releaseControl(QObject *) override
{
}
-
- MockMetaDataReaderControl metaData;
- int metaDataRef = 0;
- bool hasMetaData = true;
};
QT_USE_NAMESPACE
@@ -79,11 +70,6 @@ private slots:
void notifyInterval_data();
void notifyInterval();
- void nullMetaDataControl();
- void isMetaDataAvailable();
- void metaDataChanged();
- void metaData_data();
- void metaData();
void availability();
void service();
@@ -312,110 +298,6 @@ void tst_QMediaSource::notifyInterval()
QCOMPARE(spy.count(), 1);
}
-void tst_QMediaSource::nullMetaDataControl()
-{
- const QString titleKey(QLatin1String("Title"));
- const QString title(QLatin1String("Host of Seraphim"));
-
- QtTestMediaObjectService service;
- service.hasMetaData = false;
-
- QtTestMediaObject object(&service);
-
- QSignalSpy spy(&object, SIGNAL(metaDataChanged()));
-
- QCOMPARE(object.isMetaDataAvailable(), false);
-
- QCOMPARE(object.metaData(QMediaMetaData::Title).toString(), QString());
- QCOMPARE(object.availableMetaData(), QStringList());
- QCOMPARE(spy.count(), 0);
-}
-
-void tst_QMediaSource::isMetaDataAvailable()
-{
- QtTestMediaObjectService service;
- service.metaData.setMetaDataAvailable(false);
-
- QtTestMediaObject object(&service);
- QCOMPARE(object.isMetaDataAvailable(), false);
-
- QSignalSpy spy(&object, SIGNAL(metaDataAvailableChanged(bool)));
- service.metaData.setMetaDataAvailable(true);
-
- QCOMPARE(object.isMetaDataAvailable(), true);
- QCOMPARE(spy.count(), 1);
- QCOMPARE(spy.at(0).at(0).toBool(), true);
-
- service.metaData.setMetaDataAvailable(false);
-
- QCOMPARE(object.isMetaDataAvailable(), false);
- QCOMPARE(spy.count(), 2);
- QCOMPARE(spy.at(1).at(0).toBool(), false);
-}
-
-void tst_QMediaSource::metaDataChanged()
-{
- QtTestMediaObjectService service;
- QtTestMediaObject object(&service);
-
- QSignalSpy changedSpy(&object, SIGNAL(metaDataChanged()));
- QSignalSpy changedWithValueSpy(&object, SIGNAL(metaDataChanged(QString,QVariant)));
-
- service.metaData.setMetaData("key", "Value");
- QCOMPARE(changedSpy.count(), 1);
- QCOMPARE(changedWithValueSpy.count(), 1);
- QCOMPARE(changedWithValueSpy.last()[0], QVariant("key"));
- QCOMPARE(changedWithValueSpy.last()[1].value<QVariant>(), QVariant("Value"));
-
- service.metaData.setMetaData("key", "Value");
- QCOMPARE(changedSpy.count(), 1);
- QCOMPARE(changedWithValueSpy.count(), 1);
-
- service.metaData.setMetaData("key2", "Value");
- QCOMPARE(changedSpy.count(), 2);
- QCOMPARE(changedWithValueSpy.count(), 2);
- QCOMPARE(changedWithValueSpy.last()[0], QVariant("key2"));
- QCOMPARE(changedWithValueSpy.last()[1].value<QVariant>(), QVariant("Value"));
-}
-
-void tst_QMediaSource::metaData_data()
-{
- QTest::addColumn<QString>("artist");
- QTest::addColumn<QString>("title");
- QTest::addColumn<QString>("genre");
-
- QTest::newRow("")
- << QString::fromLatin1("Dead Can Dance")
- << QString::fromLatin1("Host of Seraphim")
- << QString::fromLatin1("Awesome");
-}
-
-void tst_QMediaSource::metaData()
-{
- QFETCH(QString, artist);
- QFETCH(QString, title);
- QFETCH(QString, genre);
-
- QtTestMediaObjectService service;
- service.metaData.populateMetaData();
-
- QtTestMediaObject object(&service);
- QVERIFY(object.availableMetaData().isEmpty());
-
- service.metaData.m_data.insert(QMediaMetaData::AlbumArtist, artist);
- service.metaData.m_data.insert(QMediaMetaData::Title, title);
- service.metaData.m_data.insert(QMediaMetaData::Genre, genre);
-
- QCOMPARE(object.metaData(QMediaMetaData::AlbumArtist).toString(), artist);
- QCOMPARE(object.metaData(QMediaMetaData::Title).toString(), title);
-
- QStringList metaDataKeys = object.availableMetaData();
- QCOMPARE(metaDataKeys.size(), 3);
- QVERIFY(metaDataKeys.contains(QMediaMetaData::AlbumArtist));
- QVERIFY(metaDataKeys.contains(QMediaMetaData::Title));
- QVERIFY(metaDataKeys.contains(QMediaMetaData::Genre));
-}
-
void tst_QMediaSource::availability()
{
{
diff --git a/tests/auto/unit/multimedia/qmetadatareadercontrol/CMakeLists.txt b/tests/auto/unit/multimedia/qmetadatareadercontrol/CMakeLists.txt
deleted file mode 100644
index 6da45c630..000000000
--- a/tests/auto/unit/multimedia/qmetadatareadercontrol/CMakeLists.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-# Generated from qmetadatareadercontrol.pro.
-
-#####################################################################
-## tst_qmetadatareadercontrol Test:
-#####################################################################
-
-qt_add_test(tst_qmetadatareadercontrol
- SOURCES
- tst_qmetadatareadercontrol.cpp
- INCLUDE_DIRECTORIES
- ../../mockbackend
- PUBLIC_LIBRARIES
- # Remove: L${CMAKE_CURRENT_SOURCE_DIR}
- Qt::Gui
- Qt::MultimediaPrivate
- QtMultimediaMockBackend
-)
diff --git a/tests/auto/unit/multimedia/qmetadatareadercontrol/qmetadatareadercontrol.pro b/tests/auto/unit/multimedia/qmetadatareadercontrol/qmetadatareadercontrol.pro
deleted file mode 100644
index a8aec770d..000000000
--- a/tests/auto/unit/multimedia/qmetadatareadercontrol/qmetadatareadercontrol.pro
+++ /dev/null
@@ -1,9 +0,0 @@
-CONFIG += testcase
-TARGET = tst_qmetadatareadercontrol
-
-QT += multimedia-private testlib
-
-SOURCES += tst_qmetadatareadercontrol.cpp
-
-include (../../mockbackend/mockbackend.pri)
-
diff --git a/tests/auto/unit/multimedia/qmetadatareadercontrol/tst_qmetadatareadercontrol.cpp b/tests/auto/unit/multimedia/qmetadatareadercontrol/tst_qmetadatareadercontrol.cpp
deleted file mode 100644
index 3e14dc3c7..000000000
--- a/tests/auto/unit/multimedia/qmetadatareadercontrol/tst_qmetadatareadercontrol.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#include <QtCore/QString>
-#include <QtTest/QtTest>
-#include <QtCore/QCoreApplication>
-#include <QtMultimedia/qmediametadata.h>
-
-#include "mockmetadatareadercontrol.h"
-
-class tst_QMetaDataReaderControl : public QObject
-{
- Q_OBJECT
-
-private slots:
- // Test case for QMetaDataReaderControl
- void metaDataReaderControlConstructor();
- void metaDataReaderControlAvailableMetaData();
- void metaDataReaderControlIsMetaDataAvailable();
- void metaDataReaderControlMetaData();
- void metaDataReaderControlMetaDataAvailableChangedSignal();
- void metaDataReaderControlMetaDataChangedSignal();
-};
-
-QTEST_MAIN(tst_QMetaDataReaderControl);
-
-/* Test case for constructor. */
-void tst_QMetaDataReaderControl::metaDataReaderControlConstructor()
-{
- MockMetaDataReaderControl *metaData = new MockMetaDataReaderControl();
- QVERIFY(metaData !=nullptr);
- delete metaData;
-}
-
-/* Test case for availableMetaData() */
-void tst_QMetaDataReaderControl::metaDataReaderControlAvailableMetaData()
-{
- MockMetaDataReaderControl *metaData = new MockMetaDataReaderControl();
- QVERIFY(metaData !=nullptr);
- metaData->availableMetaData() ;
- delete metaData;
-}
-
-/* Test case for availableMetaData */
-void tst_QMetaDataReaderControl::metaDataReaderControlIsMetaDataAvailable ()
-{
- MockMetaDataReaderControl *metaData = new MockMetaDataReaderControl();
- QVERIFY(metaData !=nullptr);
- metaData->availableMetaData();
- delete metaData;
-}
-
-/* Test case for metaData */
-void tst_QMetaDataReaderControl::metaDataReaderControlMetaData ()
-{
- MockMetaDataReaderControl *metaData = new MockMetaDataReaderControl();
- QVERIFY(metaData !=nullptr);
- metaData->metaData(QMediaMetaData::Title);
- delete metaData;
-}
-
-/* Test case for signal metaDataAvailableChanged */
-void tst_QMetaDataReaderControl::metaDataReaderControlMetaDataAvailableChangedSignal ()
-{
- MockMetaDataReaderControl *metaData = new MockMetaDataReaderControl();
- QVERIFY(metaData !=nullptr);
- QSignalSpy spy(metaData,SIGNAL(metaDataAvailableChanged(bool)));
- metaData->setMetaDataAvailable(true);
- QVERIFY(spy.count() == 1);
- delete metaData;
-}
-
- /* Test case for signal metaDataChanged */
-void tst_QMetaDataReaderControl::metaDataReaderControlMetaDataChangedSignal ()
-{
- MockMetaDataReaderControl *metaData = new MockMetaDataReaderControl();
- QVERIFY(metaData !=nullptr);
- QSignalSpy spy(metaData,SIGNAL(metaDataChanged()));
- metaData->metaDataChanged();
- QVERIFY(spy.count () == 1);
- delete metaData;
-}
-
-#include "tst_qmetadatareadercontrol.moc"
-
-
diff --git a/tests/auto/unit/multimedia/qmetadatawritercontrol/CMakeLists.txt b/tests/auto/unit/multimedia/qmetadatawritercontrol/CMakeLists.txt
deleted file mode 100644
index b2cbf18a9..000000000
--- a/tests/auto/unit/multimedia/qmetadatawritercontrol/CMakeLists.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-# Generated from qmetadatawritercontrol.pro.
-
-#####################################################################
-## tst_qmetadatawritercontrol Test:
-#####################################################################
-
-qt_add_test(tst_qmetadatawritercontrol
- SOURCES
- tst_qmetadatawritercontrol.cpp
- INCLUDE_DIRECTORIES
- ../../mockbackend
- PUBLIC_LIBRARIES
- # Remove: L${CMAKE_CURRENT_SOURCE_DIR}
- Qt::Gui
- Qt::MultimediaPrivate
- QtMultimediaMockBackend
-)
diff --git a/tests/auto/unit/multimedia/qmetadatawritercontrol/qmetadatawritercontrol.pro b/tests/auto/unit/multimedia/qmetadatawritercontrol/qmetadatawritercontrol.pro
deleted file mode 100644
index 68fe77c95..000000000
--- a/tests/auto/unit/multimedia/qmetadatawritercontrol/qmetadatawritercontrol.pro
+++ /dev/null
@@ -1,8 +0,0 @@
-CONFIG += testcase
-TARGET = tst_qmetadatawritercontrol
-
-QT += multimedia-private testlib
-
-SOURCES += tst_qmetadatawritercontrol.cpp
-
-include (../../mockbackend/mockbackend.pri)
diff --git a/tests/auto/unit/multimedia/qmetadatawritercontrol/tst_qmetadatawritercontrol.cpp b/tests/auto/unit/multimedia/qmetadatawritercontrol/tst_qmetadatawritercontrol.cpp
deleted file mode 100644
index f8ceb694c..000000000
--- a/tests/auto/unit/multimedia/qmetadatawritercontrol/tst_qmetadatawritercontrol.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#include <QtCore/QString>
-#include <QtTest/QtTest>
-#include <QtCore/QCoreApplication>
-#include <QtMultimedia/qmediametadata.h>
-#include "qmetadatawritercontrol.h"
-
-#include "mockmetadatawritercontrol.h"
-
-class tst_QMetaDataWriterControl: public QObject
-{
- Q_OBJECT
-
-public slots:
- void initTestCase();
- void cleanupTestCase();
-
-private slots:
- void constructor();
-};
-
-void tst_QMetaDataWriterControl::initTestCase()
-{
-
-}
-
-void tst_QMetaDataWriterControl::cleanupTestCase()
-{
-
-}
-
-//MaemoAPI-1862:test constructor
-void tst_QMetaDataWriterControl::constructor()
-{
- QMetaDataWriterControl *mock = new MockMetaDataWriterControl();
- mock->availableMetaData();
- mock->isMetaDataAvailable();
- mock->isWritable();
- mock->metaData(QMediaMetaData::Title);
- mock->setMetaData(QMediaMetaData::Title, QVariant());
- ((MockMetaDataWriterControl*)mock)->setWritable();
- ((MockMetaDataWriterControl*)mock)->setMetaDataAvailable();
- delete mock;
-}
-
-QTEST_MAIN(tst_QMetaDataWriterControl);
-
-#include "tst_qmetadatawritercontrol.moc"
diff --git a/tests/auto/unit/qml/qdeclarativeaudio/tst_qdeclarativeaudio.cpp b/tests/auto/unit/qml/qdeclarativeaudio/tst_qdeclarativeaudio.cpp
index 1ceedd009..24e53712c 100644
--- a/tests/auto/unit/qml/qdeclarativeaudio/tst_qdeclarativeaudio.cpp
+++ b/tests/auto/unit/qml/qdeclarativeaudio/tst_qdeclarativeaudio.cpp
@@ -34,14 +34,12 @@
#include "qdeclarativemediametadata_p.h"
#include "mockmediaplayerservice.h"
-#include "mockmetadatareadercontrol.h"
#include "qmockintegration_p.h"
#include <QtMultimedia/qmediametadata.h>
#include <qmediaplayercontrol.h>
#include <qmediaservice.h>
#include <private/qdeclarativevideooutput_p.h>
-#include <qmetadatareadercontrol.h>
#include <QAbstractVideoSurface>
#include <QtGui/qguiapplication.h>
@@ -626,12 +624,7 @@ void tst_QDeclarativeAudio::metaData()
property.write(audio.metaData(), value);
QCOMPARE(property.read(audio.metaData()), QVariant());
- QCOMPARE(service->metaDataControl->metaData(propertyKey), QVariant());
QCOMPARE(spy.count(), 0);
-
- service->metaDataControl->setMetaData(propertyKey, value);
- QCOMPARE(property.read(audio.metaData()), value);
- QCOMPARE(spy.count(), 1);
}
void tst_QDeclarativeAudio::error()