blob: 6139c57bfd4f32541d7170f11f7657b07bd0b9e5 [file] [log] [blame]
/****************************************************************************
**
** 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.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::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, 0);
//metadataKeys->insert(QMediaMetaData::CameraModel, 0);
//metadataKeys->insert(QMediaMetaData::Event, 0);
//metadataKeys->insert(QMediaMetaData::Subject, 0 }
}
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;
}