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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user