WMF: Recreate the MFMediaSession when loading a new media.

MFMediaSession doesn't seem to handle correctly the change of media
source, causing the playback not to work afterwards.
A single MFMediaSession was created and used for every loaded media, we
now create a new one whenever we load a new media (releasing the old one
beforehand).

Task-number: QTBUG-26819

Change-Id: Id99c9dd54e161823d9580933e063f16240806529
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
Reviewed-by: Jason Barron <jason@cutehacks.com>
This commit is contained in:
Yoann Lopes
2012-12-06 16:00:06 +01:00
committed by The Qt Project
parent ad83534736
commit 06b63e99e4
8 changed files with 133 additions and 47 deletions

View File

@@ -2130,17 +2130,23 @@ namespace
MFVideoRendererControl::MFVideoRendererControl(QObject *parent)
: QVideoRendererControl(parent)
, m_surface(0)
, m_currentActivate(0)
, m_callback(0)
{
m_currentActivate = new VideoRendererActivate(this);
}
MFVideoRendererControl::~MFVideoRendererControl()
{
clear();
}
void MFVideoRendererControl::clear()
{
if (m_currentActivate) {
m_currentActivate->ShutdownObject();
m_currentActivate->Release();
}
m_currentActivate = NULL;
}
QAbstractVideoSurface *MFVideoRendererControl::surface() const
@@ -2150,9 +2156,6 @@ QAbstractVideoSurface *MFVideoRendererControl::surface() const
void MFVideoRendererControl::setSurface(QAbstractVideoSurface *surface)
{
if (m_surface == surface)
return;
if (m_surface)
disconnect(m_surface, SIGNAL(supportedFormatsChanged()), this, SLOT(supportedFormatsChanged()));
m_surface = surface;
@@ -2160,11 +2163,16 @@ void MFVideoRendererControl::setSurface(QAbstractVideoSurface *surface)
if (m_surface) {
connect(m_surface, SIGNAL(supportedFormatsChanged()), this, SLOT(supportedFormatsChanged()));
}
static_cast<VideoRendererActivate*>(m_currentActivate)->setSurface(m_surface);
if (m_currentActivate)
static_cast<VideoRendererActivate*>(m_currentActivate)->setSurface(m_surface);
}
void MFVideoRendererControl::customEvent(QEvent *event)
{
if (!m_currentActivate)
return;
if (event->type() == MediaStream::PresentSurface) {
MFTIME targetTime = static_cast<MediaStream::PresentEvent*>(event)->targetTime();
MFTIME currentTime = static_cast<VideoRendererActivate*>(m_currentActivate)->getTime();
@@ -2185,16 +2193,26 @@ void MFVideoRendererControl::customEvent(QEvent *event)
void MFVideoRendererControl::supportedFormatsChanged()
{
static_cast<VideoRendererActivate*>(m_currentActivate)->supportedFormatsChanged();
if (m_currentActivate)
static_cast<VideoRendererActivate*>(m_currentActivate)->supportedFormatsChanged();
}
void MFVideoRendererControl::present()
{
static_cast<VideoRendererActivate*>(m_currentActivate)->present();
if (m_currentActivate)
static_cast<VideoRendererActivate*>(m_currentActivate)->present();
}
IMFActivate* MFVideoRendererControl::currentActivate() const
IMFActivate* MFVideoRendererControl::createActivate()
{
clear();
m_currentActivate = new VideoRendererActivate(this);
if (m_surface) {
setSurface(m_surface);
supportedFormatsChanged();
}
return m_currentActivate;
}