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