summaryrefslogtreecommitdiffstats
path: root/src/multimedia/platform/gstreamer/mediacapture
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-02-09 12:55:32 +0100
committerLars Knoll <lars.knoll@qt.io>2021-02-12 15:38:47 +0000
commit187419edb2c087063afc5931134d36692f4b39a4 (patch)
tree88d9117e2c6475f8c32d83b2ee09f27b2dba60a9 /src/multimedia/platform/gstreamer/mediacapture
parent3c59ba2b3ce96f578b2d677ecc1fbf7da0b2e27f (diff)
Rework the metadata handling
Get rid of metadata reader and writer controls. Instead use a simple cross platform value class to store meta data. The backend can then convert to and from whatever the native API expects. Change-Id: I7cf84bfbe8eef2a88615a52ba5afeec50a0652c8 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/multimedia/platform/gstreamer/mediacapture')
-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
8 files changed, 15 insertions, 268 deletions
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;