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; 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(); m_metadata.clear();
@@ -568,13 +579,19 @@ void DirectShowMetaDataControl::customEvent(QEvent *event)
if (event->type() == QEvent::Type(MetaDataChanged)) { if (event->type() == QEvent::Type(MetaDataChanged)) {
event->accept(); event->accept();
bool oldAvailable = m_available; setMetadataAvailable(!m_metadata.isEmpty());
m_available = !m_metadata.isEmpty();
if (m_available != oldAvailable)
emit metaDataAvailableChanged(m_available);
emit metaDataChanged(); emit metaDataChanged();
} else { } else {
QMetaDataReaderControl::customEvent(event); 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; QVariant metaData(const QString &key) const;
QStringList availableMetaData() const; QStringList availableMetaData() const;
void updateGraph(IFilterGraph2 *graph, IBaseFilter *source, void reset();
const QString &fileSrc = QString()); void updateMetadata(IFilterGraph2 *graph, IBaseFilter *source,
const QString &fileSrc = QString());
protected: protected:
void customEvent(QEvent *event); void customEvent(QEvent *event);
private: private:
void setMetadataAvailable(bool available);
enum Event enum Event
{ {
MetaDataChanged = QEvent::User MetaDataChanged = QEvent::User

View File

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