Fix static initialization order fiasco in some plugins.
Some static variables were initialized using QMediaMetaData values, which are also statically initialized. Task-number: QTBUG-39202 Change-Id: Ibedc0a77d96cdfa575aad122c4ec654e6830e1f7 Reviewed-by: Andrew den Exter <andrew.den.exter@qinetic.com.au>
This commit is contained in:
committed by
The Qt Project
parent
8a66559e0b
commit
eadf1c8c41
@@ -50,13 +50,6 @@
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
struct QGstreamerMetaDataKeyLookup
|
||||
{
|
||||
QString key;
|
||||
const char *token;
|
||||
QVariant::Type type;
|
||||
};
|
||||
|
||||
static QVariant fromGStreamerOrientation(const QVariant &value)
|
||||
{
|
||||
// Note gstreamer tokens either describe the counter clockwise rotation of the
|
||||
@@ -87,87 +80,109 @@ static QVariant toGStreamerOrientation(const QVariant &value)
|
||||
}
|
||||
}
|
||||
|
||||
static const QGstreamerMetaDataKeyLookup qt_gstreamerMetaDataKeys[] =
|
||||
namespace {
|
||||
struct QGStreamerMetaDataKey
|
||||
{
|
||||
QString qtName;
|
||||
const char *gstName;
|
||||
QVariant::Type type;
|
||||
|
||||
QGStreamerMetaDataKey(const QString &qtn, const char *gstn, QVariant::Type t)
|
||||
: qtName(qtn)
|
||||
, gstName(gstn)
|
||||
, type(t)
|
||||
{ }
|
||||
};
|
||||
}
|
||||
|
||||
typedef QList<QGStreamerMetaDataKey> QGStreamerMetaDataKeys;
|
||||
Q_GLOBAL_STATIC(QGStreamerMetaDataKeys, metadataKeys)
|
||||
|
||||
static const QGStreamerMetaDataKeys *qt_gstreamerMetaDataKeys()
|
||||
{
|
||||
{ QMediaMetaData::Title, GST_TAG_TITLE, QVariant::String },
|
||||
//{ QMediaMetaData::SubTitle, 0, QVariant::String },
|
||||
//{ QMediaMetaData::Author, 0, QVariant::String },
|
||||
{ QMediaMetaData::Comment, GST_TAG_COMMENT, QVariant::String },
|
||||
{ QMediaMetaData::Date, GST_TAG_DATE_TIME, QVariant::DateTime },
|
||||
{ QMediaMetaData::Description, GST_TAG_DESCRIPTION, QVariant::String },
|
||||
//{ QMediaMetaData::Category, 0, QVariant::String },
|
||||
{ QMediaMetaData::Genre, GST_TAG_GENRE, QVariant::String },
|
||||
//{ QMediaMetaData::Year, 0, QVariant::Int },
|
||||
//{ QMediaMetaData::UserRating, , QVariant::Int },
|
||||
if (metadataKeys->isEmpty()) {
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Title, GST_TAG_TITLE, QVariant::String));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::SubTitle, 0, QVariant::String));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Author, 0, QVariant::String));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Comment, GST_TAG_COMMENT, QVariant::String));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Date, GST_TAG_DATE_TIME, QVariant::DateTime));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Description, GST_TAG_DESCRIPTION, QVariant::String));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Category, 0, QVariant::String));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Genre, GST_TAG_GENRE, QVariant::String));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Year, 0, QVariant::Int));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::UserRating, , QVariant::Int));
|
||||
|
||||
{ QMediaMetaData::Language, GST_TAG_LANGUAGE_CODE, QVariant::String },
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Language, GST_TAG_LANGUAGE_CODE, QVariant::String));
|
||||
|
||||
{ QMediaMetaData::Publisher, GST_TAG_ORGANIZATION, QVariant::String },
|
||||
{ QMediaMetaData::Copyright, GST_TAG_COPYRIGHT, QVariant::String },
|
||||
//{ QMediaMetaData::ParentalRating, 0, QVariant::String },
|
||||
//{ QMediaMetaData::RatingOrganisation, 0, QVariant::String },
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Publisher, GST_TAG_ORGANIZATION, QVariant::String));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Copyright, GST_TAG_COPYRIGHT, QVariant::String));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::ParentalRating, 0, QVariant::String));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::RatingOrganisation, 0, QVariant::String));
|
||||
|
||||
// Media
|
||||
//{ QMediaMetaData::Size, 0, QVariant::Int },
|
||||
//{ QMediaMetaData::MediaType, 0, QVariant::String },
|
||||
{ QMediaMetaData::Duration, GST_TAG_DURATION, QVariant::Int },
|
||||
// Media
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Size, 0, QVariant::Int));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::MediaType, 0, QVariant::String));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Duration, GST_TAG_DURATION, QVariant::Int));
|
||||
|
||||
// Audio
|
||||
{ QMediaMetaData::AudioBitRate, GST_TAG_BITRATE, QVariant::Int },
|
||||
{ QMediaMetaData::AudioCodec, GST_TAG_AUDIO_CODEC, QVariant::String },
|
||||
//{ QMediaMetaData::ChannelCount, 0, QVariant::Int },
|
||||
//{ QMediaMetaData::SampleRate, 0, QVariant::Int },
|
||||
// Audio
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::AudioBitRate, GST_TAG_BITRATE, QVariant::Int));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::AudioCodec, GST_TAG_AUDIO_CODEC, QVariant::String));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::ChannelCount, 0, QVariant::Int));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::SampleRate, 0, QVariant::Int));
|
||||
|
||||
// Music
|
||||
{ QMediaMetaData::AlbumTitle, GST_TAG_ALBUM, QVariant::String },
|
||||
{ QMediaMetaData::AlbumArtist, GST_TAG_ARTIST, QVariant::String},
|
||||
{ QMediaMetaData::ContributingArtist, GST_TAG_PERFORMER, QVariant::String },
|
||||
// Music
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::AlbumTitle, GST_TAG_ALBUM, QVariant::String));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::AlbumArtist, GST_TAG_ARTIST, QVariant::String));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::ContributingArtist, GST_TAG_PERFORMER, QVariant::String));
|
||||
#if (GST_VERSION_MAJOR >= 0) && (GST_VERSION_MINOR >= 10) && (GST_VERSION_MICRO >= 19)
|
||||
{ QMediaMetaData::Composer, GST_TAG_COMPOSER, QVariant::String },
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Composer, GST_TAG_COMPOSER, QVariant::String));
|
||||
#endif
|
||||
//{ QMediaMetaData::Conductor, 0, QVariant::String },
|
||||
//{ QMediaMetaData::Lyrics, 0, QVariant::String },
|
||||
//{ QMediaMetaData::Mood, 0, QVariant::String },
|
||||
{ QMediaMetaData::TrackNumber, GST_TAG_TRACK_NUMBER, QVariant::Int },
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Conductor, 0, QVariant::String));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Lyrics, 0, QVariant::String));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Mood, 0, QVariant::String));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::TrackNumber, GST_TAG_TRACK_NUMBER, QVariant::Int));
|
||||
|
||||
//{ QMediaMetaData::CoverArtUrlSmall, 0, QVariant::String },
|
||||
//{ QMediaMetaData::CoverArtUrlLarge, 0, QVariant::String },
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::CoverArtUrlSmall, 0, QVariant::String));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::CoverArtUrlLarge, 0, QVariant::String));
|
||||
|
||||
// Image/Video
|
||||
//{ QMediaMetaData::Resolution, 0, QVariant::Size },
|
||||
//{ QMediaMetaData::PixelAspectRatio, 0, QVariant::Size },
|
||||
// Image/Video
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Resolution, 0, QVariant::Size));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::PixelAspectRatio, 0, QVariant::Size));
|
||||
|
||||
// Video
|
||||
//{ QMediaMetaData::VideoFrameRate, 0, QVariant::String },
|
||||
//{ QMediaMetaData::VideoBitRate, 0, QVariant::Double },
|
||||
{ QMediaMetaData::VideoCodec, GST_TAG_VIDEO_CODEC, QVariant::String },
|
||||
// Video
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::VideoFrameRate, 0, QVariant::String));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::VideoBitRate, 0, QVariant::Double));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::VideoCodec, GST_TAG_VIDEO_CODEC, QVariant::String));
|
||||
|
||||
//{ QMediaMetaData::PosterUrl, 0, QVariant::String },
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::PosterUrl, 0, QVariant::String));
|
||||
|
||||
// Movie
|
||||
//{ QMediaMetaData::ChapterNumber, 0, QVariant::Int },
|
||||
//{ QMediaMetaData::Director, 0, QVariant::String },
|
||||
{ QMediaMetaData::LeadPerformer, GST_TAG_PERFORMER, QVariant::String },
|
||||
//{ QMediaMetaData::Writer, 0, QVariant::String },
|
||||
// Movie
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::ChapterNumber, 0, QVariant::Int));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Director, 0, QVariant::String));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::LeadPerformer, GST_TAG_PERFORMER, QVariant::String));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Writer, 0, QVariant::String));
|
||||
|
||||
#if (GST_VERSION_MAJOR >= 0) && (GST_VERSION_MINOR >= 10) && (GST_VERSION_MICRO >= 30)
|
||||
// Photos
|
||||
{ QMediaMetaData::CameraManufacturer, GST_TAG_DEVICE_MANUFACTURER, QVariant::String },
|
||||
{ QMediaMetaData::CameraModel, GST_TAG_DEVICE_MODEL, QVariant::String },
|
||||
//{ QMediaMetaData::Event, 0, QVariant::String },
|
||||
//{ QMediaMetaData::Subject, 0, QVariant::String },
|
||||
// Photos
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::CameraManufacturer, GST_TAG_DEVICE_MANUFACTURER, QVariant::String));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::CameraModel, GST_TAG_DEVICE_MODEL, QVariant::String));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Event, 0, QVariant::String));
|
||||
//metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Subject, 0, QVariant::String));
|
||||
|
||||
{ QMediaMetaData::Orientation, GST_TAG_IMAGE_ORIENTATION, QVariant::String },
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::Orientation, GST_TAG_IMAGE_ORIENTATION, QVariant::String));
|
||||
|
||||
// GPS
|
||||
{ QMediaMetaData::GPSLatitude, GST_TAG_GEO_LOCATION_LATITUDE, QVariant::Double },
|
||||
{ QMediaMetaData::GPSLongitude, GST_TAG_GEO_LOCATION_LONGITUDE, QVariant::Double },
|
||||
{ QMediaMetaData::GPSAltitude, GST_TAG_GEO_LOCATION_ELEVATION, QVariant::Double },
|
||||
{ QMediaMetaData::GPSTrack, GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, QVariant::Double },
|
||||
{ QMediaMetaData::GPSSpeed, GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, QVariant::Double },
|
||||
{ QMediaMetaData::GPSImgDirection, GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, QVariant::Double }
|
||||
// GPS
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::GPSLatitude, GST_TAG_GEO_LOCATION_LATITUDE, QVariant::Double));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::GPSLongitude, GST_TAG_GEO_LOCATION_LONGITUDE, QVariant::Double));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::GPSAltitude, GST_TAG_GEO_LOCATION_ELEVATION, QVariant::Double));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::GPSTrack, GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, QVariant::Double));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::GPSSpeed, GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, QVariant::Double));
|
||||
metadataKeys->append(QGStreamerMetaDataKey(QMediaMetaData::GPSImgDirection, GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, QVariant::Double));
|
||||
#endif
|
||||
};
|
||||
}
|
||||
|
||||
return metadataKeys;
|
||||
}
|
||||
|
||||
CameraBinMetaData::CameraBinMetaData(QObject *parent)
|
||||
:QMetaDataWriterControl(parent)
|
||||
@@ -183,14 +198,9 @@ QVariant CameraBinMetaData::metaData(const QString &key) const
|
||||
return (metersPerSec * 3600) / 1000;
|
||||
}
|
||||
|
||||
static const int count = sizeof(qt_gstreamerMetaDataKeys) / sizeof(QGstreamerMetaDataKeyLookup);
|
||||
|
||||
for (int i = 0; i < count; ++i) {
|
||||
if (qt_gstreamerMetaDataKeys[i].key == key) {
|
||||
const char *name = qt_gstreamerMetaDataKeys[i].token;
|
||||
|
||||
return m_values.value(QByteArray::fromRawData(name, qstrlen(name)));
|
||||
}
|
||||
Q_FOREACH (const QGStreamerMetaDataKey &metadataKey, *qt_gstreamerMetaDataKeys()) {
|
||||
if (metadataKey.qtName == key)
|
||||
return m_values.value(QByteArray::fromRawData(metadataKey.gstName, qstrlen(metadataKey.gstName)));
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
@@ -207,14 +217,12 @@ void CameraBinMetaData::setMetaData(const QString &key, const QVariant &value)
|
||||
}
|
||||
}
|
||||
|
||||
static const int count = sizeof(qt_gstreamerMetaDataKeys) / sizeof(QGstreamerMetaDataKeyLookup);
|
||||
|
||||
for (int i = 0; i < count; ++i) {
|
||||
if (qt_gstreamerMetaDataKeys[i].key == key) {
|
||||
const char *name = qt_gstreamerMetaDataKeys[i].token;
|
||||
Q_FOREACH (const QGStreamerMetaDataKey &metadataKey, *qt_gstreamerMetaDataKeys()) {
|
||||
if (metadataKey.qtName == key) {
|
||||
const char *name = metadataKey.gstName;
|
||||
|
||||
if (correctedValue.isValid()) {
|
||||
correctedValue.convert(qt_gstreamerMetaDataKeys[i].type);
|
||||
correctedValue.convert(metadataKey.type);
|
||||
m_values.insert(QByteArray::fromRawData(name, qstrlen(name)), correctedValue);
|
||||
} else {
|
||||
m_values.remove(QByteArray::fromRawData(name, qstrlen(name)));
|
||||
@@ -232,14 +240,12 @@ QStringList CameraBinMetaData::availableMetaData() const
|
||||
{
|
||||
static QMap<QByteArray, QString> keysMap;
|
||||
if (keysMap.isEmpty()) {
|
||||
const int count = sizeof(qt_gstreamerMetaDataKeys) / sizeof(QGstreamerMetaDataKeyLookup);
|
||||
for (int i = 0; i < count; ++i) {
|
||||
keysMap[QByteArray(qt_gstreamerMetaDataKeys[i].token)] = qt_gstreamerMetaDataKeys[i].key;
|
||||
}
|
||||
Q_FOREACH (const QGStreamerMetaDataKey &metadataKey, *qt_gstreamerMetaDataKeys())
|
||||
keysMap[QByteArray(metadataKey.gstName)] = metadataKey.qtName;
|
||||
}
|
||||
|
||||
QStringList res;
|
||||
foreach (const QByteArray &key, m_values.keys()) {
|
||||
Q_FOREACH (const QByteArray &key, m_values.keys()) {
|
||||
QString tag = keysMap.value(key);
|
||||
if (!tag.isEmpty())
|
||||
res.append(tag);
|
||||
|
||||
@@ -46,80 +46,82 @@
|
||||
#include <gst/gst.h>
|
||||
#include <gst/gstversion.h>
|
||||
|
||||
struct QGstreamerMetaDataKeyLookup
|
||||
|
||||
typedef QMap<QString, QByteArray> QGstreamerMetaDataKeyLookup;
|
||||
Q_GLOBAL_STATIC(QGstreamerMetaDataKeyLookup, metadataKeys)
|
||||
|
||||
static const QGstreamerMetaDataKeyLookup *qt_gstreamerMetaDataKeys()
|
||||
{
|
||||
QString key;
|
||||
const char *token;
|
||||
};
|
||||
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);
|
||||
|
||||
static const QGstreamerMetaDataKeyLookup qt_gstreamerMetaDataKeys[] =
|
||||
{
|
||||
{ QMediaMetaData::Title, GST_TAG_TITLE },
|
||||
//{ QMediaMetaData::SubTitle, 0 },
|
||||
//{ QMediaMetaData::Author, 0 },
|
||||
{ QMediaMetaData::Comment, GST_TAG_COMMENT },
|
||||
{ QMediaMetaData::Description, GST_TAG_DESCRIPTION },
|
||||
//{ QMediaMetaData::Category, 0 },
|
||||
{ QMediaMetaData::Genre, GST_TAG_GENRE },
|
||||
//{ QMediaMetaData::Year, 0 },
|
||||
//{ QMediaMetaData::UserRating, 0 },
|
||||
metadataKeys->insert(QMediaMetaData::Language, GST_TAG_LANGUAGE_CODE);
|
||||
|
||||
{ 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);
|
||||
|
||||
{ QMediaMetaData::Publisher, GST_TAG_ORGANIZATION },
|
||||
{ QMediaMetaData::Copyright, GST_TAG_COPYRIGHT },
|
||||
//{ QMediaMetaData::ParentalRating, 0 },
|
||||
//{ QMediaMetaData::RatingOrganisation, 0 },
|
||||
// Media
|
||||
//metadataKeys->insert(QMediaMetaData::Size, 0);
|
||||
//metadataKeys->insert(QMediaMetaData::MediaType, 0);
|
||||
metadataKeys->insert(QMediaMetaData::Duration, GST_TAG_DURATION);
|
||||
|
||||
// Media
|
||||
//{ QMediaMetaData::Size, 0 },
|
||||
//{ QMediaMetaData::MediaType, 0 },
|
||||
{ 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);
|
||||
|
||||
// Audio
|
||||
{ QMediaMetaData::AudioBitRate, GST_TAG_BITRATE },
|
||||
{ QMediaMetaData::AudioCodec, GST_TAG_AUDIO_CODEC },
|
||||
//{ QMediaMetaData::ChannelCount, 0 },
|
||||
//{ QMediaMetaData::SampleRate, 0 },
|
||||
|
||||
// Music
|
||||
{ QMediaMetaData::AlbumTitle, GST_TAG_ALBUM },
|
||||
{ QMediaMetaData::AlbumArtist, GST_TAG_ARTIST},
|
||||
{ QMediaMetaData::ContributingArtist, GST_TAG_PERFORMER },
|
||||
// Music
|
||||
metadataKeys->insert(QMediaMetaData::AlbumTitle, GST_TAG_ALBUM);
|
||||
metadataKeys->insert(QMediaMetaData::AlbumArtist, GST_TAG_ARTIST);
|
||||
metadataKeys->insert(QMediaMetaData::ContributingArtist, GST_TAG_PERFORMER);
|
||||
#if (GST_VERSION_MAJOR >= 0) && (GST_VERSION_MINOR >= 10) && (GST_VERSION_MICRO >= 19)
|
||||
{ QMediaMetaData::Composer, GST_TAG_COMPOSER },
|
||||
metadataKeys->insert(QMediaMetaData::Composer, GST_TAG_COMPOSER);
|
||||
#endif
|
||||
//{ QMediaMetaData::Conductor, 0 },
|
||||
//{ QMediaMetaData::Lyrics, 0 },
|
||||
//{ QMediaMetaData::Mood, 0 },
|
||||
{ QMediaMetaData::TrackNumber, GST_TAG_TRACK_NUMBER },
|
||||
//metadataKeys->insert(QMediaMetaData::Conductor, 0);
|
||||
//metadataKeys->insert(QMediaMetaData::Lyrics, 0);
|
||||
//metadataKeys->insert(QMediaMetaData::Mood, 0);
|
||||
metadataKeys->insert(QMediaMetaData::TrackNumber, GST_TAG_TRACK_NUMBER);
|
||||
|
||||
//{ QMediaMetaData::CoverArtUrlSmall, 0 },
|
||||
//{ QMediaMetaData::CoverArtUrlLarge, 0 },
|
||||
//metadataKeys->insert(QMediaMetaData::CoverArtUrlSmall, 0);
|
||||
//metadataKeys->insert(QMediaMetaData::CoverArtUrlLarge, 0);
|
||||
|
||||
// Image/Video
|
||||
//{ QMediaMetaData::Resolution, 0 },
|
||||
//{ QMediaMetaData::PixelAspectRatio, 0 },
|
||||
// Image/Video
|
||||
//metadataKeys->insert(QMediaMetaData::Resolution, 0);
|
||||
//metadataKeys->insert(QMediaMetaData::PixelAspectRatio, 0);
|
||||
|
||||
// Video
|
||||
//{ QMediaMetaData::VideoFrameRate, 0 },
|
||||
//{ QMediaMetaData::VideoBitRate, 0 },
|
||||
{ QMediaMetaData::VideoCodec, GST_TAG_VIDEO_CODEC },
|
||||
// Video
|
||||
//metadataKeys->insert(QMediaMetaData::VideoFrameRate, 0);
|
||||
//metadataKeys->insert(QMediaMetaData::VideoBitRate, 0);
|
||||
metadataKeys->insert(QMediaMetaData::VideoCodec, GST_TAG_VIDEO_CODEC);
|
||||
|
||||
//{ QMediaMetaData::PosterUrl, 0 },
|
||||
//metadataKeys->insert(QMediaMetaData::PosterUrl, 0);
|
||||
|
||||
// Movie
|
||||
//{ QMediaMetaData::ChapterNumber, 0 },
|
||||
//{ QMediaMetaData::Director, 0 },
|
||||
{ QMediaMetaData::LeadPerformer, GST_TAG_PERFORMER },
|
||||
//{ QMediaMetaData::Writer, 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
|
||||
//{ QMediaMetaData::CameraManufacturer, 0 },
|
||||
//{ QMediaMetaData::CameraModel, 0 },
|
||||
//{ QMediaMetaData::Event, 0 },
|
||||
//{ QMediaMetaData::Subject, 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)
|
||||
@@ -128,50 +130,30 @@ QGstreamerCaptureMetaDataControl::QGstreamerCaptureMetaDataControl(QObject *pare
|
||||
|
||||
QVariant QGstreamerCaptureMetaDataControl::metaData(const QString &key) const
|
||||
{
|
||||
static const int count = sizeof(qt_gstreamerMetaDataKeys) / sizeof(QGstreamerMetaDataKeyLookup);
|
||||
QGstreamerMetaDataKeyLookup::const_iterator it = qt_gstreamerMetaDataKeys()->find(key);
|
||||
if (it != qt_gstreamerMetaDataKeys()->constEnd())
|
||||
return m_values.value(it.value());
|
||||
|
||||
for (int i = 0; i < count; ++i) {
|
||||
if (qt_gstreamerMetaDataKeys[i].key == key) {
|
||||
const char *name = qt_gstreamerMetaDataKeys[i].token;
|
||||
|
||||
return m_values.value(QByteArray::fromRawData(name, qstrlen(name)));
|
||||
}
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
void QGstreamerCaptureMetaDataControl::setMetaData(const QString &key, const QVariant &value)
|
||||
{
|
||||
static const int count = sizeof(qt_gstreamerMetaDataKeys) / sizeof(QGstreamerMetaDataKeyLookup);
|
||||
QGstreamerMetaDataKeyLookup::const_iterator it = qt_gstreamerMetaDataKeys()->find(key);
|
||||
if (it != qt_gstreamerMetaDataKeys()->constEnd()) {
|
||||
m_values.insert(it.value(), value);
|
||||
|
||||
for (int i = 0; i < count; ++i) {
|
||||
if (qt_gstreamerMetaDataKeys[i].key == key) {
|
||||
const char *name = qt_gstreamerMetaDataKeys[i].token;
|
||||
|
||||
m_values.insert(QByteArray::fromRawData(name, qstrlen(name)), value);
|
||||
|
||||
emit QMetaDataWriterControl::metaDataChanged();
|
||||
emit QMetaDataWriterControl::metaDataChanged(key, value);
|
||||
emit metaDataChanged(m_values);
|
||||
|
||||
return;
|
||||
}
|
||||
emit QMetaDataWriterControl::metaDataChanged();
|
||||
emit QMetaDataWriterControl::metaDataChanged(key, value);
|
||||
emit metaDataChanged(m_values);
|
||||
}
|
||||
}
|
||||
|
||||
QStringList QGstreamerCaptureMetaDataControl::availableMetaData() const
|
||||
{
|
||||
static QMap<QByteArray, QString> keysMap;
|
||||
if (keysMap.isEmpty()) {
|
||||
const int count = sizeof(qt_gstreamerMetaDataKeys) / sizeof(QGstreamerMetaDataKeyLookup);
|
||||
for (int i = 0; i < count; ++i) {
|
||||
keysMap[QByteArray(qt_gstreamerMetaDataKeys[i].token)] = qt_gstreamerMetaDataKeys[i].key;
|
||||
}
|
||||
}
|
||||
|
||||
QStringList res;
|
||||
foreach (const QByteArray &key, m_values.keys()) {
|
||||
QString tag = keysMap.value(key);
|
||||
QString tag = qt_gstreamerMetaDataKeys()->key(key);
|
||||
if (!tag.isEmpty())
|
||||
res.append(tag);
|
||||
}
|
||||
|
||||
@@ -48,90 +48,86 @@
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
struct QGstreamerMetaDataKeyLookup
|
||||
typedef QMap<QByteArray, QString> QGstreamerMetaDataKeyLookup;
|
||||
Q_GLOBAL_STATIC(QGstreamerMetaDataKeyLookup, metadataKeys)
|
||||
|
||||
static const QGstreamerMetaDataKeyLookup *qt_gstreamerMetaDataKeys()
|
||||
{
|
||||
QString key;
|
||||
const char *token;
|
||||
};
|
||||
if (metadataKeys->isEmpty()) {
|
||||
metadataKeys->insert(GST_TAG_TITLE, QMediaMetaData::Title);
|
||||
//metadataKeys->insert(0, QMediaMetaData::SubTitle);
|
||||
//metadataKeys->insert(0, QMediaMetaData::Author);
|
||||
metadataKeys->insert(GST_TAG_COMMENT, QMediaMetaData::Comment);
|
||||
metadataKeys->insert(GST_TAG_DESCRIPTION, QMediaMetaData::Description);
|
||||
//metadataKeys->insert(0, QMediaMetaData::Category);
|
||||
metadataKeys->insert(GST_TAG_GENRE, QMediaMetaData::Genre);
|
||||
metadataKeys->insert("year", QMediaMetaData::Year);
|
||||
//metadataKeys->insert(0, QMediaMetaData::UserRating);
|
||||
|
||||
static const QGstreamerMetaDataKeyLookup qt_gstreamerMetaDataKeys[] =
|
||||
{
|
||||
{ QMediaMetaData::Title, GST_TAG_TITLE },
|
||||
//{ QMediaMetaData::SubTitle, 0 },
|
||||
//{ QMediaMetaData::Author, 0 },
|
||||
{ QMediaMetaData::Comment, GST_TAG_COMMENT },
|
||||
{ QMediaMetaData::Description, GST_TAG_DESCRIPTION },
|
||||
//{ QMediaMetaData::Category, 0 },
|
||||
{ QMediaMetaData::Genre, GST_TAG_GENRE },
|
||||
{ QMediaMetaData::Year, "year" },
|
||||
//{ QMediaMetaData::UserRating, 0 },
|
||||
metadataKeys->insert(GST_TAG_LANGUAGE_CODE, QMediaMetaData::Language);
|
||||
|
||||
{ QMediaMetaData::Language, GST_TAG_LANGUAGE_CODE },
|
||||
metadataKeys->insert(GST_TAG_ORGANIZATION, QMediaMetaData::Publisher);
|
||||
metadataKeys->insert(GST_TAG_COPYRIGHT, QMediaMetaData::Copyright);
|
||||
//metadataKeys->insert(0, QMediaMetaData::ParentalRating);
|
||||
//metadataKeys->insert(0, QMediaMetaData::RatingOrganisation);
|
||||
|
||||
{ QMediaMetaData::Publisher, GST_TAG_ORGANIZATION },
|
||||
{ QMediaMetaData::Copyright, GST_TAG_COPYRIGHT },
|
||||
//{ QMediaMetaData::ParentalRating, 0 },
|
||||
//{ QMediaMetaData::RatingOrganisation, 0 },
|
||||
// Media
|
||||
//metadataKeys->insert(0, QMediaMetaData::Size);
|
||||
//metadataKeys->insert(0,QMediaMetaData::MediaType );
|
||||
metadataKeys->insert(GST_TAG_DURATION, QMediaMetaData::Duration);
|
||||
|
||||
// Media
|
||||
//{ QMediaMetaData::Size, 0 },
|
||||
//{ QMediaMetaData::MediaType, 0 },
|
||||
{ QMediaMetaData::Duration, GST_TAG_DURATION },
|
||||
// Audio
|
||||
metadataKeys->insert(GST_TAG_BITRATE, QMediaMetaData::AudioBitRate);
|
||||
metadataKeys->insert(GST_TAG_AUDIO_CODEC, QMediaMetaData::AudioCodec);
|
||||
//metadataKeys->insert(0, QMediaMetaData::ChannelCount);
|
||||
//metadataKeys->insert(0, QMediaMetaData::SampleRate);
|
||||
|
||||
// Audio
|
||||
{ QMediaMetaData::AudioBitRate, GST_TAG_BITRATE },
|
||||
{ QMediaMetaData::AudioCodec, GST_TAG_AUDIO_CODEC },
|
||||
//{ QMediaMetaData::ChannelCount, 0 },
|
||||
//{ QMediaMetaData::SampleRate, 0 },
|
||||
|
||||
// Music
|
||||
{ QMediaMetaData::AlbumTitle, GST_TAG_ALBUM },
|
||||
{ QMediaMetaData::AlbumArtist, GST_TAG_ARTIST},
|
||||
{ QMediaMetaData::ContributingArtist, GST_TAG_PERFORMER },
|
||||
// Music
|
||||
metadataKeys->insert(GST_TAG_ALBUM, QMediaMetaData::AlbumTitle);
|
||||
metadataKeys->insert(GST_TAG_ARTIST, QMediaMetaData::AlbumArtist);
|
||||
metadataKeys->insert(GST_TAG_PERFORMER, QMediaMetaData::ContributingArtist);
|
||||
#if (GST_VERSION_MAJOR >= 0) && (GST_VERSION_MINOR >= 10) && (GST_VERSION_MICRO >= 19)
|
||||
{ QMediaMetaData::Composer, GST_TAG_COMPOSER },
|
||||
metadataKeys->insert(GST_TAG_COMPOSER, QMediaMetaData::Composer);
|
||||
#endif
|
||||
//{ QMediaMetaData::Conductor, 0 },
|
||||
//{ QMediaMetaData::Lyrics, 0 },
|
||||
//{ QMediaMetaData::Mood, 0 },
|
||||
{ QMediaMetaData::TrackNumber, GST_TAG_TRACK_NUMBER },
|
||||
//metadataKeys->insert(0, QMediaMetaData::Conductor);
|
||||
//metadataKeys->insert(0, QMediaMetaData::Lyrics);
|
||||
//metadataKeys->insert(0, QMediaMetaData::Mood);
|
||||
metadataKeys->insert(GST_TAG_TRACK_NUMBER, QMediaMetaData::TrackNumber);
|
||||
|
||||
//{ QMediaMetaData::CoverArtUrlSmall, 0 },
|
||||
//{ QMediaMetaData::CoverArtUrlLarge, 0 },
|
||||
//metadataKeys->insert(0, QMediaMetaData::CoverArtUrlSmall);
|
||||
//metadataKeys->insert(0, QMediaMetaData::CoverArtUrlLarge);
|
||||
|
||||
// Image/Video
|
||||
{ QMediaMetaData::Resolution, "resolution" },
|
||||
{ QMediaMetaData::PixelAspectRatio, "pixel-aspect-ratio" },
|
||||
// Image/Video
|
||||
metadataKeys->insert("resolution", QMediaMetaData::Resolution);
|
||||
metadataKeys->insert("pixel-aspect-ratio", QMediaMetaData::PixelAspectRatio);
|
||||
|
||||
// Video
|
||||
//{ QMediaMetaData::VideoFrameRate, 0 },
|
||||
//{ QMediaMetaData::VideoBitRate, 0 },
|
||||
{ QMediaMetaData::VideoCodec, GST_TAG_VIDEO_CODEC },
|
||||
// Video
|
||||
//metadataKeys->insert(0, QMediaMetaData::VideoFrameRate);
|
||||
//metadataKeys->insert(0, QMediaMetaData::VideoBitRate);
|
||||
metadataKeys->insert(GST_TAG_VIDEO_CODEC, QMediaMetaData::VideoCodec);
|
||||
|
||||
//{ QMediaMetaData::PosterUrl, 0 },
|
||||
//metadataKeys->insert(0, QMediaMetaData::PosterUrl);
|
||||
|
||||
// Movie
|
||||
//{ QMediaMetaData::ChapterNumber, 0 },
|
||||
//{ QMediaMetaData::Director, 0 },
|
||||
{ QMediaMetaData::LeadPerformer, GST_TAG_PERFORMER },
|
||||
//{ QMediaMetaData::Writer, 0 },
|
||||
// Movie
|
||||
//metadataKeys->insert(0, QMediaMetaData::ChapterNumber);
|
||||
//metadataKeys->insert(0, QMediaMetaData::Director);
|
||||
metadataKeys->insert(GST_TAG_PERFORMER, QMediaMetaData::LeadPerformer);
|
||||
//metadataKeys->insert(0, QMediaMetaData::Writer);
|
||||
|
||||
// Photos
|
||||
//{ QMediaMetaData::CameraManufacturer, 0 },
|
||||
//{ QMediaMetaData::CameraModel, 0 },
|
||||
//{ QMediaMetaData::Event, 0 },
|
||||
//{ QMediaMetaData::Subject, 0 }
|
||||
};
|
||||
// Photos
|
||||
//metadataKeys->insert(0, QMediaMetaData::CameraManufacturer);
|
||||
//metadataKeys->insert(0, QMediaMetaData::CameraModel);
|
||||
//metadataKeys->insert(0, QMediaMetaData::Event);
|
||||
//metadataKeys->insert(0, QMediaMetaData::Subject);
|
||||
}
|
||||
|
||||
return metadataKeys;
|
||||
}
|
||||
|
||||
QGstreamerMetaDataProvider::QGstreamerMetaDataProvider(QGstreamerPlayerSession *session, QObject *parent)
|
||||
:QMetaDataReaderControl(parent), m_session(session)
|
||||
{
|
||||
connect(m_session, SIGNAL(tagsChanged()), SLOT(updateTags()));
|
||||
|
||||
const int count = sizeof(qt_gstreamerMetaDataKeys) / sizeof(QGstreamerMetaDataKeyLookup);
|
||||
for (int i = 0; i < count; ++i) {
|
||||
m_keysMap[QByteArray(qt_gstreamerMetaDataKeys[i].token)] = qt_gstreamerMetaDataKeys[i].key;
|
||||
}
|
||||
}
|
||||
|
||||
QGstreamerMetaDataProvider::~QGstreamerMetaDataProvider()
|
||||
@@ -167,8 +163,8 @@ void QGstreamerMetaDataProvider::updateTags()
|
||||
QMapIterator<QByteArray ,QVariant> i(m_session->tags());
|
||||
while (i.hasNext()) {
|
||||
i.next();
|
||||
//use gstreamer native keys for elements not in m_keysMap
|
||||
QString key = m_keysMap.value(i.key(), i.key());
|
||||
//use gstreamer native keys for elements not in our key map
|
||||
QString key = qt_gstreamerMetaDataKeys()->value(i.key(), i.key());
|
||||
m_tags.insert(key, i.value());
|
||||
if (i.value() != oldTags.value(key)) {
|
||||
changed = true;
|
||||
|
||||
@@ -67,7 +67,6 @@ private slots:
|
||||
private:
|
||||
QGstreamerPlayerSession *m_session;
|
||||
QVariantMap m_tags;
|
||||
QMap<QByteArray, QString> m_keysMap;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
Reference in New Issue
Block a user