summaryrefslogtreecommitdiffstats
path: root/src/multimediawidgets/qvideowidget.cpp
Commit message (Collapse)AuthorAgeFilesLines
* Doc: Fix undocumented members warning in the widget APIVenugopal Shivashankar2022-10-071-1/+7
| | | | | | | Pick-to: 6.4 Change-Id: Ibcf3c3385ba00a2bd4f1c89811906be6437dc56f Reviewed-by: Topi Reiniö <topi.reinio@qt.io> Reviewed-by: Nicholas Bennett <nicholas.bennett@qt.io>
* Do not call showFullScreen or showNormal when it is already setPiotr Srebrny2022-08-171-7/+6
| | | | | | | | | | | | | With QVideoWidget window can go fullscreen either by calling setFullScreen or directly QWidget::showFullScreen. However, a variable describing window state is only updated when using setFullScreen function, which becomes inconsisten when using QWidget::showNormal when going out of full screen mode. This patch fixes this inconsistency and test tst_QVideoWidget::fullScreen(). Pick-to: 6.2 6.3 6.4 Change-Id: I82c496fcd32fda6a32f928564d2502073faf0064 Reviewed-by: Lars Knoll <lars@knoll.priv.no>
* Use SPDX license identifiersLucie Gérard2022-06-241-38/+2
| | | | | | | | | | | Replace the current license disclaimer in files by a SPDX-License-Identifier. License files are organized under LICENSES directory. Pick-to: 6.4 Task-number: QTBUG-67283 Change-Id: Ida08dfe6c84778656e942178c3d39042c9ef1ed2 Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
* Split spatial audio out into a lib of its ownLars Knoll2022-06-161-8/+0
| | | | | | | | | | | | | | | | | | | | | Move the classes from src/multimedia/spatial into its own QtSpatialAudio library. This is required to keep Qt Multimedia compatible with the requirements from the KDE Free Qt Foundation agreement, as well as to keep license compatibility with existing applications licensed under GPLv2 that are using Qt Multimedia. Moving the classes into a module of their own required a few additional changes to ensure we generate proper documentation for the new spatial audio module. To align the API between C++ and QML, the QML import was also renamed to QtQuick3D.SpatialAudio. Pick-to: 6.4 Change-Id: Ia3f9ac5e1edac4b1e07d3302d7a229ada5bdc038 Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
* Fix QVideoWidget::setFullScreen()Lars Knoll2021-11-031-0/+8
| | | | | | | | | | | | | | | | | | | | | setFullScreen(true) would always cause the video widget to be shown on the primary screen instead of the current screen the app is being shown on. The reason for this is that setting the Qt::Window flag on the widget will cause its position to be interpreted as relative to the screen instead of its parent. This position is usually on the first screen, so showFullScreen() will show it there. Fix this by moving the video widget to the physical position on the screen that it had inside its widget hierarchy before calling showFullScreen(). Also restore that position on setFullScreen(false), so that its position is correctly restored even without layouts. Fixes: QTBUG-97895 Pick-to: 6.2 Change-Id: I5207afb276e9369938d1c3d8814d9878367c6895 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
* Various fixes to our overview doc pagesLars Knoll2021-09-211-0/+1
| | | | | | | | | Correct various mistakes in our overview documentation and add some more detail in various places. Pick-to: 6.2 6.2.0 Change-Id: Iff26e7f13646a7a421be49dcb473f64732367558 Reviewed-by: Nicholas Bennett <nicholas.bennett@qt.io>
* Implement HW accelerated rendering for QVideoWidget using QVideoWindowLars Knoll2021-08-261-66/+15
| | | | | | | | | | Refactor QVideoWidget to implement HW accelerated rendering by simply embedding a QVideoWindow as a child and making it transparent for input, so the input events continue to go to the QVideoWidget. Pick-to: 6.2 Change-Id: I0dd02ebb784a1d6a51e56aa6b629df0b947292ac Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
* HW accelerated video rendering for QWindowLars Knoll2021-08-261-0/+5
| | | | | | | | | | | | | | | | | | | | This implements HW accelerated video rendering to a QWindow using RHI and the textures we get from the video pipeline. This change was triggered by difficulties to create a full HW accelerated path for QVideoWidget on gstreamer. The reason was that the vaapisink that we've been using so far has quite a few bugs and been deprecated by the gstreamer maintainers. This will in a follow-up change allow us to unify the video pipelines for Qt Quick and Widgets, so that we only need to support one way of doing HW accelerated rendering on the backend side. Done-with: Laszlo Agocs <laszlo.agocs@qt.io> Pick-to: 6.2 Change-Id: I143e4416dd8b1cec4e5507e2e5af1eb3d37a496c Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
* Clean up the QVideoSink APILars Knoll2021-08-251-14/+0
| | | | | | | | | | | | | | | | | The next couple of commits will simplify how we handle HW accelerated rendering by also going through the RHI code path for QVideoWidget. This implies that we can remove quite a few properties from QVideoSink, as those were only required for the old windowed code path. This does for the moment disable all HW acceleration on QVideoWidget. Support for that will be re-added in follow-up changes. Pick-to: 6.2 Change-Id: I1474f44ed7468eb263fbf4de75f75f9af16b7773 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io> Reviewed-by: Doris Verria <doris.verria@qt.io>
* Move the QVideoSink::paint() method to QVideoFrameLars Knoll2021-08-251-1/+4
| | | | | | | | | | | This makes a lot more sense as the videoframe can now paint itself. It also allows us to removes a lot of API from QVideoSink that never quite fit in there. Pick-to: 6.2 Change-Id: I70f32416a0e3850c2a9f8ee3853f38b06031905f Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io> Reviewed-by: Doris Verria <doris.verria@qt.io>
* Doc: Fix Qt Multimedia Documentation Part 2Nicholas Bennett2021-08-111-2/+2
| | | | | | | | | | | | | | | | Define enums for mediaformat, audioformat, videoformat Remove doc references to qdelcarativecamerafocus Remove brightness and related properties from QVideoWidget Remove QMediaPlayer::setVolume() doc references Remove QMediaRecorder::setVolume() doc references Document missing QAudioFormat::SampleFormat enums Update or remove old function or class links in docs Spelling correction, sentence shortening for clarity Remove qdoc comments in a namespace that is not to be documented Pick-to: 6.2 Change-Id: If0e56da12535fd31bd4fbe97fd83c3a38df22dbc Reviewed-by: Paul Wicking <paul.wicking@qt.io>
* Improve windowed rendering with gstreamerLars Knoll2021-08-041-122/+0
| | | | | | | | | | | | | | | | | Correctly respect the aspectRatioMode when calculating the render rectangle. This works fine on xvimagesink. The vaapisink doesn't fully respect it (at least with current AMD drivers), but that is a bug in the vaapi implementation. Set the fullscreen flag on the sink when going fullscreen, so that it can apply any possible optimizations. Clean up the code dealing with brightness correction etc, as that is currently not used or supported. Change-Id: I8e4d005901fa1ee59892d647f9359d8edb96664e Reviewed-by: André de la Rocha <andre.rocha@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Remove brightness and related properties from QVideoSink and QVideoWidgetLars Knoll2021-06-181-4/+6
| | | | | | | | We currently do not support those on all platforms and most native APIs do not offer those kind of controls neither anymore. Change-Id: Ifa58d206796fba3b10dfa111be1c6f79a996539a Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
* Fix a compiler warning on MSVCLars Knoll2021-06-111-1/+1
| | | | | | | | MSVC doesn't like */* sequences :) Change-Id: I4bebcea733f803b4cf21de184295836bc3651902 Reviewed-by: André de la Rocha <andre.rocha@qt.io> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
* Fix a number of compiler warnings/errors when using gccLars Knoll2021-05-141-1/+0
| | | | | | Change-Id: Ifa7bcd4507948cd61909a11af203852ee1586787 Reviewed-by: André de la Rocha <andre.rocha@qt.io> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
* Fix test failures in tst_qvideowidget and tst_qgraphicsvideoitemLars Knoll2021-04-281-1/+0
| | | | | | | | | This passes now, but might require some more massaging to get correct display rects for the widget case. Change-Id: I4673240bb1afacfe714580e586e293c09f690d11 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Fix sizeHint() of QVideoWidget/QVideoGraphicsItemLars Knoll2021-04-281-4/+6
| | | | | | | | | Doesn't yet fix all test failures, but it's an improvement. Change-Id: I775857f1fb580b78ae137dc71ee445a15eafd0a7 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Re-enable tst_qvideowidget and fix most errors in the testLars Knoll2021-04-281-25/+8
| | | | | | Change-Id: I77bf951d9e334d92b65d0f9f5c37c22033e91060 Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Doris Verria <doris.verria@qt.io>
* Better error handling for gstreamerLars Knoll2021-04-161-1/+0
| | | | | | | | Handle a couple of error cases without crashing. Change-Id: Id4e2e1197bc7daa0351130117ed07e7a9c6fb9fa Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Doris Verria <doris.verria@qt.io>
* Clean up QVideoSink and it's platform implementationLars Knoll2021-04-161-20/+20
| | | | | | | | | | | | * Normalize ranges of brightness and friends to [-1, 1] and use floating point numbers. * Remove getters for values from the platform API, rather store them in the frontend. This simplifies the work that needs to be done on the backend side. Change-Id: I8d63dacaa6b2873b33e17fcd7831e41173109a7e Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Doris Verria <doris.verria@qt.io>
* Rename QVideoSurfaceFormat to QVideoFrameFormatLars Knoll2021-04-141-1/+1
| | | | | | | | | The class is used exclusively together with video frames to describe their format, so the name should reflect that. Change-Id: I10bec7a0556b22c69ac790a99282e1376ce4af97 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Correctly set the target rect when going fullscreenLars Knoll2021-04-061-0/+1
| | | | | | | | | | This didn't show on the other platforms that used native mechanisms to determine the window size, but is required for this to work correctly on Windows. Change-Id: I20bbb12dcfddd56bd6c1684a69ee836807e0b679 Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Doris Verria <doris.verria@qt.io>
* Use the new AVFVideoSink abstraction for the camera as wellLars Knoll2021-04-061-1/+1
| | | | | | | | | This makes the camera work in windowed and not SW rendering modes again. Change-Id: I2f8c2c3f445705c3f9a4619ad33330500cf2a487 Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Doris Verria <doris.verria@qt.io>
* Further refactor the video sink implementation on macOS/iOS.Lars Knoll2021-04-061-1/+1
| | | | | | | | | | | | | | | | | | | | | | | Make sure we can deliver both SW buffers, textures and render onto native surfaces. As we need different implementations for the player and capture pipelines, AVFVideoSink is now acting as a proxy to the class doing the actual rendering. Fold the windowed mode handling into the AVFVideoRenderer class and use it when rendering windowed or fullscreen. This also required some changes in AVFMediaPlayer to ensure that we always have a AVPlayerLayer available because loading content happends asynchronously, but we need the layer directly. With this playback works both onto QVideoWidget and the QML VideoItem, although there are some R<->B issues when rendering using software. Change-Id: Ie6fe901f35989c5076eedaea4edf3b8c4d3f35f4 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Use native windows again in QVideoWidgetLars Knoll2021-04-061-1/+1
| | | | | | Change-Id: I609af1873e34e64b220310de559a795bb6163bc3 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Add support for SW rendering in QVideoSinkLars Knoll2021-04-061-1/+5
| | | | | | | | | Retrieve SW buffers from gstreamer if that's what the sink wants. Change-Id: I3598594a219e436d6f64c5eefbc001f3f46d3789 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Rename QVideoWindowControl to QPlatformVideoSinkLars Knoll2021-04-061-310/+41
| | | | | | | | | | | | | | | | This class can nicely serve as the basis class for the platform specific new video sink API. For now it will support windowed rendering and the non windowed mode will get folded into this class in follow-up commits. Clean up the QVideoWidget code and always use QVideoSink there to make the transition easier to handle. This implies that QVideoWidget will right now only work in windowed mode. Change-Id: I6db4509ceaa142001ffd59b60406aa98c71f5fc0 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Get windowed playback working againLars Knoll2021-04-061-0/+20
| | | | | | | | | | | And start moving over to the new QVideoSink API. Fun side effect: HW accelerated video decoding does work with this change on Linux. Change-Id: Ic88d13b4fc7028b300349f9bf7ed1a7b3e08d37c Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Move QPainterVideoSurface into QtMultimediaLars Knoll2021-03-231-1/+0
| | | | | | | | We'll need the code there for the new QVideoSink Change-Id: Iae4681770b2d64e1c0f1e96db2076dd4ec2315bf Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Get rid of QVideoRendererControlLars Knoll2021-03-021-1/+1
| | | | | | | | | | It's a pure implementation detail in the backends now (and can in cases even get removed there). No need for an interface. Change-Id: Ib61cebe80d0369424d4ee681992e4abc80c11a14 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Get rid of one layer of indirection in the backendLars Knoll2021-03-021-2/+2
| | | | | | | | | | QMediaPlatformPlayerInterface didn't do anything anymore but to create a QMediaPlayerControl. So we might as well remove that layer. Change-Id: I1481188384d5eb25c845317835c44ec0be8c9099 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Kill QMediaSource and QMediaSinkLars Knoll2021-02-171-7/+5
| | | | | | | | Those aren't used anymore, get rid of them. Change-Id: I5a17f18a3c87c2c13a9009b1f99ef9e708f7636a Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Remove QMediaSink inheritance from QVideoWidgetLars Knoll2021-02-171-309/+40
| | | | | | | | | | And remove some now unused code. We've lost the ability to render to native window handles directly, but that should be handled through QAbstractVideoSurface API additions. Change-Id: I644a38ea045219e715dd77346bd4d94529df9b07 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Get rid of QVideoWidgetControlLars Knoll2021-01-291-113/+2
| | | | | | | | | | | | | QVideoWindowControl offers more or less the same functionality, as both require a native surface to use for an overlay. This should in the longer term be re-architected towards a "native surface" interface for rendering. And the only platforms that did try to implement this were gstreamer and AVFoundation. Change-Id: I3adcc38dde9ccd20273c7a7fb1712ce97bbdad48 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Get rid of plugins for MM backendsLars Knoll2021-01-221-10/+23
| | | | | | | | | | There's no need for having those in plugins and we can further remove abstractions and simplify our code if the code is directly compiled into Qt Multimedia. Change-Id: I5267a6a776375d99be8f0de4207f0288d963e620 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Rename QMediaObject to QMediaSourceLars Knoll2021-01-221-14/+14
| | | | | | | | That actually describes what those classes are. Change-Id: I9ce01707bb260ff6452359e211f2c22b5740e61b Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Get rid of QMediaControlLars Knoll2021-01-211-3/+3
| | | | | | | | | | The class was serving no purpose that QObject doesn't offer, so remove that layer and use QObject as the base class for those controls. Change-Id: Icd434fabe88cbdba5fa54eafe6ba97ac08be61f3 Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Doris Verria <doris.verria@qt.io>
* Coding style cleanupsLars Knoll2021-01-211-4/+2
| | | | | | | | Do some coding style fixes proposed by clang-tidy. Change-Id: I62584767fd7af2f98ac02653c1105d64188f5554 Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Doris Verria <doris.verria@qt.io>
* Modernize code baseLars Knoll2021-01-211-18/+18
| | | | | | | | | Run clang-tidy over the code base with some code modernization options. Change-Id: I9e74d1225bce333e74224e3b92c02c7e9884d8f5 Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Doris Verria <doris.verria@qt.io>
* Remove code for < QT_VERSION_CHECK(6, 0, 0)VaL Doroshchuk2020-08-031-4/+0
| | | | | Change-Id: Ia64872eef299b2583a21ea40403cb0d281baf3e6 Reviewed-by: Liang Qi <liang.qi@qt.io>
* Remove usage of QGL* APIsVaL Doroshchuk2020-02-181-2/+1
| | | | | | | | | QOpenGL API should be used instead. Task-number: QTBUG-74409 Fixes: QTBUG-81902 Change-Id: I80d09cba79248451cf211eabd87651301ae18b63 Reviewed-by: Johan Helsing <johan.helsing@qt.io>
* Expose video surfaces in rendering componentsVaL Doroshchuk2020-01-051-15/+43
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * Currently QVideoWidget, QGraphicsVideoItem and QML Video Output tightly depend on QMediaPlayer, QMediaService etc. Since QMediaService is deprecated and will be removed from Qt6, its usage must be removed from rendering components. * Also it is a part of a task to make all components independent, e.g. without dependencies to another components, like the media player, or video producer. These video consumer components should be reusable without QMediaPlayer too, which today is not possible, and should have responsibility for a single part of the functionality. * It is a part of a task to allow users to decide how to render video, using either video surface or native windows. Introducing QVideoWidget::videoSurface() QGraphicsVideoItem::videoSurface() QDeclarativeVideoOutput::videoSurface() that create a surface, if necessary, and returns the underlying video surface which provides a possibility to render video frames without knowledge of any services and controls. Can be used like: QMediaPlayer->setVideoOutput(QVideoWidget->videoSurface()); or QMediaPlayer->setVideoOutput(QGraphicsVideoItem->videoSurface()); This allows QMediaPlayer to get video frames from a backend, without using QVideoWidget/QGraphicsVideoItem, and to present these frames to provided surface. Moreover, now it is possible to render video frames without QMediaPlayer: QVideoSurfaceFormat format(img.size(), QVideoFrame::Format_ARGB32); videoWidget->videoSurface()->start(format); videoWidget->videoSurface()->present(img); [ChangeLog] Introduced videoSurface property to QVideoWidget, QGraphicsVideoItem and QDeclarativeVideoOutput. Task-number: QTBUG-80431 Change-Id: I49641750537160832e29c297279e72b8288e974c Reviewed-by: Paul Wicking <paul.wicking@qt.io>
* Avoid initializing QFlags with 0 or nullptrFriedemann Kleint2019-11-251-2/+2
| | | | | | | It is being deprecated. Change-Id: I26b871fe9b989972ab1d2c18de344dc9c9275e9f Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@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
| * Include moc files after QT_END_NAMESPACEVal Doroshchuk2019-09-091-2/+2
| | | | | | | | | | | | Fixes: QTBUG-76574 Change-Id: I69ef47bbd01967c3d7a0c5d1554fcdd29619ebfa Reviewed-by: Christian Strømme <christian.stromme@qt.io>
* | Remove usages of deprecated APIsSona Kurazyan2019-08-081-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | - Replace the usages of deprecated APIs by corresponding alternatives. - Made the tests for deprecated APIs to compile conditionally, based on the deprecation version. Task-number: QTBUG-76491 Task-number: QTBUG-76540 Task-number: QTBUG-76541 Change-Id: Ifd397dae9b3ebc2ba2504db7baa2d8ff21bfb3a7 Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
* | Fix type of the out parameter "result" of the native event filtersFriedemann Kleint2019-03-251-0/+4
|/ | | | | | | | Task-number: QTBUG-72968 Change-Id: I31da3bd3e8a775243b94e02e3659e2d00e46b9b6 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> Reviewed-by: Oliver Wolff <oliver.wolff@qt.io> Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
* Merge remote-tracking branch 'origin/5.12' into 5.13Qt Forward Merge Bot2019-02-161-0/+4
|\ | | | | | | Change-Id: I947a3b4aaf39e56b9505ae802b8b31c718922639
| * Fix static build on WindowsKai Koehne2019-02-111-0/+4
| | | | | | | | | | | | Fixes: QTBUG-73464 Change-Id: I5d1052dec14bbe6ee69b348352991d14d63b9c76 Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
* | Fix warnings about deprecated QPalette enumerations and functionsFriedemann Kleint2019-01-141-1/+1
|/ | | | | | | | | | videowidget.cpp:625:32: warning: 'Background' is deprecated: Use QPalette::Window instead [-Wdeprecated-declarations] qgstreamervideowidget.cpp:56:36: warning: 'Background' is deprecated: Use QPalette::Window instead [-Wdeprecated-declarations] qgstreamervideowidget.cpp:56:36: warning: 'Background' is deprecated: Use QPalette::Window instead [-Wdeprecated-declarations] qgstreamervideowidget.cpp:83:55: warning: 'const QBrush& QPalette::background() const' is deprecated: Use QPalette::window() instead [-Wdeprecated-declarations] Change-Id: Ieb55a57c5672d3023a48461ec347fbb30210fd1e Reviewed-by: Christian Ehrlicher <ch.ehrlicher@gmx.de>