summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoris Verria <doris.verria@qt.io>2021-02-15 10:28:53 +0100
committerLars Knoll <lars.knoll@qt.io>2021-03-02 14:50:16 +0000
commit4a6b7816b1f11e00063ee6080141be4d77bca9ac (patch)
treef73ed511fa44773e27c10a47b8517775be4133df
parent2499b994a77c12a4cd55fd79c83708d18f3d896d (diff)
Show metadata for audio/video files in player example
Change-Id: I10748df06e9866c3121015c657b579aa27ac4450 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r--examples/multimediawidgets/player/player.cpp53
-rw-r--r--examples/multimediawidgets/player/player.h5
-rw-r--r--src/multimedia/qmediametadata.cpp61
-rw-r--r--src/multimedia/qmediametadata.h4
4 files changed, 119 insertions, 4 deletions
diff --git a/examples/multimediawidgets/player/player.cpp b/examples/multimediawidgets/player/player.cpp
index ed04ff75f..60745ffe9 100644
--- a/examples/multimediawidgets/player/player.cpp
+++ b/examples/multimediawidgets/player/player.cpp
@@ -112,6 +112,26 @@ Player::Player(QWidget *parent)
histogramLayout->addWidget(m_videoHistogram, 1);
histogramLayout->addWidget(m_audioHistogram, 2);
+ QLabel *metaDataLabel = new QLabel(tr("Metadata for file:"));
+ QGridLayout *metaDataLayout = new QGridLayout;
+ int key = QMediaMetaData::Title;
+ for (int i = 0; i < 9; i++) {
+ for (int j = 0; j < 6; j+=2) {
+ m_metaDataLabels[key] = new QLabel(QMediaMetaData::metaDataKeyToString
+ (static_cast<QMediaMetaData::Key>(key)));
+ if (key == QMediaMetaData::ThumbnailImage
+ || key == QMediaMetaData::CoverArtImage)
+ m_metaDataFields[key] = new QLabel;
+ else
+ m_metaDataFields[key] = new QLineEdit;
+ m_metaDataLabels[key]->setDisabled(true);
+ m_metaDataFields[key]->setDisabled(true);
+ metaDataLayout->addWidget(m_metaDataLabels[key], i, j);
+ metaDataLayout->addWidget(m_metaDataFields[key], i, j+1);
+ key++;
+ }
+ }
+
// ### replace by a monitoring outputs once we have them
// m_videoProbe = new QVideoProbe(this);
// connect(m_videoProbe, &QVideoProbe::videoFrameProbed, m_videoHistogram, &HistogramWidget::processFrame);
@@ -179,6 +199,8 @@ Player::Player(QWidget *parent)
layout->addLayout(hLayout);
layout->addLayout(controlLayout);
layout->addLayout(histogramLayout);
+ layout->addWidget(metaDataLabel);
+ layout->addLayout(metaDataLayout);
#if defined(Q_OS_QNX)
// On QNX, the main window doesn't have a title bar (or any other decorations).
// Create a status bar for the status information instead.
@@ -269,9 +291,33 @@ void Player::metaDataChanged()
.arg(metaData.value(QMediaMetaData::AlbumArtist).toString())
.arg(metaData.value(QMediaMetaData::Title).toString()));
- if (m_coverLabel) {
- QImage cover = metaData.value(QMediaMetaData::CoverArtImage).value<QImage>();
- m_coverLabel->setPixmap(QPixmap::fromImage(cover));
+ for (int i = 0; i < QMediaMetaData::NumMetaData; i++) {
+ if (QLineEdit* field = qobject_cast<QLineEdit*>(m_metaDataFields[i]))
+ field->clear();
+ else if (QLabel* label = qobject_cast<QLabel*>(m_metaDataFields[i]))
+ label->clear();
+ m_metaDataFields[i]->setDisabled(true);
+ m_metaDataLabels[i]->setDisabled(true);
+ }
+
+ for (auto &key : metaData.keys()) {
+ int i = int(key);
+ if (key == QMediaMetaData::CoverArtImage) {
+ if (QLabel *cover = qobject_cast<QLabel*>(m_metaDataFields[key])) {
+ QImage coverImage = metaData.value(QMediaMetaData::CoverArtImage).value<QImage>();
+ cover->setPixmap(QPixmap::fromImage(coverImage));
+ }
+ }
+ else if (key == QMediaMetaData::ThumbnailImage) {
+ if (QLabel *thumbnail = qobject_cast<QLabel*>(m_metaDataFields[key])) {
+ QImage thumbnailImage = metaData.value(QMediaMetaData::CoverArtImage).value<QImage>();
+ thumbnail->setPixmap(QPixmap::fromImage(thumbnailImage));
+ }
+ }
+ else if (QLineEdit *field = qobject_cast<QLineEdit*>(m_metaDataFields[key]))
+ field->setText(QString("%1").arg(metaData.value(key).toString()));
+ m_metaDataFields[i]->setDisabled(false);
+ m_metaDataLabels[i]->setDisabled(false);
}
}
@@ -487,3 +533,4 @@ void Player::clearHistogram()
QMetaObject::invokeMethod(m_videoHistogram, "processFrame", Qt::QueuedConnection, Q_ARG(QVideoFrame, QVideoFrame()));
QMetaObject::invokeMethod(m_audioHistogram, "processBuffer", Qt::QueuedConnection, Q_ARG(QAudioBuffer, QAudioBuffer()));
}
+
diff --git a/examples/multimediawidgets/player/player.h b/examples/multimediawidgets/player/player.h
index d95ad6191..3944d0f3f 100644
--- a/examples/multimediawidgets/player/player.h
+++ b/examples/multimediawidgets/player/player.h
@@ -54,6 +54,7 @@
#include <QWidget>
#include <QMediaPlayer>
#include <QMediaPlaylist>
+#include <QMediaMetaData>
QT_BEGIN_NAMESPACE
class QAbstractItemView;
@@ -119,7 +120,6 @@ private:
QMediaPlayer *m_player = nullptr;
QMediaPlaylist *m_playlist = nullptr;
QVideoWidget *m_videoWidget = nullptr;
- QLabel *m_coverLabel = nullptr;
QSlider *m_slider = nullptr;
QLabel *m_labelDuration = nullptr;
QPushButton *m_fullScreenButton = nullptr;
@@ -138,6 +138,9 @@ private:
QString m_trackInfo;
QString m_statusInfo;
qint64 m_duration;
+
+ QWidget *m_metaDataFields[QMediaMetaData::NumMetaData] = {};
+ QLabel *m_metaDataLabels[QMediaMetaData::NumMetaData] = {};
};
#endif // PLAYER_H
diff --git a/src/multimedia/qmediametadata.cpp b/src/multimedia/qmediametadata.cpp
index 5ab262357..11002d96f 100644
--- a/src/multimedia/qmediametadata.cpp
+++ b/src/multimedia/qmediametadata.cpp
@@ -39,6 +39,7 @@
#include "qmediametadata.h"
#include <qvariant.h>
+#include <qobject.h>
QT_BEGIN_NAMESPACE
@@ -232,5 +233,65 @@ void QMediaMetaData::insert(QMediaMetaData::Key k, const QVariant &value)
data.insert(k, value);
}
+QString QMediaMetaData::metaDataKeyToString(QMediaMetaData::Key k)
+{
+ switch (k) {
+ case QMediaMetaData::Title:
+ return (QObject::tr("Title"));
+ case QMediaMetaData::Author:
+ return (QObject::tr("Author"));
+ case QMediaMetaData::Comment:
+ return (QObject::tr("Comment"));
+ case QMediaMetaData::Description:
+ return (QObject::tr("Description"));
+ case QMediaMetaData::Genre:
+ return (QObject::tr("Genre"));
+ case QMediaMetaData::Year:
+ return (QObject::tr("Year"));
+ case QMediaMetaData::Date:
+ return (QObject::tr("Date"));
+ case QMediaMetaData::Language:
+ return (QObject::tr("Language"));
+ case QMediaMetaData::Publisher:
+ return (QObject::tr("Publisher"));
+ case QMediaMetaData::Copyright:
+ return (QObject::tr("Copyright"));
+ case QMediaMetaData::Url:
+ return (QObject::tr("Url"));
+ case QMediaMetaData::Duration:
+ return (QObject::tr("Duration"));
+ case QMediaMetaData::MediaType:
+ return (QObject::tr("Media type"));
+ case QMediaMetaData::AudioBitRate:
+ return (QObject::tr("Audio bit rate"));
+ case QMediaMetaData::AudioCodec:
+ return (QObject::tr("Audio codec"));
+ case QMediaMetaData::VideoBitRate:
+ return (QObject::tr("Video bit rate"));
+ case QMediaMetaData::VideoCodec:
+ return (QObject::tr("Video codec"));
+ case QMediaMetaData::AlbumTitle:
+ return (QObject::tr("Album title"));
+ case QMediaMetaData::AlbumArtist:
+ return (QObject::tr("Album artist"));
+ case QMediaMetaData::ContributingArtist:
+ return (QObject::tr("Contributing artist"));
+ case QMediaMetaData::TrackNumber:
+ return (QObject::tr("Track number"));
+ case QMediaMetaData::Composer:
+ return (QObject::tr("Composer"));
+ case QMediaMetaData::ThumbnailImage:
+ return (QObject::tr("Thumbnail image"));
+ case QMediaMetaData::CoverArtImage:
+ return (QObject::tr("Cover art image"));
+ case QMediaMetaData::Orientation:
+ return (QObject::tr("Orientation"));
+ case QMediaMetaData::Resolution:
+ return (QObject::tr("Resolution"));
+ case QMediaMetaData::LeadPerformer:
+ return (QObject::tr("Lead performer"));
+ }
+}
+
QT_END_NAMESPACE
diff --git a/src/multimedia/qmediametadata.h b/src/multimedia/qmediametadata.h
index 0bf43309b..3e552aba8 100644
--- a/src/multimedia/qmediametadata.h
+++ b/src/multimedia/qmediametadata.h
@@ -89,6 +89,8 @@ public:
LeadPerformer,
};
+ static const int NumMetaData = 27;
+
// QMetaType typeForKey(Key k);
QVariant value(Key k) const;
void insert(Key k, const QVariant &value);
@@ -100,6 +102,8 @@ public:
bool isEmpty() const { return data.isEmpty(); }
+ static QString metaDataKeyToString(Key k);
+
protected:
friend bool operator==(const QMediaMetaData &a, const QMediaMetaData &b)
{ return a.data == b.data; }