From 6ed348b476938c9401f1f9bb751f3a0f2f4ac310 Mon Sep 17 00:00:00 2001 From: Val Doroshchuk Date: Tue, 25 Sep 2018 13:25:40 +0200 Subject: EVR: Fix crash when video source is changed and ANGLE is used Task-number: QTBUG-70672 Change-Id: I38c1e868dd05835489a49e6c29d9ad1a36a5f7a9 Reviewed-by: Christian Stromme --- src/plugins/common/evr/evrd3dpresentengine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/common/evr/evrd3dpresentengine.cpp b/src/plugins/common/evr/evrd3dpresentengine.cpp index 54403faba..f6f64836c 100644 --- a/src/plugins/common/evr/evrd3dpresentengine.cpp +++ b/src/plugins/common/evr/evrd3dpresentengine.cpp @@ -186,7 +186,7 @@ public: m_glContext->functions()->glBindTexture(GL_TEXTURE_2D, m_glTexture); m_egl->bindTexImage(m_eglDisplay, m_eglSurface, EGL_BACK_BUFFER); - return texture != NULL; + return *texture != NULL; } void release() -- cgit v1.2.3 From 6b0bbfadf483c5eaca90a4737399fa98ef0d9347 Mon Sep 17 00:00:00 2001 From: James McDonnell Date: Wed, 27 Jun 2018 15:57:04 -0400 Subject: Retrieve some information from the track metadata if available Later versions of the QNX 7.0.0 Multimedia component replace the top level audio/video metadata with track specific audio/video metadata. Change-Id: Ic88f23f8db9c06594da649d9e8fc4faf30acf1a0 Reviewed-by: Rafael Roquetto --- src/plugins/qnx/mediaplayer/mmrenderermetadata.cpp | 79 +++++++++++++++++----- 1 file changed, 61 insertions(+), 18 deletions(-) diff --git a/src/plugins/qnx/mediaplayer/mmrenderermetadata.cpp b/src/plugins/qnx/mediaplayer/mmrenderermetadata.cpp index 50b45382c..a8b92c267 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermetadata.cpp +++ b/src/plugins/qnx/mediaplayer/mmrenderermetadata.cpp @@ -42,6 +42,8 @@ #include #include +#include +#include #include static const char *strm_string_getx(const strm_string_t *sstr, const char *defaultValue) @@ -49,6 +51,13 @@ static const char *strm_string_getx(const strm_string_t *sstr, const char *defau return sstr ? strm_string_get(sstr) : defaultValue; } +#if _NTO_VERSION < 700 +static strm_dict_t *mmr_metadata_split(strm_dict_t const *, const char *, unsigned) +{ + return nullptr; +} +#endif + QT_BEGIN_NAMESPACE MmRendererMetaData::MmRendererMetaData() @@ -72,6 +81,12 @@ static const char * mediaTypeKey = "md_title_mediatype"; static const char * pixelWidthKey = "md_video_pixel_width"; static const char * pixelHeightKey = "md_video_pixel_height"; static const char * seekableKey = "md_title_seekable"; +static const char * trackSampleKey = "sample_rate"; +static const char * trackBitRateKey = "bitrate"; +static const char * trackWidthKey = "width"; +static const char * trackHeightKey = "height"; +static const char * trackPixelWidthKey = "pixel_width"; +static const char * trackPixelHeightKey = "pixel_height"; static const int mediaTypeAudioFlag = 4; static const int mediaTypeVideoFlag = 2; @@ -88,21 +103,9 @@ bool MmRendererMetaData::update(const strm_dict_t *dict) value = strm_dict_find_rstr(dict, durationKey); m_duration = QByteArray(strm_string_getx(value, "0")).toLongLong(); - value = strm_dict_find_rstr(dict, widthKey); - m_width = QByteArray(strm_string_getx(value, "0")).toInt(); - - value = strm_dict_find_rstr(dict, heightKey); - m_height = QByteArray(strm_string_getx(value, "0")).toInt(); - value = strm_dict_find_rstr(dict, mediaTypeKey); m_mediaType = QByteArray(strm_string_getx(value, "-1")).toInt(); - value = strm_dict_find_rstr(dict, pixelWidthKey); - m_pixelWidth = QByteArray(strm_string_getx(value, "1")).toFloat(); - - value = strm_dict_find_rstr(dict, pixelHeightKey); - m_pixelHeight = QByteArray(strm_string_getx(value, "1")).toFloat(); - value = strm_dict_find_rstr(dict, titleKey); m_title = QString::fromLatin1(QByteArray(strm_string_getx(value, nullptr))); @@ -121,18 +124,58 @@ bool MmRendererMetaData::update(const strm_dict_t *dict) value = strm_dict_find_rstr(dict, yearKey); m_year = QByteArray(strm_string_getx(value, "0")).toInt(); - value = strm_dict_find_rstr(dict, bitRateKey); - m_audioBitRate = QByteArray(strm_string_getx(value, "0")).toInt(); - - value = strm_dict_find_rstr(dict, sampleKey); - m_sampleRate = QByteArray(strm_string_getx(value, "0")).toInt(); - value = strm_dict_find_rstr(dict, albumKey); m_album = QString::fromLatin1(QByteArray(strm_string_getx(value, nullptr))); value = strm_dict_find_rstr(dict, trackKey); m_track = QByteArray(strm_string_getx(value, "0")).toInt(); + strm_dict_t *at = mmr_metadata_split(dict, "audio", 0); + if (at) { + value = strm_dict_find_rstr(at, trackSampleKey); + m_sampleRate = QByteArray(strm_string_getx(value, "0")).toInt(); + + value = strm_dict_find_rstr(at, trackBitRateKey); + m_audioBitRate = QByteArray(strm_string_getx(value, "0")).toInt(); + + strm_dict_destroy(at); + } else { + value = strm_dict_find_rstr(dict, sampleKey); + m_sampleRate = QByteArray(strm_string_getx(value, "0")).toInt(); + + value = strm_dict_find_rstr(dict, bitRateKey); + m_audioBitRate = QByteArray(strm_string_getx(value, "0")).toInt(); + } + + strm_dict_t *vt = mmr_metadata_split(dict, "video", 0); + if (vt) { + value = strm_dict_find_rstr(vt, trackWidthKey); + m_width = QByteArray(strm_string_getx(value, "0")).toInt(); + + value = strm_dict_find_rstr(vt, trackHeightKey); + m_height = QByteArray(strm_string_getx(value, "0")).toInt(); + + value = strm_dict_find_rstr(vt, trackPixelWidthKey); + m_pixelWidth = QByteArray(strm_string_getx(value, "1")).toFloat(); + + value = strm_dict_find_rstr(vt, trackPixelHeightKey); + m_pixelHeight = QByteArray(strm_string_getx(value, "1")).toFloat(); + + strm_dict_destroy(vt); + } else { + value = strm_dict_find_rstr(dict, widthKey); + m_width = QByteArray(strm_string_getx(value, "0")).toInt(); + + value = strm_dict_find_rstr(dict, heightKey); + m_height = QByteArray(strm_string_getx(value, "0")).toInt(); + + value = strm_dict_find_rstr(dict, pixelWidthKey); + m_pixelWidth = QByteArray(strm_string_getx(value, "1")).toFloat(); + + value = strm_dict_find_rstr(dict, pixelHeightKey); + m_pixelHeight = QByteArray(strm_string_getx(value, "1")).toFloat(); + } + return true; } -- cgit v1.2.3 From 78a57c2e335ba3eb5324275b7a33b4a244488f57 Mon Sep 17 00:00:00 2001 From: Val Doroshchuk Date: Wed, 26 Sep 2018 12:41:06 +0200 Subject: EVR: Fix crash when no resources created Saved a copy of texture id in IMFSampleVIdeoBuffer and init it on first call. Task-number: QTBUG-70672 Change-Id: Iaf8ff4f3faa952846eca5a764c88e57807d4d211 Reviewed-by: Oliver Wolff --- src/plugins/common/evr/evrd3dpresentengine.cpp | 44 +++++++++----------------- src/plugins/common/evr/evrd3dpresentengine.h | 3 +- 2 files changed, 16 insertions(+), 31 deletions(-) diff --git a/src/plugins/common/evr/evrd3dpresentengine.cpp b/src/plugins/common/evr/evrd3dpresentengine.cpp index f6f64836c..513fe66ca 100644 --- a/src/plugins/common/evr/evrd3dpresentengine.cpp +++ b/src/plugins/common/evr/evrd3dpresentengine.cpp @@ -143,11 +143,11 @@ public: return m_glTexture; } - bool createTexture(const QVideoSurfaceFormat &format, IDirect3DDevice9Ex *device, + void createTexture(const QVideoSurfaceFormat &format, IDirect3DDevice9Ex *device, IDirect3DTexture9 **texture) { if (!m_glContext) - return false; + return; m_glContext->functions()->glGenTextures(1, &m_glTexture); QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface(); @@ -185,8 +185,6 @@ public: m_glContext->functions()->glBindTexture(GL_TEXTURE_2D, m_glTexture); m_egl->bindTexImage(m_eglDisplay, m_eglSurface, EGL_BACK_BUFFER); - - return *texture != NULL; } void release() @@ -238,7 +236,6 @@ public: , m_sample(sample) , m_surface(0) , m_mapMode(NotMapped) - , m_textureUpdated(false) { if (m_sample) { m_sample->AddRef(); @@ -276,7 +273,7 @@ private: IMFSample *m_sample; IDirect3DSurface9 *m_surface; MapMode m_mapMode; - mutable bool m_textureUpdated; + mutable unsigned int m_textureId = 0; }; uchar *IMFSampleVideoBuffer::map(MapMode mode, int *numBytes, int *bytesPerLine) @@ -314,19 +311,12 @@ void IMFSampleVideoBuffer::unmap() QVariant IMFSampleVideoBuffer::handle() const { - QVariant handle; - #ifdef MAYBE_ANGLE - if (handleType() != GLTextureHandle) - return handle; - - if (m_textureUpdated || m_engine->updateTexture(m_surface)) { - m_textureUpdated = true; - handle = QVariant::fromValue(m_engine->m_glResources->glTexture()); - } + if (handleType() == GLTextureHandle && !m_textureId) + m_textureId = m_engine->updateTexture(m_surface); #endif - return handle; + return m_textureId; } @@ -618,24 +608,20 @@ QVideoFrame D3DPresentEngine::makeVideoFrame(IMFSample *sample) #ifdef MAYBE_ANGLE -bool D3DPresentEngine::createRenderTexture() +unsigned int D3DPresentEngine::updateTexture(IDirect3DSurface9 *src) { - if (m_glResources) - m_glResources->release(); + if (!m_texture) { + if (m_glResources) + m_glResources->release(); - m_glResources = new OpenGLResources; - return m_glResources->createTexture(m_surfaceFormat, m_device, &m_texture); -} - -bool D3DPresentEngine::updateTexture(IDirect3DSurface9 *src) -{ - if (!m_texture && !createRenderTexture()) - return false; + m_glResources = new OpenGLResources; + m_glResources->createTexture(m_surfaceFormat, m_device, &m_texture); + } IDirect3DSurface9 *dest = NULL; // Copy the sample surface to the shared D3D/EGL surface - HRESULT hr = m_texture->GetSurfaceLevel(0, &dest); + HRESULT hr = m_texture ? m_texture->GetSurfaceLevel(0, &dest) : E_FAIL; if (FAILED(hr)) goto done; @@ -657,7 +643,7 @@ bool D3DPresentEngine::updateTexture(IDirect3DSurface9 *src) done: qt_evr_safe_release(&dest); - return SUCCEEDED(hr); + return (SUCCEEDED(hr) && m_glResources) ? m_glResources->glTexture() : 0; } #endif // MAYBE_ANGLE diff --git a/src/plugins/common/evr/evrd3dpresentengine.h b/src/plugins/common/evr/evrd3dpresentengine.h index 18a7409fa..258d8b548 100644 --- a/src/plugins/common/evr/evrd3dpresentengine.h +++ b/src/plugins/common/evr/evrd3dpresentengine.h @@ -141,8 +141,7 @@ private: bool m_useTextureRendering; #ifdef MAYBE_ANGLE - bool createRenderTexture(); - bool updateTexture(IDirect3DSurface9 *src); + unsigned int updateTexture(IDirect3DSurface9 *src); OpenGLResources *m_glResources; IDirect3DTexture9 *m_texture; -- cgit v1.2.3 From ab9f3f089c6f9537ae316697ee151ad63c6618fd Mon Sep 17 00:00:00 2001 From: Val Doroshchuk Date: Thu, 4 Oct 2018 15:41:48 +0200 Subject: DirectShow: Fix crash when camera destroyed The lambda function is called even if the object is destroyed. Task-number: QTBUG-70932 Change-Id: I070059bd61769a6864a2848f2b537609577769de Reviewed-by: Oliver Wolff --- src/plugins/directshow/camera/dscameracontrol.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/directshow/camera/dscameracontrol.cpp b/src/plugins/directshow/camera/dscameracontrol.cpp index 7a2b46a2c..daf104e1c 100644 --- a/src/plugins/directshow/camera/dscameracontrol.cpp +++ b/src/plugins/directshow/camera/dscameracontrol.cpp @@ -51,7 +51,7 @@ DSCameraControl::DSCameraControl(QObject *parent) , m_captureMode(QCamera::CaptureStillImage) { m_session = qobject_cast(parent); - connect(m_session, &DSCameraSession::statusChanged, + connect(m_session, &DSCameraSession::statusChanged, this, [&](QCamera::Status status) { if (status == QCamera::UnloadedStatus) m_state = QCamera::UnloadedState; -- cgit v1.2.3