summaryrefslogtreecommitdiffstats
path: root/src/qtmultimediaquicktools
Commit message (Collapse)AuthorAgeFilesLines
* Doc: Fix documentation warningsTopi Reinio2019-11-131-1/+1
| | | | | | | | | | | | | | Mark member functions of \internal classes also as \internal, as otherwise QDoc fails to match function documentation with the declaration in the header. Comment out one instance of \instantiates referring to an internal class. Fixes: QTBUG-79834 Change-Id: I056c060537ee60beca128166ae3903ae3289a413 Reviewed-by: Venugopal Shivashankar <Venugopal.Shivashankar@qt.io> Reviewed-by: Paul Wicking <paul.wicking@qt.io>
* Merge remote-tracking branch 'origin/5.13' into 5.14v5.14.0-beta3Qt Forward Merge Bot2019-11-052-11/+17
|\ | | | | | | | | | | | | Conflicts: .qmake.conf Change-Id: I255dc22dc21d3629a41a8c2ae2076c48b594e626
| * Build without OpenGL supportAndy Shaw2019-10-242-11/+17
| | | | | | | | | | | | | | | | | | There is support for rendering video without OpenGL on most platforms although some features are unavailable as a result, so we can make sure that what is available can be used. Change-Id: I63938e8e4e8063fcc2064d0f9d8d5f10e0fb06f9 Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
* | Remove Format_ABGR32 from supported formats for sq texture video nodeVaL Doroshchuk2019-10-101-0/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Format_ABGR32 was introduced together with gst opengl support. And is supposed to be used with QT_GSTREAMER_USE_OPENGL_PLUGIN=1, Which should be fine for Raspberry Pi, but suddenly does not work for iMX boards. RPI's omxh264dec provides buffers in RGBA format, and corresponding textures will be created using GL_RGBA. Since we return Format_ABGR32 as supported format, which is RGBA, no conversion is needed and everything was ok. But for iMX, imxvpudec provides buffers in I420 format. And textures will be created using GL_RED with only 1 plane. Following patch https://bugzilla.gnome.org/show_bug.cgi?id=779067 requests RGBA too. Since incaps contains I420 and RGBA, and we say that we support RGBA, this leads to use buffers in I420 but *passthrough* in gst_gl_color_convert_element_prepare_output_buffer(). Since incaps and outcaps contain the same video format. No conversion will be done there and textures will be rendered incorrectly. Removing support of Format_ABGR32 from texture video node will cause to ignore requested RGBA from DIRECTVIV and perform converting, I420->BGRx on iMX and RGBA->BGRA on RPI. QT_GSTREAMER_USE_OPENGL_PLUGIN should be used together with decoders that use gpu memory. Otherwise some converting/uploading operations will be done which will also introduce some performance issues, so not recommended to be used for iMX. Change-Id: I8f037316c40587c81b2116c43a7262c6a70a5b44 Fixes: QTBUG-78855 Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io>
* | Merge remote-tracking branch 'origin/5.13' into 5.14Qt Forward Merge Bot2019-10-081-2/+1
|\| | | | | | | | | | | | | Conflicts: src/multimedia/configure.json Change-Id: Ie887a5f4d718cb3e082b0e2ee996c6687af330cb
| * Fix leaking QVideoFilterRunnable when window is closedVal Doroshchuk2019-10-011-2/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | When QDeclarativeVideoOutput::releaseResources() is called, means the window is going to be destroyed and it is too late to use scheduleRenderJob() to clear filters. This beforeSynchronizingJobs will not be handled in this case. Which produces a leak of filter's runnable. Fixes: QTBUG-51588 Change-Id: I71ec351463a2c4136d8b7e241d61e628a1b0c64b Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
* | Merge remote-tracking branch 'origin/5.13' into 5.14Qt Forward Merge Bot2019-09-121-2/+2
|\| | | | | | | | | | | | | | | Conflicts: src/gsttools/qgstvideorenderersink.cpp src/gsttools/qgstvideorenderersink_p.h Change-Id: I7fe29161d568fa3f7688abfd2f993d1b16ac3fb9
| * Fix crash when VideoOutput.sourceRect is requested but playback is stoppedVaL Doroshchuk2019-09-041-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When the playback is stopped, QAbstractVideoSurface::stop is called where current surface format is reset. And when sourceRect is requested before QAbstractVideoSurface::surfaceFormatChanged() is handled, it produces an ASSERT. Suggesting to use cached surfaceFormat instead of removing the ASSERT. To reproduce: MediaPlayer { onStatusChanged: console.log(output.sourceRect) } Change-Id: I73ad72f1e4968fe45266827ec5c7e3b36333ee30 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
* | Merge remote-tracking branch 'origin/5.13' into devQt Forward Merge Bot2019-07-301-2/+7
|\| | | | | | | Change-Id: I329eeefafed87ff7467d21d5d099cf9897660167
| * Merge remote-tracking branch 'origin/5.12' into 5.13Liang Qi2019-07-231-2/+7
| |\ | | | | | | | | | | | | | | | | | | Conflicts: src/plugins/directshow/player/directshowplayerservice.cpp Change-Id: I482098bb3c3b5b291175ca798b0d6ba61ad87d86
| | * VideoOutput: Update geometry only when the surface is activeVal Doroshchuk2019-07-181-2/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since starting the surface could be done after updating the geometry of VideoOutput element (paint event is received), and this leads setting invalid geometry to renderer and never updates by correct one. Because the geometry is not "dirty" anymore, means already set. Need just to update geometry when (or keep trying before) the surface is already started with proper video surface format. Change-Id: I338d7fe355c20f2027c6231241714376e9b569b2 Fixes: QTBUG-76205 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* | | Gstreamer: Introduce support of OpenGL pluginVaL Doroshchuk2019-05-151-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since uploading to gl texture is quite performance-wise operation introduced integration of opengl plugin which can provide a way to avoid uploading to texture on each draw on qt's side. Which potentially fixes some performance issues especially on embedded devices. Added glupload and glcolorconvert gst elements to pipeline. For qml apps current opengl context is provided to the gst plugin to share opengl data with. It allows at the end to just use gl textures that created and filled inside the gst. For overlay apps, glimagesink element is added. Requires gstreamer-gl-1.0 to be installed. Since this plugin is almost always available, so enabling it by default will break behavior of current pipeline and might introduce some side effects. Thus also provided QT_GSTREAMER_USE_OPENGL_PLUGIN env var to explicitly enable OpenGL features from gst. After this change video frames will be texture based. But it is still possible to map frames to download their data. In case if the video surface does not support gl textures, glmemory will be anyway requested, which will lead to uploading data, downloading and uploading it again to textures in scene graph video node. Task-number: QTBUG-66162 Change-Id: I32044ba0bf0c0cf90434d72f8991ad00927e1380 Reviewed-by: Christian Strømme <christian.stromme@qt.io>
* | | Add YUV422P format support to QVideoFrame and declarative rendererTomasz Olszak2019-05-101-8/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | [ChangeLog] Added QVideoFrame::Format_YUV422P. Change-Id: If7741db00cf0b628d7fc4b1cd3a6e424e0f8e2c0 Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io> Reviewed-by: Samuel Gaist <samuel.gaist@idiap.ch> Reviewed-by: Andy Shaw <andy.shaw@qt.io>
* | | QtMultimediaQuick: Move headers from multimedia dirVaL Doroshchuk2019-05-095-5/+512
|/ / | | | | | | | | | | | | Headers of multimedia quick module should not be placed in separate dir. Change-Id: Ie1f9df8339847ffbac8f22ac16ab0e613c46d037 Reviewed-by: Andy Shaw <andy.shaw@qt.io>
* | Doc: Fix multiple documentation issuesv5.13.0-beta3Topi Reinio2019-04-161-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - GstTools has some (internal) documentation, but was causing a number of warnings with QDoc's clang parser - exclude it from the documentation build. - Remove direct links from example documentation to individual example files; they no longer work. - Fix navigation for QML types; The main QML types pages did not list types for QtAudioEngiine. - Use \QtMinorVersion macro to make the documented import versions follow the minor Qt version. - Fix \since usage to be consistent throughout. - Fix linking issues for QML properties/methods - Minor language fixes Change-Id: I735cd13fa6dedd6bf06d6b6ef50ce2e0d69a545b Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
* | Add a revision of QML VideoOutput flushMode property to 5.13VaL Doroshchuk2019-02-251-0/+1
| | | | | | | | | | Change-Id: Ie7982232af45fd09a46854c96d7c7d6672857a97 Reviewed-by: Kai Koehne <kai.koehne@qt.io>
* | Merge remote-tracking branch 'origin/5.12' into 5.13Qt Forward Merge Bot2019-02-025-5/+9
|\| | | | | | | Change-Id: Ia13d887c3e3bf00b6ded5d052384fc5689b816fe
| * Fix comment for YUV fragment shadersSamuel Gaist2019-01-295-5/+9
| | | | | | | | | | | | | | | | | | The comment contains information which makes it misleading to understand how the components are passed. Change-Id: I29cdb5eec1e8014fa7f0ca3f1a0f54258fdb431f Reviewed-by: Tomasz Olszak <olszak.tomasz@gmail.com> Reviewed-by: Christian Strømme <christian.stromme@qt.io>
* | VideoOutput: Download data of flush video frame if it has a handleVal Doroshchuk2018-11-291-9/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Flush video frame is used to be shown when flush or stop is requested. In case if the video frame is gl texture based just copying handle will not copy actual data and flush frame will be always the last seen frame. Needs to convert gl based frame to QImage and keep it in within QVideoFrame. Task-number: QTBUG-71610 Change-Id: I3e5aa1deb56313e6c6b97cde3e94dead6dec1b76 Reviewed-by: Oliver Wolff <oliver.wolff@qt.io> Reviewed-by: Andy Shaw <andy.shaw@qt.io>
* | VideoOutput: Introduce flushMode propertyVaL Doroshchuk2018-11-063-7/+41
|/ | | | | | | | | | | | | | | | | | | | | | | | | Added flushMode property to QML VideoOutput element to define what should be shown when flush is requested. Takes affect only for QDeclarativeVideoRendererBackend and when QSGVideoItemSurface is already started. Flushing (passing empty video frame to the surface) is usually performed when EndOfMedia or playback is stopped. Which caused disappearing the content and blinking if playlist is used. Using this property now possible to define what frame (last, first or empty) should be shown when playback is stopped or finished. By default shows empty frame (clears the video output). To show a frame it requires to keep QVideoFrame and thus its data. Task-number: QTBUG-37301 Task-number: QTBUG-49446 Change-Id: I3be5309217b9f543da804e3b616dee9d97fba65f Reviewed-by: Andy Shaw <andy.shaw@qt.io> Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
* Add OpenGL core profile support to QtMultimediaQuickToolsMassimo Callegari2018-09-0313-6/+204
| | | | | | | | | | | | When requesting a OGL Core profile via QSurfaceFormat::setDefaultFormat (e.g. to use Qt3D advanced features), it is no longer possible to render QML Video items. This is because the requested shaders should be _core versions. This patch adds the core shaders so QtMultimedia stops whining, and bind textures with the proper format, since GL_LUMINANCE and GL_LUMINANCE_ALPHA are no longer valid in OGL 4. Task-number: QTBUG-51064 Change-Id: I909e01e7dc7be07549e9ecf0a6425b309af38ea1 Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io> Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* Set geometry for recreated video renderer backendVal Doroshchuk2018-05-081-7/+6
| | | | | | | | | | | If video renderer backend has been recreated, then it needs to update its geometry. Which previously didn't happen and as a result no content was shown. The geometry is now updated from within the video node. Task-number: QTBUG-54680 Change-Id: Iadbf324f4734c9ac6c487eaedd014629ca330599 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* Merge remote-tracking branch 'origin/5.10' into devLiang Qi2018-01-204-42/+28
|\ | | | | | | | | | | | | | | Conflicts: src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm Change-Id: Ic43fb2a805ed9f0f2ea48993d47859716f1f11b4
| * Fix shader compilation failureVal Doroshchuk2018-01-191-1/+1
| | | | | | | | | | | | | | | | "No precision specified for (float)" error might be produced when using swizzle shader. Change-Id: I2a0be94a735f93de00a153515bd9593d483c9edf Reviewed-by: Christian Stromme <christian.stromme@qt.io>
| * Merge remote-tracking branch 'origin/5.9' into 5.10Liang Qi2018-01-183-41/+27
| |\ | | | | | | | | | Change-Id: I7566f543ce11ff6cddc4d17e2c258a582f365b65
| | * Improve quality of YUVY and UYVY renderingTomasz Olszak2018-01-153-41/+27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Idea is to upload YUYV/UYVY data as 2 textures and use GL_LINEAR like in biplanar formats. Having proper interpolation of only one texture (using e.g. mix function) resulted in vertical and horizontal 1 pixel stripes depending on scale. The reason was float precision and unexpected value of fract function. Additionally branching in shader is expensive so this solution should be more performant. Task-number: QTBUG-62155 Change-Id: I7ceeb09b4a54eecd16640a626b499d638b52c127 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* | | Merge remote-tracking branch 'origin/5.10' into devLiang Qi2018-01-064-9/+29
|\| | | | | | | | | | | | | | | | | | | | Conflicts: .qmake.conf Change-Id: I5acdc7e0bd3729b80522dfff0f388cf2507fb111
| * | Merge remote-tracking branch 'origin/5.9' into 5.10Liang Qi2018-01-061-2/+2
| |\| | | | | | | | | | | | | | | | | | | Conflicts: .qmake.conf Change-Id: I3d6e69f3f99b2f0a0e2c29ffdd02176e1f22304e
| | * Fix precision loss in QDeclarativeVideoRendererBackend::adjustedViewportVaL Doroshchuk2017-12-201-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | Applied casting to keep precision. Task-number: QTBUG-64044 Change-Id: If3cb29b5c049302de38e5417811792405c896334 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
| * | QML: Use alpha channel for ARGB32 video framesVaL Doroshchuk2017-12-223-7/+27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Added a fix to use alpha channel for ARGB32 video frames. Previously alpha component was always ignored and used 1.0 instead. To see transparent videos it is still needed to enable blending by adjusting an opacity property of qml element. Task-number: QTBUG-43098 Change-Id: If3aaf8ab695021b3a49a1790d900366e9c336b33 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* | | Merge remote-tracking branch 'origin/5.10' into devLiang Qi2017-11-201-1/+8
|\| | | | | | | | | | | Change-Id: Icaf645e271b21320c4cb6269178d9e722092a263
| * | Merge remote-tracking branch 'origin/5.9' into 5.10Liang Qi2017-11-151-1/+8
| |\| | | | | | | | | | Change-Id: I0e525d0cc7f4e4b776e5a536e2bf9b2c66be5429
| | * Don't discard the surface format when creating a video nodeVaL Doroshchuk2017-10-271-1/+8
| | | | | | | | | | | | | | | | | | | | | | | | All relevant properties from the surface are now copied Task-number: QTBUG-53268 Change-Id: I7f18f0e6a623c8c7c5be68e912b298e0b4b130b7 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* | | Replace Q_DECL_OVERRIDE with overrideKevin Funk2017-09-224-26/+26
|/ / | | | | | | | | Change-Id: I17b3650a3df5688274151c1f2c4629e4a5062028 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* / Rename the QtMultimediaQuick libraryYoann Lopes2017-05-021-1/+1
|/ | | | | | | | | Dropped the _p suffix from QtMultimediaQuick_p to be more consistent with other modules. Change-Id: Ibb0bbb2d24bc013df6c5623cba179508c5f1becf Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io> Reviewed-by: Christian Stromme <christian.stromme@qt.io>
* Add missing override and remove redundant virtualAlexander Volkov2016-12-127-39/+39
| | | | | Change-Id: Ifd439abf21877adff57080489324bea729ee5279 Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
* Merge remote-tracking branch 'origin/5.7' into devLiang Qi2016-05-131-10/+0
|\ | | | | | | Change-Id: I773db005bbdc511169917ee35eb5b517e898926b
| * Merge remote-tracking branch 'origin/5.6' into 5.7Liang Qi2016-05-101-10/+0
| |\ | | | | | | | | | | | | | | | | | | Conflicts: src/plugins/winrt/qwinrtcameracontrol.cpp Change-Id: I45d3042adf19577a72794610fa1c310cb22e26c4
| | * QNX: Avoid reading frames faster than they're renderedDan Cape2016-04-271-10/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The previous code would capture frames with a 60Hz timer into two pixmaps alternating pixmaps with each successive frame. Rendering was somewhat disconnected from this, if rendering was unable to occur at 60fps, multiple frames might be copied for each frame rendered. This meant that it might try copying a video frame into a pixmap that was currently being used by the GPU with bad effects. The primary effect being severe flicker on i.mx6 targets. The change is to ensure that we don't read the window data until we're just about to make use of it. This means we don't ever get ahead of ourselves and read the video window once for every frame rendered. The code has been significantly refactored. There is now a class that manages the pixmaps and egl images. This is created on demand and the images are created and destroyed when sizes change. Since this all now occurs in the proper thread, much of the nonsense of setting _q_GLThreadCallback to arrange a call from the render thread is avoided. Remove BlackBerry ifdefs that are no longer used. Change-Id: I4bf5efa4c39c8170e3f55499c167ee10e521e100 Reviewed-by: James McDonnell <jmcdonnell@qnx.com> Reviewed-by: Rafael Roquetto <rafael.roquetto@kdab.com>
* | | Fix missing precision qualifier in YUV 4:2:2 shaders.Yoann Lopes2016-05-022-2/+2
| | | | | | | | | | | | | | | Change-Id: I83ce28670950e0895cc746c4ca30f884aa5a35bc Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
* | | Implement YUV 4:2:2 8bit support for QtQuickSamuel Gaist2016-04-297-8/+147
|/ / | | | | | | | | | | | | | | | | | | | | This patch implements support for rendering of UYVY and YUYV sources when using QtQuick for preview. [ChangeLog][QtQuick][Rendering] Support for YUV 4:2:2 8bit has been implemented for the QtQuick viewfinder. Change-Id: I4d98f3c44240ee53f7708bc6bd84e7fb83aac069 Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
* | Merge remote-tracking branch 'origin/5.6' into 5.7Liang Qi2016-03-071-4/+3
|\| | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/plugins/avfoundation/mediaplayer/mediaplayer.pro tests/auto/unit/qmediaserviceprovider/mockserviceplugin1/mockserviceplugin1.pro tests/auto/unit/qmediaserviceprovider/mockserviceplugin2/mockserviceplugin2.pro tests/auto/unit/qmediaserviceprovider/mockserviceplugin3/mockserviceplugin3.pro tests/auto/unit/qmediaserviceprovider/mockserviceplugin4/mockserviceplugin4.pro tests/auto/unit/qmediaserviceprovider/mockserviceplugin5/mockserviceplugin5.pro Change-Id: I5742596230dc510ba2a09eba624429bb67179194
| * rely on the automatically defined QT_BUILD_*_LIBOswald Buddenhagen2016-02-251-2/+1
| | | | | | | | | | Change-Id: I8c1c755270aa0a703103925656f7c1b555e4db1f Reviewed-by: Yoann Lopes <yoann.lopes@theqtcompany.com>
| * consistently put {qt,qml}_{module,plugin} at the end of project filesOswald Buddenhagen2016-02-251-2/+2
| | | | | | | | | | | | | | | | this fixes static builds by ensuring that all dependencies are exported. Task-number: QTBUG-51071 Change-Id: I8e1554b648327ea2fb342b882ce8e439bd6f271d Reviewed-by: Yoann Lopes <yoann.lopes@theqtcompany.com>
* | Updated license headersAntti Kokko2016-01-1912-171/+243
| | | | | | | | | | | | | | | | | | | | | | From Qt 5.7 -> LGPL v2.1 isn't an option anymore, see http://blog.qt.io/blog/2016/01/13/new-agreement-with-the-kde-free-qt-foundation/ Updated license headers to use new LGPL header instead of LGPL21 one (in those files which will be under LGPL v3) Change-Id: I324f65c61171f36641472964d095d72e452afb3a Reviewed-by: Jani Heikkinen <jani.heikkinen@theqtcompany.com> Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
* | Merge remote-tracking branch 'origin/5.6' into devChristian Strømme2016-01-1510-20/+58
|\| | | | | | | | | | | | | | | Conflicts: src/plugins/android/src/mediacapture/qandroidcamerasession.cpp src/plugins/wmf/mftvideo.cpp Change-Id: I78868b416ea4baec89ca3e2dc9eb4712db16d5fc
| * Add virtual dtor to QSGVideoNodeFactoryInterfaceKevin Funk2015-12-221-0/+4
| | | | | | | | | | | | | | Makes it compile for me Change-Id: Ib79f4c38bb165d3698a94c5d1aafee710423a907 Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
| * Fix some private headers.Yoann Lopes2015-11-249-20/+54
| | | | | | | | | | | | | | | | | | - Add missing "We mean it" comment - Add missing '_p' suffix for QtMultimediaQuick_p headers Task-number: QTBUG-49480 Change-Id: I1fd4f8b2fdffecebaebaedaf1b78e1da62c08156 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>
* | QtMultimediaQuickTools: replace foreach with range-based forAnton Kudryavtsev2016-01-152-5/+7
|/ | | | | Change-Id: I729375c1de712f1fb7915c95ce9eb7dcd00fe757 Reviewed-by: Yoann Lopes <yoann.lopes@theqtcompany.com>
* Add missing "We mean it" comments to private headers.Friedemann Kleint2015-10-062-0/+22
| | | | | | Task-number: QTBUG-48595 Change-Id: I1370d9229b0606582cbd828de84ee2717dca3daf Reviewed-by: Yoann Lopes <yoann.lopes@theqtcompany.com>