diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-02-08 15:14:22 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-02-09 19:04:58 +0000 |
commit | b6d6576089126d54998248bfe197d058c2be0d98 (patch) | |
tree | 423f87995f081b0f328395c8b807018ce405bc4a | |
parent | f580a0f609bed24073fb7340c212a67c44f0c51d (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>
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))); |