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:
Yoann Lopes
2016-08-17 13:55:10 +02:00
parent c4bf444f5c
commit 81a48edb54
2 changed files with 57 additions and 51 deletions

View File

@@ -58,7 +58,7 @@ private Q_SLOTS:
private:
AVFMediaPlayerSession *m_session;
QMap<QString, QVariant> m_tags;
QVariantMap m_tags;
void *m_asset;
};

View File

@@ -75,6 +75,41 @@ QStringList AVFMediaPlayerMetaDataControl::availableMetaData() const
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()
{
#ifdef QT_DEBUG_AVF
@@ -83,67 +118,38 @@ void AVFMediaPlayerMetaDataControl::updateTags()
AVAsset *currentAsset = (AVAsset*)m_session->currentAssetHandle();
//Don't read the tags from the same asset more than once
if (currentAsset == m_asset) {
if (currentAsset == m_asset)
return;
}
m_asset = currentAsset;
QVariantMap oldTags = m_tags;
//Since we've changed assets, clear old tags
m_tags.clear();
bool changed = false;
NSArray *metadataFormats = [currentAsset availableMetadataFormats];
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];
// TODO: also process ID3, iTunes and QuickTime metadata
if (keyString.length != 0) {
//Process "commonMetadata" tags here:
if ([keyString isEqualToString:AVMetadataCommonKeyTitle]) {
m_tags.insert(QMediaMetaData::Title, QString([value UTF8String]));
} else if ([keyString isEqualToString: AVMetadataCommonKeyCreator]) {
m_tags.insert(QMediaMetaData::Author, QString([value UTF8String]));
} else if ([keyString isEqualToString: AVMetadataCommonKeySubject]) {
m_tags.insert(QMediaMetaData::SubTitle, QString([value UTF8String]));
} else if ([keyString isEqualToString: AVMetadataCommonKeyDescription]) {
m_tags.insert(QMediaMetaData::Description, QString([value UTF8String]));
} 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]));
NSArray *metadataItems = [currentAsset commonMetadata];
for (AVMetadataItem* item in metadataItems) {
const QString key = itemKey(item);
if (!key.isEmpty()) {
const QString value = QString::fromNSString([item stringValue]);
if (!value.isNull()) {
m_tags.insert(key, value);
if (value != oldTags.value(key)) {
changed = true;
Q_EMIT metaDataChanged(key, value);
}
}
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();
}