WMF: fix crash on media player destruction.
A race condition could cause a frame to be presented even after the QAbstractVideoSurface was deleted. We now check that the surface is valid before presenting a frame. Task-number: QTBUG-41158 Change-Id: If593469a8267583e499e781336af38d3fbf318fd Reviewed-by: Christian Stromme <christian.stromme@digia.com>
This commit is contained in:
@@ -330,34 +330,36 @@ void D3DPresentEngine::presentSample(void *opaque, qint64)
|
|||||||
IMFMediaBuffer* buffer = NULL;
|
IMFMediaBuffer* buffer = NULL;
|
||||||
IDirect3DSurface9* surface = NULL;
|
IDirect3DSurface9* surface = NULL;
|
||||||
|
|
||||||
if (sample) {
|
if (m_surface && m_surface->isActive()) {
|
||||||
// Get the buffer from the sample.
|
if (sample) {
|
||||||
hr = sample->GetBufferByIndex(0, &buffer);
|
// Get the buffer from the sample.
|
||||||
if (FAILED(hr))
|
hr = sample->GetBufferByIndex(0, &buffer);
|
||||||
goto done;
|
if (FAILED(hr))
|
||||||
|
goto done;
|
||||||
|
|
||||||
// Get the surface from the buffer.
|
// Get the surface from the buffer.
|
||||||
hr = MFGetService(buffer, MR_BUFFER_SERVICE, IID_PPV_ARGS(&surface));
|
hr = MFGetService(buffer, MR_BUFFER_SERVICE, IID_PPV_ARGS(&surface));
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
goto done;
|
goto done;
|
||||||
}
|
|
||||||
|
|
||||||
if (surface && updateTexture(surface)) {
|
|
||||||
QVideoFrame frame = QVideoFrame(new TextureVideoBuffer(m_glTexture),
|
|
||||||
m_surfaceFormat.frameSize(),
|
|
||||||
m_surfaceFormat.pixelFormat());
|
|
||||||
|
|
||||||
// WMF uses 100-nanosecond units, Qt uses microseconds
|
|
||||||
LONGLONG startTime = -1;
|
|
||||||
if (SUCCEEDED(sample->GetSampleTime(&startTime))) {
|
|
||||||
frame.setStartTime(startTime * 0.1);
|
|
||||||
|
|
||||||
LONGLONG duration = -1;
|
|
||||||
if (SUCCEEDED(sample->GetSampleDuration(&duration)))
|
|
||||||
frame.setEndTime((startTime + duration) * 0.1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_surface->present(frame);
|
if (surface && updateTexture(surface)) {
|
||||||
|
QVideoFrame frame = QVideoFrame(new TextureVideoBuffer(m_glTexture),
|
||||||
|
m_surfaceFormat.frameSize(),
|
||||||
|
m_surfaceFormat.pixelFormat());
|
||||||
|
|
||||||
|
// WMF uses 100-nanosecond units, Qt uses microseconds
|
||||||
|
LONGLONG startTime = -1;
|
||||||
|
if (SUCCEEDED(sample->GetSampleTime(&startTime))) {
|
||||||
|
frame.setStartTime(startTime * 0.1);
|
||||||
|
|
||||||
|
LONGLONG duration = -1;
|
||||||
|
if (SUCCEEDED(sample->GetSampleDuration(&duration)))
|
||||||
|
frame.setEndTime((startTime + duration) * 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_surface->present(frame);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
|||||||
Reference in New Issue
Block a user