summaryrefslogtreecommitdiffstats
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
* Adjust usage of nativeEventFilter for Qt6wip/cmakeAlexandru Croitor2019-09-096-8/+28
| | | | | | Change-Id: Ifea48894e96f1e3f1df53650b3b07cce18a30aea Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Fix Qt6 buildAlexandru Croitor2019-08-072-3/+6
| | | | | | | | | | | Modify all the qmlRegisterModule calls to use minor version 15 because minor version zero from 6.0.0 would make tests fail. This is similar to what was done in qtdeclarative in c147b20a2c1299b2d659fe7c9472ae3866b6a425. Change-Id: I74710466b3ed459ee3b4c99ab1fbf5c9eb320d5d Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Merge branch 'dev' of git://code.qt.io/qt/qtmultimedia into wip/qt6VaL Doroshchuk2019-07-2387-678/+561
|\ | | | | | | Change-Id: I91e8d902cd916ee16a2495da9bf40a34c6bc05d2
| * Merge remote-tracking branch 'origin/5.13' into devQt Forward Merge Bot2019-07-231-0/+1
| |\ | | | | | | | | | Change-Id: Id2ff1bf85080dfdc7d318f459d78686b6c2f12b3
| | * Merge remote-tracking branch 'origin/5.12' into 5.13Qt Forward Merge Bot2019-07-161-0/+1
| | |\ | | | | | | | | | | | | Change-Id: Ie621069a6a069905ea40541c651de6e9e038994f
| | | * Fix GCC 9 -Wdeprecated-copy warningsMarc Mutz2019-07-111-0/+1
| | | | | | | | | | | | | | | | | | | | Change-Id: Ia50ce0d2c94b3b064e9cd571e598ecd37ee2b5e3 Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
| * | | AVFoundation: Use 270 for the front facing camera's orientationAndrew Dolby2019-07-191-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Patch content originally proposed by Alex Reche and Olivier Le Roux. Fixes: QTBUG-67985 Change-Id: I3ec80c566bf7c67c50e3e7485248412c40bdf169 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
| * | | Make QAudioDeviceInfo::realm() publicVal Doroshchuk2019-07-192-2/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since there could be multiple audio plugins, sometimes it is useful to filter devices per a plugin or avoid duplicates if any. QAudioDeviceInfo::realm() returns a key of the audio plugin that was used to retrieve the device info. Change-Id: Ie786c2c0f5bf181f08ee9be544f20eb41a264e26 Fixes: QTBUG-75781 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
| * | | Merge remote-tracking branch 'origin/5.13' into devQt Forward Merge Bot2019-07-166-8/+21
| |\| | | | | | | | | | | | | | Change-Id: I7ca7fb6143ec296c16a37a7be236470dbd1742a7
| | * | Merge "Merge remote-tracking branch 'origin/5.12' into 5.13"Qt Forward Merge Bot2019-07-115-8/+20
| | |\ \
| | | * | Merge remote-tracking branch 'origin/5.12' into 5.13Qt Forward Merge Bot2019-07-115-8/+20
| | | |\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: .qmake.conf Change-Id: Ic700bdddc5b4ae663af0daae54feb2420c8a1730
| | | | * Fix GetFrameRateList checks and memory leakNate Weibley2019-07-051-2/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | GetFrameRateList passes an unmanaged pointer to the caller which must be manually freed with CoTaskMemFree. Additionally the Chromium project notes that some drivers cause quirky return values which we would not catch without stricter checks. See: https://chromium.googlesource.com/chromium/src/media/+/8cc93abd7339eeb9b7c2a12cca07b3dc245b2139/video/capture/win/video_capture_device_win.cc#484 Change-Id: I6aa4a6ea1ac0241e585e98cf9ff63240bacd3956 Reviewed-by: Christian Strømme <christian.stromme@qt.io>
| | | | * GStreamer: Fix 0.10 compile errorVal Doroshchuk2019-07-051-1/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fixes: QTBUG-76816 Change-Id: I2909c2f2df91ac26b5104e24892310aa62cad172 Reviewed-by: Christian Strømme <christian.stromme@qt.io>
| | | | * Fix crash when app is destroyed before QSample::load is finishedVaL Doroshchuk2019-07-051-4/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | QSample objects live and handled in loading thread (which uses QNetworkAccessManager). When the app is finished and going to be destroyed, all static objects are destroying as well. In case if static QNetworkConfigurationManagerPrivate (which is used by QNetworkAccessManager) is destroyed before static QSampleCache, and loading of the resource is not finished yet (still executing QNetworkAccessManager::get()), this produces a crash. Since the loading thread is started only when loading of new QSample is requested, (and all events are also handled by this thread) proposing a fix to wait before loading thread is finished when a sample is requested to be released. This postpones deleting of the QSample either when new sample is requested to load or when QSampleCache is destroyed. This makes sure that no loading thread exists when all QSoundEffects objects and afterwards QNetworkConfigurationManagerPrivate are already deleted. Change-Id: I55669ea4c2796a48cae4f0465f7f74d89e393675 Fixes: QTBUG-76090 Reviewed-by: Christian Strømme <christian.stromme@qt.io>
| | | | * Fix MinGW buildJoerg Bornemann2019-07-021-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | With newer MinGW versions we have to link against libamstrmid for the symbols IID_IMFTopologyServiceLookupClient, IID_IMFVideoDeviceID and IID_IMFVideoPresenter. Fixes: QTBUG-70655 Change-Id: Ib203d991d2bd8cd63193a7319c156f30f0e8826b Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
| | | | * DirectShow: Map MEDIASUBTYPE_RGB24 to QVideoFrame::Format_BGR24Val Doroshchuk2019-07-021-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | MEDIASUBTYPE_RGB24 inverts Red and Blue channels, i.e. on Little-Endian: BGR and thus Format_BGR24 should be used instead of Format_RGB24. To reproduce the bug: QCameraViewfinderSettings settings; settings.setPixelFormat(QVideoFrame::Format_RGB24); camera->setViewfinderSettings(settings); If the camera supports MEDIASUBTYPE_RGB24 it will show Red and Blue channels inverted. *NOTE* This fix causes ignoring MEDIASUBTYPE_RGB24 format and using MEDUASUBTYPE_RGB32 instead. Because the video surfaces currently do not support QVideoFrame::Format_BGR32. So it fixes the issue with inverted colors by ignoring RGB24 media type. If there is a need to use RGB24, it would require to implement custom surface which supports QVideoFrame::Format_BGR24 and swap colors manually. Change-Id: I0d77694ef688a05dc52d13f991a5088e00f72867 Fixes: QTBUG-75959 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
| | * | | Doc: Replace example file lists with links to code.qt.ioTopi Reinio2019-07-091-0/+1
| | |/ / | | | | | | | | | | | | | | | | | | | | Task-number: QTBUG-74391 Change-Id: I7047254fb8695feabd08eaaf02bee21a1b805917 Reviewed-by: Paul Wicking <paul.wicking@qt.io>
| * | | Eradicate the last Q_FOREACH and mark the module cleanMarc Mutz2019-07-111-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This one is not trivial in that it isn't clear, a priori, that the loop body doesn't re-enter the class and ends up modifying m_videoProbes. But MFVideoProbeControl::bufferProbed() just schedules a deferred call to QMediaVideoProbeControl::videoFrameProbed() (via QueuedConnection), so this cannot happen, because we end the loop before we re-enter the event loop (if any) on this thread. Reentrancy from a different thread, OTOH, is not possible because we're holding m_videoProbeMutex while looping. Change-Id: I6c1e22cd01112f0b2650e056f0b7f4a392370b84 Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
| * | | Merge "Merge remote-tracking branch 'origin/5.13' into dev"Qt Forward Merge Bot2019-07-111-4/+4
| |\ \ \
| | * | | Merge remote-tracking branch 'origin/5.13' into devQt Forward Merge Bot2019-07-111-4/+4
| | |\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: .qmake.conf Change-Id: I2f2a9371dd1085c10450f23e56c9f18078cc8698
| | | * | Merge remote-tracking branch 'origin/5.12' into 5.13Qt Forward Merge Bot2019-06-271-4/+4
| | | |\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: .qmake.conf Change-Id: Ieed5727ca602712ac008a876333e36ebb3dcba30
| | | | * Fix compile issue when no opengl in QVideoSurfacePainterVal Doroshchuk2019-06-171-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | error: invalid use of incomplete type 'class QGLContext' Change-Id: I4bc9bd4231e663b187d3cef917b7a551ba614ba9 Fixes: QTBUG-76405 Reviewed-by: Andy Shaw <andy.shaw@qt.io>
| * | | | Eradicate all but one Q_FOREACH loopMarc Mutz2019-07-115-11/+12
| |/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Q_FOREACH is going to be deprecated, or at the very least banned from use in Qt code. All these are trivial in the sense that the loop body clearly doesn't modify the container over which we iterate, and that the container is const, or trivially marked as such. In one case, replaced Q_FOREACH + delete + clear() with qDeleteAll(qExchange()), in three others, replaced Qt containers with statically-known content with plain C arrays. Change-Id: I718821811370f0cfefac3893283572d39a7d957d Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
| * | | Eradicate Java-style iterators and mark the module free of themMarc Mutz2019-07-046-23/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Java-style iterators are scheduled to be deprecated, or at the very least banned from use in Qt's own implementation. Ditto for QLinkedList. Change-Id: I5471c293a7a050b92db47f7aeac15dd05bd46650 Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
| * | | Fix API of QCameraExposure, QCameraFocus, QCameraImageProcessing for Qt for ↵Friedemann Kleint2019-07-043-3/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Python The classes inherit QObject, but make the destructor private, which makes it impossible to add Qt for Python bindings. Make destructors protected to fix this. This is arguably a BC break for compilers which have the accessibility mangled in the symbol, but, since the destructor was private, there cannot be any code using it. Task-number: QTBUG-74422 Task-number: PYSIDE-1041 Change-Id: Id23d73aea8aedf15caafa20c048a80efd3e880bd Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| * | | QGstAppSrc: Don't send EOS for at-end sequential devicesArno Rehn2019-06-281-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Sequential devices such as network sockets may continuously stream data. Thus, the device being atEnd() or returning 0 for read() doesn't automatically mean that the stream is done. This fixes streaming live data over a device (e.g. socket or pipe). [ChangeLog][][GStreamer backend] Fix streaming data from sequential devices. Change-Id: I2fc834479cc6d52a806790ccb722bcfdea4723be Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
| * | | Port towards load/storeRelaxed atomicsFriedemann Kleint2019-06-251-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Plain load() / store() have been deprecated, so port away to their straight replacements. Change-Id: Id5d0cfc97336618e444126278630decf581f3b6c Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
| * | | Merge remote-tracking branch 'origin/5.13' into devQt Forward Merge Bot2019-06-251-38/+0
| |\| | | | | | | | | | | | | | Change-Id: Ia427729f2b302854daa9f8259eae038498088b7e
| | * | AVFoundation: remove ResourceHandler nested classThiago Macieira2019-06-201-38/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Doesn't seem to be used. Task-number: QTBUG-76521 Change-Id: Ief874765cd7b43798de3fffd15a9f691e1ac078d Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
| * | | DirectShow: Introduce nullptrFriedemann Kleint2019-06-1235-173/+173
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Apply Fixits by Qt Creator. Change-Id: Idbd52ceaac6ee02f23d05f5a9b1ab6d58298b6a5 Reviewed-by: André de la Rocha <andre.rocha@qt.io>
| * | | DirectShow: Use member initializationFriedemann Kleint2019-06-1240-283/+144
| | | | | | | | | | | | | | | | | | | | Change-Id: I4e696083c2ed78b374f2df64706ecb2297f122dd Reviewed-by: André de la Rocha <andre.rocha@qt.io>
| * | | Remove usages of deprecated qSortSona Kurazyan2019-06-201-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | Task-number: QTBUG-76491 Change-Id: I7a22d6612848e25bb780d205c6cdbb314cd4762d Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
| * | | Merge remote-tracking branch 'origin/5.13' into devQt Forward Merge Bot2019-06-183-6/+4
| |\| | | | | | | | | | | | | | Change-Id: Ic3ac3515666576046ac1ec5342c5b06aadbc18ac
| | * | Merge remote-tracking branch 'origin/5.12' into 5.13Qt Forward Merge Bot2019-06-153-6/+4
| | |\| | | | | | | | | | | | | Change-Id: Ib819180a25ceedfb072362d55d30f94e40a44f9b
| | | * GStreamer: Return busy cameras in QCameraInfo::availableCamerasVaL Doroshchuk2019-06-071-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If the camera has been already opened, ioctl returns EBUSY, and this camera is not listed in available cameras. Change-Id: I1ee6e067a3d080fe82a528f576ba13e03d5f816e Fixes: QTBUG-76236 Reviewed-by: Andy Shaw <andy.shaw@qt.io>
| | | * Doc: Use correct property name for videoRecorderPaul Wicking2019-06-041-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | Fixes: QTBUG-75623 Change-Id: I9a072d1d3056f58657b8b44e9350ae3506139117 Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
| | | * AVFoundation: Fix sending proper state in QMediaRecorderVaL Doroshchuk2019-05-101-4/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Need to send the state if it has been applied. Currently it happens when Recording is requested. If Stopped is requested, the state will be changed in handleRecordingFinished callback. Change-Id: I6911f2cebb2d1cc8a08eee17e7b91654b5d6e4c7 Fixes: QTBUG-75287 Reviewed-by: Andy Shaw <andy.shaw@qt.io>
| * | | DirectShow: Clang warnings about else after return, breakFriedemann Kleint2019-06-125-25/+24
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Disentangle code of DirectShowPlayerService::requestControl(). Change-Id: I2e90d5c86acdbe2f20f421f43929e0e9c5580eaf Reviewed-by: André de la Rocha <andre.rocha@qt.io>
| * | | Convert uses of QTime as a timer to QElapsedTimerEdward Welbourne2019-06-137-15/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It was deprecated by qtbase/ed99a591a83a399458f12341d0a1c0b3152f247a. Change-Id: I87bf219c05a62e1deeb9d3df558e5084318a2a69 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
| * | | DirectShow: Fix clang-warning about mixing const/non-const iteratorsFriedemann Kleint2019-06-121-1/+1
| | | | | | | | | | | | | | | | | | | | Change-Id: Iadaae490ff88737cf8a73ef8024617f60773a631 Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
| * | | DirectShow: Replace typedef by usingFriedemann Kleint2019-06-122-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Apply some fixits by Qt Creator. Change-Id: I20b62c70b5ed0e79ca735f1ab9b048023eb9dc7d Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
| * | | Merge remote-tracking branch 'origin/5.13' into devQt Forward Merge Bot2019-06-038-80/+130
| |\| | | | | | | | | | | | | | Change-Id: Id1638836ea3faf16c4ba39119029522b2afbe803
| | * | Merge remote-tracking branch 'origin/5.12' into 5.13Liang Qi2019-06-038-80/+130
| | |\| | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/plugins/directshow/player/directshowplayerservice.cpp Change-Id: I6b7edc312ecfadf84653ce24321ec55da41e131a
| | | * DirectShow: Don't hide returned error when video output was not providedVal Doroshchuk2019-04-111-2/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since the video output could be set after doRender(), we do not report an error in this case. But need to report the error when the video output has not been submitted at all. Otherwise it hides the error and not possible to determine playback issues. Added a fix to remember an error while rendering without the video output and handle it if playing is requested. That means, if it is required, the video output must be set before play() is called. Not all medias require valid video output, but if there is an error, we need to report about it. Fixes tst_QMediaPlayerBackend::playlist() Task-number: QTBUG-65574 Change-Id: I9faae19c08ad0273545bb7617ea3a11539084f1f Reviewed-by: Andy Shaw <andy.shaw@qt.io>
| | | * Gstreamer: Pass GstUDPSrc's caps via "udpsrc.caps=" url's query itemVaL Doroshchuk2019-05-221-0/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Sometimes it is needed to configure udpsrc element to play a stream, means to set some caps to GstUDPSrc element. But currently there are no any ways to pass such caps. Added parsing of the requested url to find "udpsrc.caps" query item and to use it as the caps for udpsrc source element. It allows to show streams by passing caps within url. E.g. if the stream is created using $ gst-launch-1.0 v4l2src ! videoconvert ! video/x-raw,format=I420,width=800,height=600 ! \ jpegenc ! rtpjpegpay ! udpsink host=127.0.0.1 port=5001 it could be shown via QMediaPlayer like: MediaPlayer { source: "udp://127.0.0.1:5001/?udpsrc.caps=application/x-rtp,media=video,clock-rate=90000,encoding=JPEG,payload=26" } Change-Id: I6f9c20c6004a34bce5fd1d0073311b7c62a8010f Reviewed-by: Christian Strømme <christian.stromme@qt.io>
| | | * GStreamer: Dump dot file if GST_DEBUG_DUMP_DOT_DIR is setVaL Doroshchuk2019-05-201-12/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Dump dot file on play only. Change-Id: Ide7fe0cad56f06a89604cf40b59b858c9c9d09f2 Reviewed-by: Christian Strømme <christian.stromme@qt.io>
| | | * GStreamer: Fix crash when the bus helper is destroyedVaL Doroshchuk2019-05-211-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Called deleteLater() on the bus helper to ensure the cleanup is handled gracefully. QGstreamerBusHelperPrivate::doProcessMessage is called on a message from gst, which it calls QGstreamerPlayerSession::processBusMessage where new media is set and current helper object is destroyed. When for loop is ended in doProcessMessage, current object is freed and produces a crash. Change-Id: Ic9cde97c284406450d4723f1f7f71fa1ea2c0648 Reviewed-by: Andy Shaw <andy.shaw@qt.io>
| | | * Only call CoUnitialize() if calling CoInitialize() was necessaryAndy Shaw2019-05-211-2/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | As CoInitialize() may have been called by something else beforehand then it should only call CoUnitialize() if it returns S_OK which indicates it was not already called. That ensures it is only uninitalized if it did the initialization. Change-Id: I1b723e0b69fe5f9ff7c2c6ef083e9196f21812b2 Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
| | | * DirectShow: Report about an error for wrong urlsVal Doroshchuk2019-05-201-2/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If wrong url is passed, no need to try it again. But report an error instead. Also there cannot be empty url, because if an url is empty, NoMedia should be emitted. Fixes tst_QMediaPlayerBackend::playlistObject() Task-number: QTBUG-65574 Change-Id: I658b16cfe7b96c202715651d6b20d01a9af6c746 Reviewed-by: Andy Shaw <andy.shaw@qt.io>
| | | * Gstreamer: Allow streams in custom pipelinesVaL Doroshchuk2019-05-152-41/+72
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Introduced pushing buffers from QIODevice to appsrc gstreamer element: player->setMedia("gst-pipeline: appsrc ! ...", io_device); Also ported to gst 0.10. Change-Id: I1a84d22c0d5c56fe433d494413c5ab23da7c6bf3 Reviewed-by: Christian Strømme <christian.stromme@qt.io>