summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-02-08 15:14:22 +0100
committerLars Knoll <lars.knoll@qt.io>2021-02-09 19:04:58 +0000
commitb6d6576089126d54998248bfe197d058c2be0d98 (patch)
tree423f87995f081b0f328395c8b807018ce405bc4a
parentf580a0f609bed24073fb7340c212a67c44f0c51d (diff)
Don't use the service to get the metadatawritercontrol
Instead, ask the media recorder control for it. Change-Id: I1cf47af00dc29a282bce7767ce15ef203c44c585 Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Doris Verria <doris.verria@qt.io>
-rw-r--r--src/multimedia/CMakeLists.txt1
-rw-r--r--src/multimedia/controls/qmediarecordercontrol.h3
-rw-r--r--src/multimedia/platform/darwin/camera/avfcamerametadatacontrol.mm6
-rw-r--r--src/multimedia/platform/darwin/camera/avfcamerametadatacontrol_p.h4
-rw-r--r--src/multimedia/platform/darwin/camera/avfcameraservice.mm6
-rw-r--r--src/multimedia/platform/darwin/camera/avfcameraservice_p.h3
-rw-r--r--src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm9
-rw-r--r--src/multimedia/platform/darwin/camera/avfmediarecordercontrol_p.h4
-rw-r--r--src/multimedia/platform/gstreamer/camerabin/camerabin.pri2
-rw-r--r--src/multimedia/platform/gstreamer/camerabin/camerabinmetadata.cpp226
-rw-r--r--src/multimedia/platform/gstreamer/camerabin/camerabinmetadata_p.h84
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturemetadatacontrol.cpp19
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp7
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice_p.h2
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp11
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol_p.h5
-rw-r--r--src/multimedia/recording/qmediarecorder.cpp39
17 files changed, 68 insertions, 363 deletions
diff --git a/src/multimedia/CMakeLists.txt b/src/multimedia/CMakeLists.txt
index 704358a70..2a6c10663 100644
--- a/src/multimedia/CMakeLists.txt
+++ b/src/multimedia/CMakeLists.txt
@@ -234,7 +234,6 @@ qt_internal_extend_target(Multimedia CONDITION QT_FEATURE_gstreamer AND use_came
platform/gstreamer/camerabin/camerabinimagecapture.cpp platform/gstreamer/camerabin/camerabinimagecapture_p.h
platform/gstreamer/camerabin/camerabinimageencoder.cpp platform/gstreamer/camerabin/camerabinimageencoder_p.h
platform/gstreamer/camerabin/camerabinimageprocessing.cpp platform/gstreamer/camerabin/camerabinimageprocessing_p.h
- platform/gstreamer/camerabin/camerabinmetadata.cpp platform/gstreamer/camerabin/camerabinmetadata_p.h
platform/gstreamer/camerabin/camerabinrecorder.cpp platform/gstreamer/camerabin/camerabinrecorder_p.h
platform/gstreamer/camerabin/camerabinservice.cpp platform/gstreamer/camerabin/camerabinservice_p.h
platform/gstreamer/camerabin/camerabinsession.cpp platform/gstreamer/camerabin/camerabinsession_p.h
diff --git a/src/multimedia/controls/qmediarecordercontrol.h b/src/multimedia/controls/qmediarecordercontrol.h
index 647ae2de4..8f764ba90 100644
--- a/src/multimedia/controls/qmediarecordercontrol.h
+++ b/src/multimedia/controls/qmediarecordercontrol.h
@@ -52,6 +52,7 @@ QT_BEGIN_NAMESPACE
// Required for QDoc workaround
class QString;
+class QMetaDataWriterControl;
class Q_MULTIMEDIA_EXPORT QMediaRecorderControl : public QObject
{
@@ -76,6 +77,8 @@ public:
virtual void setEncoderSettings(const QMediaEncoderSettings &settings) = 0;
+ virtual QMetaDataWriterControl *metaDataControl() { return nullptr; }
+
Q_SIGNALS:
void stateChanged(QMediaRecorder::State state);
void statusChanged(QMediaRecorder::Status status);
diff --git a/src/multimedia/platform/darwin/camera/avfcamerametadatacontrol.mm b/src/multimedia/platform/darwin/camera/avfcamerametadatacontrol.mm
index 4addfd938..d346a7dee 100644
--- a/src/multimedia/platform/darwin/camera/avfcamerametadatacontrol.mm
+++ b/src/multimedia/platform/darwin/camera/avfcamerametadatacontrol.mm
@@ -40,15 +40,15 @@
#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(AVFCameraService *service, QObject *parent)
- :QMetaDataWriterControl(parent)
+AVFCameraMetaDataControl::AVFCameraMetaDataControl(AVFMediaRecorderControl *parent)
+ : QMetaDataWriterControl(parent)
{
- Q_UNUSED(service);
}
AVFCameraMetaDataControl::~AVFCameraMetaDataControl()
diff --git a/src/multimedia/platform/darwin/camera/avfcamerametadatacontrol_p.h b/src/multimedia/platform/darwin/camera/avfcamerametadatacontrol_p.h
index 2f9138986..45addb946 100644
--- a/src/multimedia/platform/darwin/camera/avfcamerametadatacontrol_p.h
+++ b/src/multimedia/platform/darwin/camera/avfcamerametadatacontrol_p.h
@@ -56,13 +56,13 @@
QT_BEGIN_NAMESPACE
-class AVFCameraService;
+class AVFMediaRecorderControl;
class AVFCameraMetaDataControl : public QMetaDataWriterControl
{
Q_OBJECT
public:
- AVFCameraMetaDataControl(AVFCameraService *service, QObject *parent = nullptr);
+ AVFCameraMetaDataControl(AVFMediaRecorderControl *parent = nullptr);
virtual ~AVFCameraMetaDataControl();
bool isMetaDataAvailable() const override;
diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice.mm b/src/multimedia/platform/darwin/camera/avfcameraservice.mm
index 101e9cf4e..a811cc746 100644
--- a/src/multimedia/platform/darwin/camera/avfcameraservice.mm
+++ b/src/multimedia/platform/darwin/camera/avfcameraservice.mm
@@ -67,7 +67,6 @@ AVFCameraService::AVFCameraService()
m_session = new AVFCameraSession(this);
m_cameraControl = new AVFCameraControl(this);
- m_metaDataControl = new AVFCameraMetaDataControl(this);
#ifndef Q_OS_IOS
// This will connect a slot to 'captureModeChanged'
// and will break viewfinder by attaching AVCaptureMovieFileOutput
@@ -110,7 +109,6 @@ AVFCameraService::~AVFCameraService()
//so they have a chance to do deinitialization
delete m_imageCaptureControl;
//delete m_recorderControl;
- delete m_metaDataControl;
delete m_cameraControl;
delete m_cameraFocusControl;
delete m_cameraExposureControl;
@@ -124,10 +122,6 @@ QObject *AVFCameraService::requestControl(const char *name)
if (qstrcmp(name, QCameraControl_iid) == 0)
return m_cameraControl;
- //metadata support is not implemented yet
- //if (qstrcmp(name, QMetaDataWriterControl_iid) == 0)
- // return m_metaDataControl;
-
if (qstrcmp(name, QMediaRecorderControl_iid) == 0)
return m_recorderControl;
diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h
index c8b085bdb..5bcde87c3 100644
--- a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h
+++ b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h
@@ -60,7 +60,6 @@ QT_BEGIN_NAMESPACE
class QCameraControl;
class QMediaRecorderControl;
class AVFCameraControl;
-class AVFCameraMetaDataControl;
class AVFVideoWindowControl;
class AVFVideoWidgetControl;
class AVFCameraRendererControl;
@@ -85,7 +84,6 @@ public:
AVFCameraSession *session() const { return m_session; }
AVFCameraControl *cameraControl() const { return m_cameraControl; }
- AVFCameraMetaDataControl *metaDataControl() const { return m_metaDataControl; }
QMediaRecorderControl *recorderControl() const { return m_recorderControl; }
AVFImageCaptureControl *imageCaptureControl() const { return m_imageCaptureControl; }
AVFCameraFocusControl *cameraFocusControl() const { return m_cameraFocusControl; }
@@ -97,7 +95,6 @@ private:
AVFCameraSession *m_session;
AVFCameraControl *m_cameraControl;
AVFCameraRendererControl *m_videoOutput;
- AVFCameraMetaDataControl *m_metaDataControl;
QMediaRecorderControl *m_recorderControl;
AVFImageCaptureControl *m_imageCaptureControl;
AVFCameraFocusControl *m_cameraFocusControl;
diff --git a/src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm b/src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm
index 69c56d402..983fd8357 100644
--- a/src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm
+++ b/src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm
@@ -42,6 +42,8 @@
#include "avfcamerasession_p.h"
#include "avfcameraservice_p.h"
#include "avfcameracontrol_p.h"
+#include "avfcamerametadatacontrol_p.h"
+
#include "qaudiodeviceinfo.h"
#include "qmediadevicemanager.h"
#include "private/qdarwinformatsinfo_p.h"
@@ -149,6 +151,8 @@ 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()
@@ -529,6 +533,11 @@ 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 02a8581d2..1d50ceb72 100644
--- a/src/multimedia/platform/darwin/camera/avfmediarecordercontrol_p.h
+++ b/src/multimedia/platform/darwin/camera/avfmediarecordercontrol_p.h
@@ -68,6 +68,7 @@ QT_BEGIN_NAMESPACE
class AVFCameraSession;
class AVFCameraControl;
class AVFCameraService;
+class AVFCameraMetaDataControl;
class AVFMediaRecorderControl : public QMediaRecorderControl
{
@@ -95,6 +96,8 @@ public:
void setEncoderSettings(const QMediaEncoderSettings &settings) override;
+ QMetaDataWriterControl *metaDataControl() override;
+
public Q_SLOTS:
void setState(QMediaRecorder::State state) override;
void setMuted(bool muted) override;
@@ -113,6 +116,7 @@ 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/gstreamer/camerabin/camerabin.pri b/src/multimedia/platform/gstreamer/camerabin/camerabin.pri
index 8ec161466..164e4b0a9 100644
--- a/src/multimedia/platform/gstreamer/camerabin/camerabin.pri
+++ b/src/multimedia/platform/gstreamer/camerabin/camerabin.pri
@@ -7,7 +7,6 @@ HEADERS += \
$$PWD/camerabinrecorder_p.h \
$$PWD/camerabinimagecapture_p.h \
$$PWD/camerabinimageprocessing_p.h \
- $$PWD/camerabinmetadata_p.h \
SOURCES += \
$$PWD/camerabinservice.cpp \
@@ -16,7 +15,6 @@ SOURCES += \
$$PWD/camerabinimagecapture.cpp \
$$PWD/camerabinimageencoder.cpp \
$$PWD/camerabinimageprocessing.cpp \
- $$PWD/camerabinmetadata.cpp \
$$PWD/camerabinrecorder.cpp \
qtConfig(gstreamer__p.hotography) {
diff --git a/src/multimedia/platform/gstreamer/camerabin/camerabinmetadata.cpp b/src/multimedia/platform/gstreamer/camerabin/camerabinmetadata.cpp
deleted file mode 100644
index e2b12aab1..000000000
--- a/src/multimedia/platform/gstreamer/camerabin/camerabinmetadata.cpp
+++ /dev/null
@@ -1,226 +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 "camerabinmetadata.h"
-
-#include <QtMultimedia/qmediametadata.h>
-
-#include <gst/gst.h>
-#include <gst/gstversion.h>
-#include <private/qgstutils_p.h>
-
-#include <QDebug>
-
-QT_BEGIN_NAMESPACE
-
-namespace {
- struct QGStreamerMetaDataKey
- {
- QString qtName;
- const char *gstName;
- QMetaType::Type type;
-
- QGStreamerMetaDataKey(const QString &qtn, const char *gstn, QMetaType::Type t)
- : qtName(qtn)
- , gstName(gstn)
- , type(t)
- { }
- };
-}
-
-typedef QList<QGStreamerMetaDataKey> QGStreamerMetaDataKeys;
-Q_GLOBAL_STATIC(QGStreamerMetaDataKeys, metadataKeys)
-
-static const QGStreamerMetaDataKeys *qt_gstreamerMetaDataKeys()
-{
- if (metadataKeys->isEmpty()) {
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Title, GST_TAG_TITLE, QMetaType::QString));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::SubTitle, 0, QMetaType::QString));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Author, 0, QMetaType::QString));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Comment, GST_TAG_COMMENT, QMetaType::QString));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Date, GST_TAG_DATE_TIME, QMetaType::QDateTime));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Description, GST_TAG_DESCRIPTION, QMetaType::QString));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Category, 0, QMetaType::QString));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Genre, GST_TAG_GENRE, QMetaType::QString));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Year, 0, QMetaType::Int));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::UserRating, , QMetaType::Int));
-
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Language, GST_TAG_LANGUAGE_CODE, QMetaType::QString));
-
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Publisher, GST_TAG_ORGANIZATION, QMetaType::QString));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Copyright, GST_TAG_COPYRIGHT, QMetaType::QString));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::ParentalRating, 0, QMetaType::QString));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::RatingOrganisation, 0, QMetaType::QString));
-
- // Media
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Size, 0, QMetaType::Int));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::MediaType, 0, QMetaType::QString));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Duration, GST_TAG_DURATION, QMetaType::Int));
-
- // Audio
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::AudioBitRate, GST_TAG_BITRATE, QMetaType::Int));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::AudioCodec, GST_TAG_AUDIO_CODEC, QMetaType::QString));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::ChannelCount, 0, QMetaType::Int));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::SampleRate, 0, QMetaType::Int));
-
- // Music
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::AlbumTitle, GST_TAG_ALBUM, QMetaType::QString));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::AlbumArtist, GST_TAG_ARTIST, QMetaType::QString));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::ContributingArtist, GST_TAG_PERFORMER, QMetaType::QString));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Composer, GST_TAG_COMPOSER, QMetaType::QString));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Conductor, 0, QMetaType::QString));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Lyrics, 0, QMetaType::QString));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Mood, 0, QMetaType::QString));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::TrackNumber, GST_TAG_TRACK_NUMBER, QMetaType::Int));
-
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::CoverArtUrlSmall, 0, QMetaType::QString));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::CoverArtUrlLarge, 0, QMetaType::QString));
-
- // Image/Video
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Resolution, 0, QMetaType::QSize));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::PixelAspectRatio, 0, QMetaType::QSize));
-
- // Video
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::VideoFrameRate, 0, QMetaType::QString));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::VideoBitRate, 0, QMetaType::Double));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::VideoCodec, GST_TAG_VIDEO_CODEC, QMetaType::QString));
-
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::PosterUrl, 0, QMetaType::QString));
-
- // Movie
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::ChapterNumber, 0, QMetaType::Int));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Director, 0, QMetaType::QString));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::LeadPerformer, GST_TAG_PERFORMER, QMetaType::QString));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Writer, 0, QMetaType::QString));
-
- // Photos
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::CameraManufacturer, GST_TAG_DEVICE_MANUFACTURER, QMetaType::QString));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::CameraModel, GST_TAG_DEVICE_MODEL, QMetaType::QString));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Event, 0, QMetaType::QString));
- //metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Subject, 0, QMetaType::QString));
-
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Orientation, GST_TAG_IMAGE_ORIENTATION, QMetaType::QString));
-
- // GPS
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::GPSLatitude, GST_TAG_GEO_LOCATION_LATITUDE, QMetaType::Double));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::GPSLongitude, GST_TAG_GEO_LOCATION_LONGITUDE, QMetaType::Double));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::GPSAltitude, GST_TAG_GEO_LOCATION_ELEVATION, QMetaType::Double));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::GPSTrack, GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, QMetaType::Double));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::GPSSpeed, GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, QMetaType::Double));
- metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::GPSImgDirection, GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, QMetaType::Double));
- }
-
- return metadataKeys;
-}
-
-CameraBinMetaData::CameraBinMetaData(QObject *parent)
- :QMetaDataWriterControl(parent)
-{
-}
-
-QVariant CameraBinMetaData::metaData(const QString &key) const
-{
- if (key == QMediaMetaData::Orientation)
- return QGstUtils::fromGStreamerOrientation(m_values.value(QByteArray(GST_TAG_IMAGE_ORIENTATION)));
-
- if (key == QMediaMetaData::GPSSpeed) {
- const double metersPerSec = m_values.value(QByteArray(GST_TAG_GEO_LOCATION_MOVEMENT_SPEED)).toDouble();
- return (metersPerSec * 3600) / 1000;
- }
-
- const auto keys = *qt_gstreamerMetaDataKeys();
- for (const QGStreamerMetaDataKey &metadataKey : keys) {
- if (metadataKey.qtName == key)
- return m_values.value(QByteArray::fromRawData(metadataKey.gstName, qstrlen(metadataKey.gstName)));
- }
- return QVariant();
-}
-
-void CameraBinMetaData::setMetaData(const QString &key, const QVariant &value)
-{
- QVariant correctedValue = value;
- if (value.isValid()) {
- if (key == QMediaMetaData::Orientation) {
- correctedValue = QGstUtils::toGStreamerOrientation(value);
- } else if (key == QMediaMetaData::GPSSpeed) {
- // kilometers per hour to meters per second.
- correctedValue = (value.toDouble() * 1000) / 3600;
- }
- }
-
- const auto keys = *qt_gstreamerMetaDataKeys();
- for (const QGStreamerMetaDataKey &metadataKey : keys) {
- if (metadataKey.qtName == key) {
- const char *name = metadataKey.gstName;
-
- if (correctedValue.isValid()) {
- correctedValue.convert(QMetaType(metadataKey.type));
- m_values.insert(QByteArray::fromRawData(name, qstrlen(name)), correctedValue);
- } else {
- m_values.remove(QByteArray::fromRawData(name, qstrlen(name)));
- }
-
- emit QMetaDataWriterControl::metaDataChanged();
- emit metaDataChanged(m_values);
-
- return;
- }
- }
-}
-
-QStringList CameraBinMetaData::availableMetaData() const
-{
- static QMap<QByteArray, QString> keysMap;
- if (keysMap.isEmpty()) {
- const auto keys = *qt_gstreamerMetaDataKeys();
- for (const QGStreamerMetaDataKey &metadataKey : keys)
- keysMap[QByteArray(metadataKey.gstName)] = metadataKey.qtName;
- }
-
- QStringList res;
- for (auto it = m_values.keyBegin(), end = m_values.keyEnd(); it != end; ++it) {
- QString tag = keysMap.value(*it);
- if (!tag.isEmpty())
- res.append(tag);
- }
-
- return res;
-}
-
-QT_END_NAMESPACE
diff --git a/src/multimedia/platform/gstreamer/camerabin/camerabinmetadata_p.h b/src/multimedia/platform/gstreamer/camerabin/camerabinmetadata_p.h
deleted file mode 100644
index b4811b9ba..000000000
--- a/src/multimedia/platform/gstreamer/camerabin/camerabinmetadata_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 CAMERABINCAPTUREMETADATACONTROL_H
-#define CAMERABINCAPTUREMETADATACONTROL_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 <qmap.h>
-#include <qvariant.h>
-
-QT_BEGIN_NAMESPACE
-
-class CameraBinMetaData : public QMetaDataWriterControl
-{
- Q_OBJECT
-public:
- CameraBinMetaData(QObject *parent);
- virtual ~CameraBinMetaData() {}
-
-
- 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 // CAMERABINCAPTUREMETADATACONTROL_H
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturemetadatacontrol.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturemetadatacontrol.cpp
index cbabca6ee..ba4a757a3 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturemetadatacontrol.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturemetadatacontrol.cpp
@@ -55,6 +55,7 @@ static const QGstreamerMetaDataKeyLookup *qt_gstreamerMetaDataKeys()
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);
@@ -110,10 +111,20 @@ static const QGstreamerMetaDataKeyLookup *qt_gstreamerMetaDataKeys()
//metadataKeys->insert(QMediaMetaData::Writer, 0);
// Photos
- //metadataKeys->insert(QMediaMetaData::CameraManufacturer, 0);
- //metadataKeys->insert(QMediaMetaData::CameraModel, 0);
- //metadataKeys->insert(QMediaMetaData::Event, 0);
- //metadataKeys->insert(QMediaMetaData::Subject, 0 }
+ 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;
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp
index 3271a2307..c57d1d7ff 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp
@@ -82,10 +82,6 @@ QGstreamerCaptureService::QGstreamerCaptureService(QMediaRecorder::CaptureMode m
m_imageCaptureControl = new QGstreamerImageCaptureControl(m_captureSession);
}
#endif
-
- m_metaDataControl = new QGstreamerCaptureMetaDataControl(this);
- connect(m_metaDataControl, SIGNAL(metaDataChanged(QMap<QByteArray,QVariant>)),
- m_captureSession, SLOT(setMetaData(QMap<QByteArray,QVariant>)));
}
QGstreamerCaptureService::~QGstreamerCaptureService()
@@ -107,9 +103,6 @@ QObject *QGstreamerCaptureService::requestControl(const char *name)
if (qstrcmp(name,QCameraControl_iid) == 0)
return m_cameraControl;
- if (qstrcmp(name,QMetaDataWriterControl_iid) == 0)
- return m_metaDataControl;
-
if (qstrcmp(name, QCameraImageCaptureControl_iid) == 0)
return m_imageCaptureControl;
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice_p.h
index adfb97a9b..ba8b373e5 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice_p.h
@@ -65,7 +65,6 @@ class QGstreamerBusHelper;
class QGstreamerVideoRenderer;
class QGstreamerVideoWindow;
class QGstreamerElementFactory;
-class QGstreamerCaptureMetaDataControl;
class QGstreamerImageCaptureControl;
class QGstreamerVideoInput;
@@ -88,7 +87,6 @@ private:
#if defined(USE_GSTREAMER_CAMERA)
QGstreamerVideoInput *m_videoInput = nullptr;
#endif
- QGstreamerCaptureMetaDataControl *m_metaDataControl = nullptr;
QObject *m_videoOutput = nullptr;
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp
index fabf6cf20..caeec0994 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp
@@ -38,6 +38,7 @@
****************************************************************************/
#include "qgstreamerrecordercontrol_p.h"
+#include "qgstreamercapturemetadatacontrol_p.h"
#include <QtCore/QDebug>
#include <QtGui/qdesktopservices.h>
#include <QStandardPaths>
@@ -56,10 +57,15 @@ 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
@@ -237,6 +243,11 @@ QMediaEncoderSettings QGstreamerRecorderControl::resolvedEncoderSettings() const
return f;
}
+QMetaDataWriterControl *QGstreamerRecorderControl::metaDataControl()
+{
+ return m_metaData;
+}
+
bool QGstreamerRecorderControl::isMuted() const
{
return m_session->isMuted();
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol_p.h
index 667789b74..340337058 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol_p.h
@@ -59,6 +59,8 @@
QT_BEGIN_NAMESPACE
+class QGstreamerCaptureMetaDataControl;
+
class QGstreamerRecorderControl : public QMediaRecorderControl
{
Q_OBJECT
@@ -87,6 +89,8 @@ public:
QMediaEncoderSettings encoderSettings() const { return m_settings; }
QMediaEncoderSettings resolvedEncoderSettings() const;
+ QMetaDataWriterControl *metaDataControl() override;
+
public slots:
void setState(QMediaRecorder::State state) override;
void record();
@@ -106,6 +110,7 @@ private:
QUrl m_outputLocation;
QMediaEncoderSettings m_settings;
QGstreamerCaptureSession *m_session;
+ QGstreamerCaptureMetaDataControl *m_metaData = nullptr;;
QMediaRecorder::State m_state;
QMediaRecorder::Status m_status;
bool m_hasPreviewState;
diff --git a/src/multimedia/recording/qmediarecorder.cpp b/src/multimedia/recording/qmediarecorder.cpp
index d2ac3d1a0..23da8b547 100644
--- a/src/multimedia/recording/qmediarecorder.cpp
+++ b/src/multimedia/recording/qmediarecorder.cpp
@@ -290,8 +290,6 @@ bool QMediaRecorder::setMediaSource(QMediaSource *object)
if (service) {
disconnect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed()));
- if (d->control)
- service->releaseControl(d->control);
if (d->metaDataControl) {
disconnect(d->metaDataControl, SIGNAL(metaDataChanged()),
this, SIGNAL(metaDataChanged()));
@@ -301,9 +299,9 @@ bool QMediaRecorder::setMediaSource(QMediaSource *object)
this, SIGNAL(metaDataAvailableChanged(bool)));
disconnect(d->metaDataControl, SIGNAL(writableChanged(bool)),
this, SIGNAL(metaDataWritableChanged(bool)));
-
- service->releaseControl(d->metaDataControl);
}
+ if (d->control)
+ service->releaseControl(d->control);
}
}
@@ -322,25 +320,20 @@ bool QMediaRecorder::setMediaSource(QMediaSource *object)
d->control = qobject_cast<QMediaRecorderControl*>(service->requestControl(QMediaRecorderControl_iid));
if (d->control) {
- QObject *control = service->requestControl(QMetaDataWriterControl_iid);
- if (control) {
- d->metaDataControl = qobject_cast<QMetaDataWriterControl *>(control);
- if (!d->metaDataControl) {
- service->releaseControl(control);
- } else {
- 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)));
- }
- }
+ 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)));