DirectShow: fix metadata signals when changing media.

The metaDataChanged() and metaDataAvailableChanged() signals should
be emitted immediately when changing or clearing the current media.

Change-Id: I3152e2c32420ba6f11cf6780013e02208a9d6599
Reviewed-by: Christian Stromme <christian.stromme@theqtcompany.com>
This commit is contained in:
Yoann Lopes
2015-11-01 18:13:40 +01:00
parent 704ac34cc7
commit e3123185a5
3 changed files with 29 additions and 12 deletions

View File

@@ -362,7 +362,18 @@ static QString convertBSTR(BSTR *string)
return value;
}
void DirectShowMetaDataControl::updateGraph(IFilterGraph2 *graph, IBaseFilter *source, const QString &fileSrc)
void DirectShowMetaDataControl::reset()
{
bool hadMetadata = !m_metadata.isEmpty();
m_metadata.clear();
setMetadataAvailable(false);
if (hadMetadata)
emit metaDataChanged();
}
void DirectShowMetaDataControl::updateMetadata(IFilterGraph2 *graph, IBaseFilter *source, const QString &fileSrc)
{
m_metadata.clear();
@@ -568,13 +579,19 @@ void DirectShowMetaDataControl::customEvent(QEvent *event)
if (event->type() == QEvent::Type(MetaDataChanged)) {
event->accept();
bool oldAvailable = m_available;
m_available = !m_metadata.isEmpty();
if (m_available != oldAvailable)
emit metaDataAvailableChanged(m_available);
setMetadataAvailable(!m_metadata.isEmpty());
emit metaDataChanged();
} else {
QMetaDataReaderControl::customEvent(event);
}
}
void DirectShowMetaDataControl::setMetadataAvailable(bool available)
{
if (m_available == available)
return;
m_available = available;
emit metaDataAvailableChanged(m_available);
}

View File

@@ -56,13 +56,16 @@ public:
QVariant metaData(const QString &key) const;
QStringList availableMetaData() const;
void updateGraph(IFilterGraph2 *graph, IBaseFilter *source,
const QString &fileSrc = QString());
void reset();
void updateMetadata(IFilterGraph2 *graph, IBaseFilter *source,
const QString &fileSrc = QString());
protected:
void customEvent(QEvent *event);
private:
void setMetadataAvailable(bool available);
enum Event
{
MetaDataChanged = QEvent::User

View File

@@ -231,7 +231,7 @@ void DirectShowPlayerService::load(const QMediaContent &media, QIODevice *stream
m_seekable = false;
m_atEnd = false;
m_dontCacheNextSeekResult = false;
m_metaDataControl->updateGraph(0, 0);
m_metaDataControl->reset();
if (m_resources.isEmpty() && !stream) {
m_pendingTasks = 0;
@@ -570,9 +570,6 @@ void DirectShowPlayerService::doReleaseGraph(QMutexLocker *locker)
control->Release();
}
//release m_headerInfo -> decrease ref counter of m_source
m_metaDataControl->updateGraph(0, 0);
if (m_source) {
m_source->Release();
m_source = 0;
@@ -1138,7 +1135,7 @@ void DirectShowPlayerService::customEvent(QEvent *event)
QMutexLocker locker(&m_mutex);
m_playerControl->updateMediaInfo(m_duration, m_streamTypes, m_seekable);
m_metaDataControl->updateGraph(m_graph, m_source, m_url.toString());
m_metaDataControl->updateMetadata(m_graph, m_source, m_url.toString());
updateStatus();
} else if (event->type() == QEvent::Type(Error)) {