AVFoundation: fix metadata control
Correctly emit metaDataAvailableChanged and metaDataChanged signals. Task-number: QTBUG-46368 Change-Id: Ic79acd519b47f4d864fa335c8f75758fe9185c39 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
This commit is contained in:
@@ -58,7 +58,7 @@ private Q_SLOTS:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
AVFMediaPlayerSession *m_session;
|
AVFMediaPlayerSession *m_session;
|
||||||
QMap<QString, QVariant> m_tags;
|
QVariantMap m_tags;
|
||||||
void *m_asset;
|
void *m_asset;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -75,6 +75,41 @@ QStringList AVFMediaPlayerMetaDataControl::availableMetaData() const
|
|||||||
return m_tags.keys();
|
return m_tags.keys();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QString itemKey(AVMetadataItem *item)
|
||||||
|
{
|
||||||
|
NSString *keyString = [item commonKey];
|
||||||
|
|
||||||
|
if (keyString.length != 0) {
|
||||||
|
if ([keyString isEqualToString:AVMetadataCommonKeyTitle]) {
|
||||||
|
return QMediaMetaData::Title;
|
||||||
|
} else if ([keyString isEqualToString: AVMetadataCommonKeySubject]) {
|
||||||
|
return QMediaMetaData::SubTitle;
|
||||||
|
} else if ([keyString isEqualToString: AVMetadataCommonKeyDescription]) {
|
||||||
|
return QMediaMetaData::Description;
|
||||||
|
} else if ([keyString isEqualToString: AVMetadataCommonKeyPublisher]) {
|
||||||
|
return QMediaMetaData::Publisher;
|
||||||
|
} else if ([keyString isEqualToString: AVMetadataCommonKeyCreationDate]) {
|
||||||
|
return QMediaMetaData::Date;
|
||||||
|
} else if ([keyString isEqualToString: AVMetadataCommonKeyType]) {
|
||||||
|
return QMediaMetaData::MediaType;
|
||||||
|
} else if ([keyString isEqualToString: AVMetadataCommonKeyLanguage]) {
|
||||||
|
return QMediaMetaData::Language;
|
||||||
|
} else if ([keyString isEqualToString: AVMetadataCommonKeyCopyrights]) {
|
||||||
|
return QMediaMetaData::Copyright;
|
||||||
|
} else if ([keyString isEqualToString: AVMetadataCommonKeyAlbumName]) {
|
||||||
|
return QMediaMetaData::AlbumTitle;
|
||||||
|
} else if ([keyString isEqualToString: AVMetadataCommonKeyAuthor]) {
|
||||||
|
return QMediaMetaData::Author;
|
||||||
|
} else if ([keyString isEqualToString: AVMetadataCommonKeyArtist]) {
|
||||||
|
return QMediaMetaData::ContributingArtist;
|
||||||
|
} else if ([keyString isEqualToString: AVMetadataCommonKeyArtwork]) {
|
||||||
|
return QMediaMetaData::PosterUrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
void AVFMediaPlayerMetaDataControl::updateTags()
|
void AVFMediaPlayerMetaDataControl::updateTags()
|
||||||
{
|
{
|
||||||
#ifdef QT_DEBUG_AVF
|
#ifdef QT_DEBUG_AVF
|
||||||
@@ -83,67 +118,38 @@ void AVFMediaPlayerMetaDataControl::updateTags()
|
|||||||
AVAsset *currentAsset = (AVAsset*)m_session->currentAssetHandle();
|
AVAsset *currentAsset = (AVAsset*)m_session->currentAssetHandle();
|
||||||
|
|
||||||
//Don't read the tags from the same asset more than once
|
//Don't read the tags from the same asset more than once
|
||||||
if (currentAsset == m_asset) {
|
if (currentAsset == m_asset)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
m_asset = currentAsset;
|
m_asset = currentAsset;
|
||||||
|
|
||||||
|
QVariantMap oldTags = m_tags;
|
||||||
//Since we've changed assets, clear old tags
|
//Since we've changed assets, clear old tags
|
||||||
m_tags.clear();
|
m_tags.clear();
|
||||||
|
bool changed = false;
|
||||||
|
|
||||||
NSArray *metadataFormats = [currentAsset availableMetadataFormats];
|
// TODO: also process ID3, iTunes and QuickTime metadata
|
||||||
for ( NSString *format in metadataFormats) {
|
|
||||||
#ifdef QT_DEBUG_AVF
|
|
||||||
qDebug() << "format: " << [format UTF8String];
|
|
||||||
#endif
|
|
||||||
NSArray *metadataItems = [currentAsset metadataForFormat:format];
|
|
||||||
for (AVMetadataItem* item in metadataItems) {
|
|
||||||
NSString *keyString = [item commonKey];
|
|
||||||
NSString *value = [item stringValue];
|
|
||||||
|
|
||||||
if (keyString.length != 0) {
|
NSArray *metadataItems = [currentAsset commonMetadata];
|
||||||
//Process "commonMetadata" tags here:
|
for (AVMetadataItem* item in metadataItems) {
|
||||||
if ([keyString isEqualToString:AVMetadataCommonKeyTitle]) {
|
const QString key = itemKey(item);
|
||||||
m_tags.insert(QMediaMetaData::Title, QString([value UTF8String]));
|
if (!key.isEmpty()) {
|
||||||
} else if ([keyString isEqualToString: AVMetadataCommonKeyCreator]) {
|
const QString value = QString::fromNSString([item stringValue]);
|
||||||
m_tags.insert(QMediaMetaData::Author, QString([value UTF8String]));
|
if (!value.isNull()) {
|
||||||
} else if ([keyString isEqualToString: AVMetadataCommonKeySubject]) {
|
m_tags.insert(key, value);
|
||||||
m_tags.insert(QMediaMetaData::SubTitle, QString([value UTF8String]));
|
if (value != oldTags.value(key)) {
|
||||||
} else if ([keyString isEqualToString: AVMetadataCommonKeyDescription]) {
|
changed = true;
|
||||||
m_tags.insert(QMediaMetaData::Description, QString([value UTF8String]));
|
Q_EMIT metaDataChanged(key, value);
|
||||||
} else if ([keyString isEqualToString: AVMetadataCommonKeyPublisher]) {
|
|
||||||
m_tags.insert(QMediaMetaData::Publisher, QString([value UTF8String]));
|
|
||||||
} else if ([keyString isEqualToString: AVMetadataCommonKeyContributor]) {
|
|
||||||
m_tags.insert(QMediaMetaData::ContributingArtist, QString([value UTF8String]));
|
|
||||||
} else if ([keyString isEqualToString: AVMetadataCommonKeyCreationDate]) {
|
|
||||||
m_tags.insert(QMediaMetaData::Date, QString([value UTF8String]));
|
|
||||||
} else if ([keyString isEqualToString: AVMetadataCommonKeyType]) {
|
|
||||||
m_tags.insert(QMediaMetaData::MediaType, QString([value UTF8String]));
|
|
||||||
} else if ([keyString isEqualToString: AVMetadataCommonKeyLanguage]) {
|
|
||||||
m_tags.insert(QMediaMetaData::Language, QString([value UTF8String]));
|
|
||||||
} else if ([keyString isEqualToString: AVMetadataCommonKeyCopyrights]) {
|
|
||||||
m_tags.insert(QMediaMetaData::Copyright, QString([value UTF8String]));
|
|
||||||
} else if ([keyString isEqualToString: AVMetadataCommonKeyAlbumName]) {
|
|
||||||
m_tags.insert(QMediaMetaData::AlbumTitle, QString([value UTF8String]));
|
|
||||||
} else if ([keyString isEqualToString: AVMetadataCommonKeyAuthor]) {
|
|
||||||
m_tags.insert(QMediaMetaData::Author, QString([value UTF8String]));
|
|
||||||
} else if ([keyString isEqualToString: AVMetadataCommonKeyArtist]) {
|
|
||||||
m_tags.insert(QMediaMetaData::AlbumArtist, QString([value UTF8String]));
|
|
||||||
} else if ([keyString isEqualToString: AVMetadataCommonKeyArtwork]) {
|
|
||||||
m_tags.insert(QMediaMetaData::PosterUrl, QString([value UTF8String]));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([format isEqualToString:AVMetadataFormatID3Metadata]) {
|
|
||||||
//TODO: Process ID3 metadata
|
|
||||||
} else if ([format isEqualToString:AVMetadataFormatiTunesMetadata]) {
|
|
||||||
//TODO: Process iTunes metadata
|
|
||||||
} else if ([format isEqualToString:AVMetadataFormatQuickTimeUserData]) {
|
|
||||||
//TODO: Process QuickTime metadata
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Q_EMIT metaDataChanged();
|
if (oldTags.isEmpty() != m_tags.isEmpty()) {
|
||||||
|
Q_EMIT metaDataAvailableChanged(!m_tags.isEmpty());
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (changed)
|
||||||
|
Q_EMIT metaDataChanged();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user