Compare commits

..
43 Commits
Author SHA1 Message Date
Cameron Gutman 21be832161 Prepare for v3.1.1 release 2021-04-09 21:07:05 -05:00
Cameron Gutman 5769632793 Update moonlight-common-c for initial GFE 3.22 compatibility 2021-04-09 20:18:47 -05:00
Cameron Gutman 9efd959ed8 Merge branch 'weblate' 2021-04-09 20:17:39 -05:00
Cameron Gutman 5c72afe17e Run lupdate-pro and lrelease-pro 2021-04-04 20:45:57 -05:00
a dc24319333 Translated using Weblate (Russian)
Currently translated at 100.0% (184 of 184 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/ru/
2021-04-05 03:42:34 +02:00
Jorys Paulin 1acbdf94aa Translated using Weblate (French)
Currently translated at 100.0% (184 of 184 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/fr/
2021-04-05 03:42:33 +02:00
Cameron Gutman 44229dfe51 Update translations
- Add RU and ES to resources.qrc and app.pro
- Rerun lupdate-pro and lrelease-pro
2021-04-04 10:25:06 -05:00
a 13206227d9 Translated using Weblate (Russian)
Currently translated at 100.0% (184 of 184 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/ru/
2021-04-04 17:03:35 +02:00
Cameron Gutman e3e8a57df6 Update to OpenSSL 1.1.1k and FFmpeg 4.3.2 2021-03-31 20:27:33 -05:00
Cameron Gutman 7afff80984 Update moonlight-common-c to pick up AMF HEVC parsing fix 2021-03-31 20:07:45 -05:00
Cameron Gutman 500522418e Fix AppImage build 2021-03-28 16:07:20 -05:00
a 5ccac5a5c3 Translated using Weblate (Russian)
Currently translated at 45.1% (83 of 184 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/ru/
2021-03-28 14:29:40 +02:00
Héctor 69822f4401 Translated using Weblate (Spanish)
Currently translated at 11.4% (21 of 184 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/es/
2021-03-28 14:29:39 +02:00
reloxx13 f290cfbd35 Translated using Weblate (German)
Currently translated at 100.0% (184 of 184 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/de/
2021-03-28 14:29:39 +02:00
Cameron Gutman fae30f59ce Add attribution for Cloudsmith 2021-03-27 12:40:51 -05:00
a a15f303c0a Added translation using Weblate (Russian) 2021-03-26 05:05:09 +01:00
Cameron Gutman 5e85038d78 Update AppImage to libva 2.11 2021-03-25 22:17:51 -05:00
Héctor 4e7b35c54e Added translation using Weblate (Spanish) 2021-03-25 09:04:18 +01:00
Cameron Gutman 48dde310ae Add Norwegian Bokmål to the build 2021-03-24 20:40:22 -05:00
Cameron Gutman 6b041e7657 Run lrelease-pro 2021-03-24 20:39:52 -05:00
Cameron Gutman 69576ee1e1 Run lupdate-pro 2021-03-24 20:39:39 -05:00
Cameron Gutman bd3105f62e Merge remote-tracking branch 'origin/weblate' 2021-03-24 20:28:24 -05:00
Cameron Gutman 02e3f0e71b Add missing declaration 2021-03-22 23:32:00 -05:00
Cameron Gutman 74bf981f3d Ensure hwframe read-back works in SDL renderer 2021-03-22 23:15:14 -05:00
Cameron Gutman 32f0678692 Only pass modifiers array if DRM_MODE_FB_MODIFIERS is set 2021-03-22 22:52:06 -05:00
Cameron Gutman e74753bec1 Allow fallback from EGL to direct on EGLImage export failure 2021-03-22 22:51:29 -05:00
Cameron Gutman 4a8c9ad17f Add support for 4-plane frames 2021-03-22 00:46:04 -05:00
Cameron Gutman 0c6c882f50 Fix attribute buffer overflow for fully planar YUV formats 2021-03-22 00:14:06 -05:00
Cameron Gutman 579f25c1ba Add missing EGL_DMA_BUF_PLANE2 definitions 2021-03-22 00:02:03 -05:00
Cameron Gutman d5eb5c8816 Fix build with EGL 1.4 headers 2021-03-21 23:59:35 -05:00
Cameron Gutman 26d04b5f9c Render DRM-PRIME frames as opaque images
We can't always assume they are NV12. Even if they _are_ NV12,
they may have DRM format modifiers that are incompatible with
simply assuming linear Y and UV buffers (such as tiling).
2021-03-21 23:23:12 -05:00
Cameron Gutman a0b9684504 Continue refactoring for non-NV12 support in EGLRenderer 2021-03-21 21:43:57 -05:00
Cameron Gutman 402b6d1f0c Begin refactoring for non-NV12 support in EGLRenderer 2021-03-21 19:20:52 -05:00
Cameron Gutman e87a5fa354 Pass DRM format modifiers to FB creation 2021-03-21 17:54:10 -05:00
Allan Nordhøy 63574f643e Translated using Weblate (Norwegian Bokmål)
Currently translated at 70.1% (129 of 184 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/nb_NO/
2021-03-21 10:36:54 +01:00
Cameron Gutman 1d6b1020c3 Translated using Weblate (French)
Currently translated at 73.9% (136 of 184 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/fr/
2021-03-21 06:29:36 +01:00
Allan Nordhøy 96337a3230 Translated using Weblate (Norwegian Bokmål)
Currently translated at 16.3% (30 of 184 strings)

Translation: moonlight/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/nb_NO/
2021-03-21 02:33:56 +01:00
reloxx13 950c59d8b4 Translated using Weblate (German)
Currently translated at 100.0% (184 of 184 strings)

Translation: moonlight/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/de/
2021-03-21 02:33:56 +01:00
Allan Nordhøy 9cfd095281 Added translation using Weblate (Norwegian Bokmål) 2021-03-21 02:33:56 +01:00
Anonymous 996e049863 Translated using Weblate (Chinese (Simplified))
Currently translated at 96.1% (177 of 184 strings)

Translation: moonlight/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/zh_Hans/
2021-03-21 02:33:56 +01:00
Anonymous 6e42817c3e Translated using Weblate (French)
Currently translated at 74.4% (137 of 184 strings)

Translation: moonlight/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/fr/
2021-03-21 02:33:56 +01:00
Cameron Gutman 7758344a57 Fix Weblate badge 2021-03-20 18:12:04 -05:00
Cameron Gutman b5df566b6b Add Weblate links to readme
Closes #539
2021-03-20 18:11:15 -05:00
36 changed files with 3745 additions and 441 deletions
+8 -1
View File
@@ -4,10 +4,11 @@
Moonlight also has mobile versions for [Android](https://github.com/moonlight-stream/moonlight-android) and [iOS](https://github.com/moonlight-stream/moonlight-ios).
You can follow development on our [Discord server](https://moonlight-stream.org/discord).
You can follow development on our [Discord server](https://moonlight-stream.org/discord) and help translate Moonlight into your language on [Weblate](https://hosted.weblate.org/projects/moonlight/moonlight-qt/).
[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/glj5cxqwy2w3bglv/branch/master?svg=true)](https://ci.appveyor.com/project/cgutman/moonlight-qt/branch/master)
[![Downloads](https://img.shields.io/github/downloads/moonlight-stream/moonlight-qt/total)](https://github.com/moonlight-stream/moonlight-qt/releases)
[![Translation Status](https://hosted.weblate.org/widgets/moonlight/-/moonlight-qt/svg-badge.svg)](https://hosted.weblate.org/projects/moonlight/moonlight-qt/)
## Features
- Hardware accelerated video decoding on Windows, Mac, and Linux
@@ -28,6 +29,12 @@ You can follow development on our [Discord server](https://moonlight-stream.org/
- [Raspberry Pi 4](https://github.com/moonlight-stream/moonlight-docs/wiki/Installing-Moonlight-Qt-on-Raspberry-Pi-4)
- [NVIDIA Jetson and Nintendo Switch (Ubuntu L4T)](https://github.com/moonlight-stream/moonlight-docs/wiki/Installing-Moonlight-Qt-on-Linux4Tegra-(L4T)-Ubuntu)
#### Special Thanks
[![Hosted By: Cloudsmith](https://img.shields.io/badge/OSS%20hosting%20by-cloudsmith-blue?logo=cloudsmith&style=flat-square)](https://cloudsmith.com)
Hosting for Moonlight's Raspberry Pi and L4T package repositories is graciously provided for free by [Cloudsmith](https://cloudsmith.com).
## Building
### Windows Build Requirements
+4 -1
View File
@@ -327,7 +327,10 @@ RESOURCES += \
TRANSLATIONS += \
languages/qml_zh_cn.ts \
languages/qml_de.ts \
languages/qml_fr.ts
languages/qml_fr.ts \
languages/qml_nb_NO.ts \
languages/qml_ru.ts \
languages/qml_es.ts
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
@@ -36,6 +36,17 @@
</screenshots>
<releases>
<release version="3.1.1" date="2021-04-09">
<description>
<p>Changes:</p>
<ul>
<li>Added support for streaming from GeForce Experience 3.22</li>
<li>Added support for AMF-encoded HEVC streams from servers like Sunshine and OpenStream</li>
<li>Added new community-contributed translations from Weblate</li>
<li>Fixed KMSDRM rendering with buffer modifiers on embedded devices</li>
</ul>
</description>
</release>
<release version="3.1.0" date="2021-03-14">
<description>
<p>New features:</p>
+13
View File
@@ -781,6 +781,19 @@ Flickable {
text: "简体中文" //Simplified Chinese
val: StreamingPreferences.LANG_ZH_CN
}
ListElement {
text: "Norwegian Bokmål"
val: StreamingPreferences.LANG_NB_NO
}
ListElement {
text: "русский" // Russian
val: StreamingPreferences.LANG_RU
}
// Don't list Spanish until it is more complete
/*ListElement {
text: "Español" // Spanish
val: StreamingPreferences.LANG_ES
}*/
}
// ::onActivated must be used, as it only listens for when the index is changed by a human
onActivated : {
Binary file not shown.
+113 -113
View File
@@ -113,7 +113,7 @@
<message>
<location filename="../gui/PcView.qml" line="70"/>
<source>This PC&apos;s Internet connection is blocking Moonlight. Streaming over the Internet may not work while connected to this network.</source>
<translation>Die Internetverbindung dieses Hosts blockiert Moonlight. Solange eine Verbindung mit diesem Netzwerk besteht, wird das streamen übers Internet möglicherweise nicht funktionieren.</translation>
<translation>Die Internetverbindung dieses Hosts blockiert Moonlight. Solange eine Verbindung mit diesem Netzwerk besteht, wird das Streamen übers Internet möglicherweise nicht funktionieren.</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="73"/>
@@ -140,7 +140,7 @@
<message>
<location filename="../gui/PcView.qml" line="187"/>
<source>Wake PC</source>
<translation>Host aufwachen</translation>
<translation>Host aufwecken</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="193"/>
@@ -160,12 +160,12 @@
<message>
<location filename="../gui/PcView.qml" line="242"/>
<source>You cannot pair while a previous session is still running on the host PC. Quit any running games or reboot the host PC, then try pairing again.</source>
<translation>Solange eine vorherige Session auf dem Host läuft, kann du nicht Pairen. Beende alle laufenden Apps oder state den Host neu. Dann probiere das pairen nochmal.</translation>
<translation>Solange eine vorherige Session auf dem Host läuft, kannst du nicht koppeln. Beende alle laufenden Apps oder starte den Host neu. Dann probiere das Koppeln erneut.</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="297"/>
<source>Please enter %1 on your GameStream PC. This dialog will close when pairing is completed.</source>
<translation>Bitte gebe %1 auf deinem Host ein. Diese Nachricht wird nach dem Pairen automatisch geschlossen.</translation>
<translation>Bitte gebe %1 auf deinem Host ein. Diese Nachricht wird nach dem Koppeln automatisch geschlossen.</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="308"/>
@@ -175,12 +175,12 @@
<message>
<location filename="../gui/PcView.qml" line="325"/>
<source>Moonlight is testing your network connection to determine if NVIDIA GameStream is blocked.</source>
<translation>Moonlight testet nun dein Netzwerk umherauszufinden, ob NVIDIA GameStream blockiert ist.</translation>
<translation>Moonlight testet nun dein Netzwerk um herauszufinden, ob NVIDIA GameStream blockiert ist.</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="325"/>
<source>This may take a few seconds…</source>
<translation>Dies dauert ein paar Sekunden...</translation>
<translation>Dies dauert ein paar Sekunden…</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="336"/>
@@ -190,12 +190,12 @@
<message>
<location filename="../gui/PcView.qml" line="336"/>
<source>If you are trying to stream over the Internet, install the Moonlight Internet Hosting Tool on your gaming PC and run the included Internet Streaming Tester to check your gaming PC&apos;s Internet connection.</source>
<translation>Wenn du veruchst übers Internet zu streamen, installiere das Moonlight Internet Hosting Tool auf deinem Host und starte das dort enthaltene Internet Streaming Tester Tool um deine Hos Internetverbindung zu prüfen.</translation>
<translation>Wenn du versuchst übers Internet zu streamen, installiere das Moonlight Internet Hosting Tool auf deinem Host und starte das dort enthaltene Internet Streaming Tester Tool um deine Host Internetverbindung zu prüfen.</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="340"/>
<source>Your PC&apos;s current network connection seems to be blocking Moonlight. Streaming over the Internet may not work while connected to this network.</source>
<translation>Die Internetverbindung dieses Hosts blockiert Moonlight. Solange eine Verbindung mit diesem Netzwerk besteht, wird das streamen übers Internet möglicherweise nicht funktionieren.</translation>
<translation>Die Internetverbindung dieses Hosts blockiert Moonlight. Solange eine Verbindung mit diesem Netzwerk besteht, wird das Streamen übers Internet möglicherweise nicht funktionieren.</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="340"/>
@@ -230,7 +230,7 @@
<message>
<location filename="../gui/PcView.qml" line="177"/>
<source>View All Apps</source>
<translation>Zeieg alle Apps</translation>
<translation>Zeige alle Apps</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="352"/>
@@ -258,7 +258,7 @@
<location filename="../cli/quitstream.cpp" line="88"/>
<location filename="../cli/startstream.cpp" line="89"/>
<source>Computer %1 has not been paired. Please open Moonlight to pair before streaming.</source>
<translation>PC %1 wurde noch nicht gepairt. Bitte öffne Moonlight zum pairen.</translation>
<translation>Host %1 wurde noch nicht gekoppelt. Bitte öffne Moonlight zum koppeln.</translation>
</message>
<message>
<location filename="../cli/quitstream.cpp" line="102"/>
@@ -304,7 +304,7 @@
<message>
<location filename="../streaming/session.cpp" line="100"/>
<source>Something went wrong on your host PC when starting the stream.</source>
<translation>Auf deinem Host ist etwas schiefgelaufen beim starten vom Stream.</translation>
<translation>Auf deinem Host ist etwas beim Starten vom Stream schiefgelaufen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="101"/>
@@ -322,107 +322,107 @@
<translation>Verbindung getrennt</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="578"/>
<location filename="../streaming/session.cpp" line="581"/>
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
<translation>Die Auswahl des Remote Desktop Maus Modus kann in Spielen zu Problemen führen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="583"/>
<location filename="../streaming/session.cpp" line="586"/>
<source>HDR is not supported with software decoding.</source>
<translation>HDR wird nicht von Software decodierung unterstützt.</translation>
<translation>HDR wird nicht von Software Dekodierung unterstützt.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="587"/>
<location filename="../streaming/session.cpp" line="590"/>
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
<translation>Software decodierung kann zu schlecher streaming Leitung führen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="592"/>
<source>Using unsupported FPS options may cause stuttering or lag.</source>
<translation>Nicht unterstütze FPS Optionen kann stottern verursachen.</translation>
<translation>Software Dekodierung kann zu schlecher streaming Leitung führen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="595"/>
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
<translation>V-Sync wird deaktiviert wenn mit einer höheren FrameRate als der Display gestreamt wird.</translation>
<source>Using unsupported FPS options may cause stuttering or lag.</source>
<translation>Nicht unterstützte FPS Optionen können stottern verursachen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="612"/>
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
<translation>Da deine Grafikkarte kein HEVC Decodierung unterstützt wird Software decoding benutzt. Die kann zu einer schlechten streaming Leistung führen.</translation>
<location filename="../streaming/session.cpp" line="598"/>
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
<translation>V-Sync wird deaktiviert wenn mit einer höheren Framerate als der des Display gestreamt wird.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="615"/>
<source>This PC&apos;s GPU doesn&apos;t support HEVC decoding.</source>
<translation>Die Grafikkarte deines PC&apos;s unterstützt keine HEVC Decodierung.</translation>
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
<translation>Da deine Grafikkarte kein HEVC Decodierung unterstützt wird Software Dekodierung benutzt. Die kann zu einer schlechten streaming Leistung führen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="622"/>
<location filename="../streaming/session.cpp" line="618"/>
<source>This PC&apos;s GPU doesn&apos;t support HEVC decoding.</source>
<translation>Die Grafikkarte deines PC&apos;s unterstützt keine HEVC Dekodierung.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="625"/>
<source>Your host PC GPU doesn&apos;t support HEVC. A GeForce GTX 900-series (Maxwell) or later GPU is required for HEVC streaming.</source>
<translation>Die Grafikkarte deines Host&apos;s unterstützt kein HEVC. Es wird mindestens eine GeForce GTX 900-Series (Maxwell) oder neuer benötigt.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="639"/>
<location filename="../streaming/session.cpp" line="642"/>
<source>%1 doesn&apos;t support HDR10.</source>
<translation>%1 unterstützt kein HDR10.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="643"/>
<location filename="../streaming/session.cpp" line="646"/>
<source>Your host PC GPU doesn&apos;t support HDR streaming. A GeForce GTX 1000-series (Pascal) or later GPU is required for HDR streaming.</source>
<translation>Die Grafikkarte deines Host&apos;s unterstützt kein HDR. Es wird mindestens eine GeForce GTX 1000-Series (Pascal) oder neuer benötigt.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="652"/>
<location filename="../streaming/session.cpp" line="655"/>
<source>This PC&apos;s GPU doesn&apos;t support HEVC Main10 decoding for HDR streaming.</source>
<translation>Die Grafikkarte deines PC&apos;s unterstützt keine HEVC Main10 Decodierung für HDR streaming.</translation>
<translation>Die Grafikkarte deines PC&apos;s unterstützt keine HEVC Main10 Dekodierung für HDR streaming.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="665"/>
<location filename="../streaming/session.cpp" line="668"/>
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
<translation>Für 4K steaming wird mindestens GeForce Experience 3.0 benötigt.</translation>
<translation>Für 4K Streaming wird mindestens GeForce Experience 3.0 benötigt.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="680"/>
<location filename="../streaming/session.cpp" line="683"/>
<source>Your selected surround sound setting is not supported by the current audio device.</source>
<translation>Deine ausgewählte Surround Sound Einstellung wird nicht von dem momentanen Audiogerät untertützt.</translation>
<translation>Deine ausgewählte Surround Sound Einstellung wird von dem momentanen Audiogerät nicht untertützt.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="687"/>
<location filename="../streaming/session.cpp" line="690"/>
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
<translation>Zugriff auf das Audiogerät fehlgeschlagen. Es wird kein Ton für diese Session Verfügbar sein.</translation>
<translation>Zugriff auf das Audiogerät fehlgeschlagen. Es wird kein Ton für diese Session verfügbar sein.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="692"/>
<location filename="../streaming/session.cpp" line="695"/>
<source>An attached gamepad has no mapping and won&apos;t be usable. Visit the Moonlight help to resolve this.</source>
<translation>Ein angeschlossener Controller hat keine Tastenbelegung und ist somit nicht nutzbar. Besuche die Moonlight help um dies zu lösen.</translation>
<translation>Ein angeschlossener Controller hat keine Tastenbelegung und ist somit nicht nutzbar. Besuche die Moonlight Hilfe um dies zu lösen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="700"/>
<location filename="../streaming/session.cpp" line="703"/>
<source>Your host PC&apos;s GPU doesn&apos;t support streaming video resolutions over 4K.</source>
<translation>Die Grafikkarte deines Host&apos;s unterstüzt keine Videoauflösung übr 4K zum Streamen.</translation>
<translation>Die Grafikkarte deines Host&apos;s unterstüzt keine Videoauflösung über 4K zum Streamen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="704"/>
<location filename="../streaming/session.cpp" line="707"/>
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
<translation>Videoauflösungen über 4K sind nur mit dem HEVC Codec Verfügbar.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="718"/>
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC&apos;s GPU.</source>
<translation>Erzwungene Hardware Decodierung kann nicht ausgewählt werden, da der PC keine Hardware Decodierung unterstützt.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="721"/>
<source>Your codec selection and force hardware decoding setting are not compatible. This PC&apos;s GPU lacks support for decoding your chosen codec.</source>
<translation>Erzwungene Hardware Decodierung ist nicht mit deinem ausgewähltem Codec kompatibel, da die Grafikkarte deines PC&apos;s den ausgewählen Codec nicht unterstützt.</translation>
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC&apos;s GPU.</source>
<translation>Erzwungene Hardware Dekodierung kann nicht ausgewählt werden, da der PC keine Hardware Decodierung unterstützt.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="1022"/>
<location filename="../streaming/session.cpp" line="724"/>
<source>Your codec selection and force hardware decoding setting are not compatible. This PC&apos;s GPU lacks support for decoding your chosen codec.</source>
<translation>Erzwungene Hardware Dekodierung ist nicht mit deinem ausgewähltem Codec kompatibel, da die Grafikkarte deines PC&apos;s den ausgewählen Codec nicht unterstützt.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="1025"/>
<source>GeForce Experience returned error: %1</source>
<translation>GeForce Experience hat einen Fehler gemeldet: %1</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="1445"/>
<location filename="../streaming/session.cpp" line="1503"/>
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
<translation>Video Decoder konnte nicht initialisiert werden. Bitte prüfe deine Streaming Einstellungen und versuche es erneut.</translation>
</message>
@@ -442,7 +442,7 @@
<message>
<location filename="../gui/SettingsView.qml" line="78"/>
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
<translation>Zu hohe Werte für deinen PC oder deinem Netzwerk kann Lag oder Fehler verursachen.</translation>
<translation>Zu hohe Werte für deinen PC oder dein Netzwerk können Lags oder Fehler verursachen.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="60"/>
@@ -472,12 +472,12 @@
<message>
<location filename="../gui/SettingsView.qml" line="331"/>
<source>Custom resolutions are not officially supported by GeForce Experience, so it will not set your host display resolution. You will need to set it manually while in game.</source>
<translation>Benutzerdefinierte Auflösungen sind offiziell nicht von GeForce Experience unterstützt, daher wird es deine Host Auflösung nicht setzen. Du musst es manuell setzen während des Streams.</translation>
<translation>Benutzerdefinierte Auflösungen sind offiziell nicht von GeForce Experience unterstützt, daher wird es deine Host Auflösung nicht setzen. Du musst es manuell während des Streams setzen.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="332"/>
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
<translation>Auflösung die von deinem Host oder Client nicht unterstützt sind, können zu Fehlern beim streamen führen.</translation>
<translation>Auflösung die nicht von deinem Host oder Client unterstützt sind, können zu Fehlern beim Streamen führen.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="338"/>
@@ -504,7 +504,7 @@
<message>
<location filename="../gui/SettingsView.qml" line="501"/>
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
<translation>Verringere die Bitrate für langsame Verbindungen. Erhöhe sie für eine bessere Videoqualität.</translation>
<translation>Verringere die Bitrate bei einer langsamen Verbindung, Erhöhe sie für eine bessere Videoqualität.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="519"/>
@@ -524,7 +524,7 @@
</message>
<message>
<location filename="../gui/SettingsView.qml" line="573"/>
<location filename="../gui/SettingsView.qml" line="847"/>
<location filename="../gui/SettingsView.qml" line="860"/>
<source>Fullscreen</source>
<translation>Vollbild</translation>
</message>
@@ -549,7 +549,7 @@
</message>
<message>
<location filename="../gui/SettingsView.qml" line="581"/>
<location filename="../gui/SettingsView.qml" line="839"/>
<location filename="../gui/SettingsView.qml" line="852"/>
<source>Windowed</source>
<translation>Fenster</translation>
</message>
@@ -596,12 +596,12 @@
<message>
<location filename="../gui/SettingsView.qml" line="693"/>
<source>Mute host PC speakers while streaming</source>
<translation>Schalte die Host Lautsprecher stumm während des streamens</translation>
<translation>Schalte die Host Lautsprecher während des streamens stumm</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="703"/>
<source>You must restart any game currently in progress for this setting to take effect</source>
<translation>Du musst die laufende App neustarten damit diese Einstellung aktiv wird</translation>
<translation>Du musst die laufende App neustarten, damit diese Einstellung aktiv wird</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="709"/>
@@ -629,32 +629,32 @@
<translation>Automatisch</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="792"/>
<location filename="../gui/SettingsView.qml" line="805"/>
<source>You must restart Moonlight for this change to take effect</source>
<translation>Du musst Moonlight neustarten damit diese Einstellung aktiv wird</translation>
<translation>Du musst Moonlight neustarten, damit diese Einstellung aktiv wird</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="806"/>
<location filename="../gui/SettingsView.qml" line="819"/>
<source>GUI display mode</source>
<translation>Anzeige Modus der Oberfläche</translation>
<translation>Anzeigemodus der Oberfläche</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="843"/>
<location filename="../gui/SettingsView.qml" line="856"/>
<source>Maximized</source>
<translation>Maximiert</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="900"/>
<location filename="../gui/SettingsView.qml" line="913"/>
<source>Input Settings</source>
<translation>Eingabe Einstellungen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="922"/>
<location filename="../gui/SettingsView.qml" line="934"/>
<source>This enables seamless mouse control without capturing the client&apos;s mouse cursor. It is ideal for remote desktop usage but will not work in most games.</source>
<translation>Dies ermöglicht eine nahtlose Maussteuerung, ohne den Mauszeiger des PCs zu erfassen. Es ist ideal für die Remote-Desktop-Nutzung, funktioniert aber bei den meisten Spielen nicht.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="924"/>
<location filename="../gui/SettingsView.qml" line="936"/>
<source>NOTE: Due to a bug in GeForce Experience, this option may not work properly if your host PC has multiple monitors.</source>
<translation>HINWEIS: Aufgrund eines Fehlers in GeForce Experience funktioniert diese Option möglicherweise nicht richtig, wenn Ihr Host mehrere Monitore hat.</translation>
</message>
@@ -667,77 +667,77 @@
<translation type="vanished">Dies ermöglicht die Erfassung von systemweiten Tastenkombinationen wie Alt+Tab, die normalerweise vom Client beim Streamen im Vollbildmodus ausgeführt werden würden.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="943"/>
<location filename="../gui/SettingsView.qml" line="955"/>
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
<translation>HINWEIS: Bestimmte Tastenkombinationen wie Strg+Alt+Entf unter Windows können von keiner Anwendung abgefangen werden, auch nicht von Moonlight.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1006"/>
<location filename="../gui/SettingsView.qml" line="1018"/>
<source>Use touchscreen as a virtual trackpad</source>
<translation>Touchscreen als virtuelles Trackpad verwenden</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1023"/>
<location filename="../gui/SettingsView.qml" line="1035"/>
<source>Swap left and right mouse buttons</source>
<translation>Linke und rechte Maustaste vertauschen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1035"/>
<location filename="../gui/SettingsView.qml" line="1047"/>
<source>Reverse mouse scrolling direction</source>
<translation>Scrollrichtung umkehren</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1049"/>
<location filename="../gui/SettingsView.qml" line="1061"/>
<source>Gamepad Settings</source>
<translation>Controller Einstellungen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1059"/>
<location filename="../gui/SettingsView.qml" line="1071"/>
<source>Swap A/B and X/Y gamepad buttons</source>
<translation>Tausche A/B und X/Y Controller Tasten</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1077"/>
<location filename="../gui/SettingsView.qml" line="1089"/>
<source>This switches gamepads into a Nintendo-style button layout</source>
<translation>Dies ändert das Controller Tastenlayout in ein Nintento Controller Style Layout</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1083"/>
<location filename="../gui/SettingsView.qml" line="1095"/>
<source>Force gamepad #1 always connected</source>
<translation>Erzwinge das Controller #1 immer verbunden ist</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1093"/>
<location filename="../gui/SettingsView.qml" line="1105"/>
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
<translation>Erzwingt, dass ein Controller immer mit dem Host verbunden bleibt, auch wenn keine Gamepads an diesen PC angeschlossen sind.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="923"/>
<location filename="../gui/SettingsView.qml" line="935"/>
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
<translation>Du kannst dies während des streamens umstellen mit Strg+Alt+Shift+M.</translation>
<translation>Du kannst dies während des Streamens umstellen mit Strg+Alt+Shift+M.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1101"/>
<location filename="../gui/SettingsView.qml" line="1113"/>
<source>Enable mouse control with gamepads by holding the &apos;Start&apos; button</source>
<translation>Aktivieren Sie die Maussteuerung mit Controllern, indem Sie die &apos;Start&apos;-Taste gedrückt halten</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1112"/>
<location filename="../gui/SettingsView.qml" line="1124"/>
<source>Process gamepad input when Moonlight is in the background</source>
<translation>Controller-Eingaben ausführen auch wenn Moonlight im Hintergrund ist</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1123"/>
<location filename="../gui/SettingsView.qml" line="1135"/>
<source>Allows Moonlight to capture gamepad inputs even if it&apos;s not the current window in focus</source>
<translation>Erlaubt es Moonlight Controller-Eingaben an den Stream zu schicken auch wenn es nicht das aktive Fenster ist</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1132"/>
<location filename="../gui/SettingsView.qml" line="1144"/>
<source>Host Settings</source>
<translation>Host Einstellungen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1172"/>
<location filename="../gui/SettingsView.qml" line="1184"/>
<source>Advanced Settings</source>
<translation>Erweiterte Einstellungen</translation>
</message>
@@ -747,118 +747,118 @@
<translation>Audio Einstellungen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="860"/>
<location filename="../gui/SettingsView.qml" line="873"/>
<source>Show connection quality warnings</source>
<translation>Warnung bei Verbindungsproblemen anzeigen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="872"/>
<location filename="../gui/SettingsView.qml" line="885"/>
<source>Discord Rich Presence integration</source>
<translation>Integration von Discord Rich Presence</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="882"/>
<location filename="../gui/SettingsView.qml" line="895"/>
<source>Updates your Discord status to display the name of the game you&apos;re streaming.</source>
<translation>Aktualisiert deinen Discord Status um den Namen der aktuellen App anzuzeigen wenn du steamst.</translation>
<translation>Aktualisiert deinen Discord Status um den Namen der aktuellen App anzuzeigen, wenn du streamst.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1094"/>
<location filename="../gui/SettingsView.qml" line="1106"/>
<source>Only enable this option when streaming a game that doesn&apos;t support gamepads being connected after startup.</source>
<translation>Aktiviere diese Option nur wenn du ein Spiel streamst, dass die Verbindung von Controllern nach dem Start nicht unterstützt.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="911"/>
<location filename="../gui/SettingsView.qml" line="924"/>
<source>Optimize mouse for remote desktop instead of games</source>
<translation>Optimiere die Maus für Remote Desktop statt für Apps</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="934"/>
<location filename="../gui/SettingsView.qml" line="946"/>
<source>Capture system keyboard shortcuts</source>
<translation>Erfasse Systemtastatur Shortcuts</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="942"/>
<location filename="../gui/SettingsView.qml" line="954"/>
<source>This enables the capture of system-wide keyboard shortcuts like Alt+Tab that would normally be handled by the client OS while streaming.</source>
<translation>Dies aktiviert das Erfassen von Systemweiten Tastatur Shortcuts wie Alt+Tab, welche nomalerweise auf dem Client ausgeführt werden würden.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="972"/>
<location filename="../gui/SettingsView.qml" line="984"/>
<source>in fullscreen</source>
<translation>im Vollbildmodus</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="976"/>
<location filename="../gui/SettingsView.qml" line="988"/>
<source>always</source>
<translation>immer</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1016"/>
<location filename="../gui/SettingsView.qml" line="1028"/>
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
<translation>Wenn aktiviert, verhält sich der Touchscreen wie ein Trackpad. Wenn deaktiviert, steuert der Touchscreen direkt den Mauszeiger.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1142"/>
<location filename="../gui/SettingsView.qml" line="1154"/>
<source>Optimize game settings for streaming</source>
<translation>Optimiere die Spieleinstellungen für das streamen</translation>
<translation>Optimiere die Spieleinstellungen für das Streamen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1153"/>
<location filename="../gui/SettingsView.qml" line="1165"/>
<source>Quit app on host PC after ending stream</source>
<translation>Schließe die App auf dem Host nach dem beenden des Streams</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1163"/>
<location filename="../gui/SettingsView.qml" line="1175"/>
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
<translation>Dadurch wird die App, dass du streamst, geschlossen, wenn du deinen Stream beendest. Du verlierst dabei alle ungespeicherten Fortschritte!</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1182"/>
<location filename="../gui/SettingsView.qml" line="1194"/>
<source>Video decoder</source>
<translation>Video Decoder</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1207"/>
<location filename="../gui/SettingsView.qml" line="1253"/>
<location filename="../gui/SettingsView.qml" line="1219"/>
<location filename="../gui/SettingsView.qml" line="1265"/>
<source>Automatic (Recommended)</source>
<translation>Automatisch (empfohlen)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1211"/>
<location filename="../gui/SettingsView.qml" line="1223"/>
<source>Force software decoding</source>
<translation>Erwzinge Software decoding</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1215"/>
<location filename="../gui/SettingsView.qml" line="1227"/>
<source>Force hardware decoding</source>
<translation>Erzwinge Hardware decoding</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1228"/>
<location filename="../gui/SettingsView.qml" line="1240"/>
<source>Video codec</source>
<translation>Video Codec</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1257"/>
<location filename="../gui/SettingsView.qml" line="1269"/>
<source>H.264</source>
<translation>H.264</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1261"/>
<location filename="../gui/SettingsView.qml" line="1273"/>
<source>HEVC (H.265)</source>
<translation>HEVC (H.265)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1278"/>
<location filename="../gui/SettingsView.qml" line="1290"/>
<source>Unlock unsupported FPS options</source>
<translation>Zeige nicht unterstützte FPS Optionen an</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1297"/>
<location filename="../gui/SettingsView.qml" line="1309"/>
<source>Automatically find PCs on the local network (Recommended)</source>
<translation>Suche automatisch nach Hosts im lokalen Netzwerk (empfohlen)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1322"/>
<location filename="../gui/SettingsView.qml" line="1334"/>
<source>Automatically detect blocked connections (Recommended)</source>
<translation>Erkenne automatisch geblockte Verbindungen (empfohlen)</translation>
</message>
@@ -909,7 +909,7 @@
<message>
<location filename="../gui/StreamSegue.qml" line="162"/>
<source>Ctrl+Alt+Shift+Q</source>
<translation>Strg + Alt + Shift + Q</translation>
<translation>Strg+Alt+Shift+Q</translation>
</message>
</context>
<context>
@@ -955,7 +955,7 @@
<message>
<location filename="../gui/main.qml" line="381"/>
<source>Gamepad Mapping</source>
<translation>Controller Tastenbelegen</translation>
<translation>Controllertasten belegen</translation>
</message>
<message>
<location filename="../gui/main.qml" line="415"/>
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
+128 -128
View File
@@ -23,12 +23,12 @@
<message>
<location filename="../gui/AppView.qml" line="306"/>
<source>Direct Launch</source>
<translation type="unfinished"></translation>
<translation>Lancement direct</translation>
</message>
<message>
<location filename="../gui/AppView.qml" line="310"/>
<source>Launch this app immediately when the host is selected, bypassing the app selection grid.</source>
<translation type="unfinished"></translation>
<translation>Lancer cette application immédiatement lorsque l&apos;hôte est sélectionné, en passant la grille d&apos;applications.</translation>
</message>
<message>
<location filename="../gui/AppView.qml" line="319"/>
@@ -38,17 +38,17 @@
<message>
<location filename="../gui/AppView.qml" line="323"/>
<source>Hide this game from the app grid. To access hidden games, right-click on the host and choose %1.</source>
<translation type="unfinished"></translation>
<translation>Cacher ce jeu de la grille d&apos;applications. Pour le retrouver plus tard, faites un clic droit sur l&apos;ordinateur et choisissez %1.</translation>
</message>
<message>
<location filename="../gui/AppView.qml" line="323"/>
<source>View All Apps</source>
<translation type="unfinished"></translation>
<translation>Voir toutes les applis</translation>
</message>
<message>
<location filename="../gui/AppView.qml" line="338"/>
<source>Are you sure you want to quit %1? Any unsaved progress will be lost.</source>
<translation>Vous êtes sûr de vouloir arrêter %1? Tout progrès non enregistré sera perdu.</translation>
<translation>Vous êtes sûr de vouloir arrêter %1&#x202f;? Tout progrès non enregistré sera perdu.</translation>
</message>
</context>
<context>
@@ -79,7 +79,7 @@
<message>
<location filename="../gui/CliStartStreamSegue.qml" line="81"/>
<source>Are you sure you want to quit %1? Any unsaved progress will be lost.</source>
<translation>Vous êtes sûr de vouloir arrêter %1? Tout progrès non enregistré sera perdu.</translation>
<translation>Vous êtes sûr de vouloir arrêter %1&#x202f;? Tout progrès non enregistré sera perdu.</translation>
</message>
</context>
<context>
@@ -180,7 +180,7 @@
<message>
<location filename="../gui/PcView.qml" line="325"/>
<source>This may take a few seconds…</source>
<translation>Cela peut prendre quelques secondes...</translation>
<translation>Cela peut prendre quelques secondes…</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="336"/>
@@ -215,22 +215,22 @@
<message>
<location filename="../gui/PcView.qml" line="171"/>
<source>PC Status: %1</source>
<translation type="unfinished"></translation>
<translation>Statut du PC&#x202f;: %1</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="171"/>
<source>Online</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="171"/>
<source>Offline</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="177"/>
<source>View All Apps</source>
<translation type="unfinished"></translation>
<translation>Voir toutes les applis</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="352"/>
@@ -289,12 +289,12 @@
<message>
<location filename="../streaming/session.cpp" line="89"/>
<source>No video received from host.</source>
<translation type="unfinished"></translation>
<translation>Aucune vidéo reçue de l&apos;hôte.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="90"/>
<source>Check your firewall and port forwarding rules for port(s): %1</source>
<translation type="unfinished"></translation>
<translation>Vérifiez vos réglages de port et de pare-feu pour le(s) port(s) suivant(s) : %1</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="95"/>
@@ -304,17 +304,17 @@
<message>
<location filename="../streaming/session.cpp" line="100"/>
<source>Something went wrong on your host PC when starting the stream.</source>
<translation type="unfinished"></translation>
<translation>Quelque chose s&apos;est mal passé sur votre PC hôte lors du lancement du streaming.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="101"/>
<source>Make sure you don&apos;t have any DRM-protected content open on your host PC. You can also try restarting your host PC.</source>
<translation type="unfinished"></translation>
<translation>Vérifiez que vous n&apos;avez pas de contenu protégé par DRM ouvert sur votre PC hôte. Vous pouvez également essayer de redémarrer le PC hôte.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="102"/>
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
<translation type="unfinished"></translation>
<translation>Si le problème persiste, essayez de réinstaller vos pilotes GPU et GeForce Experience.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="107"/>
@@ -322,107 +322,107 @@
<translation>Connexion terminée</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="578"/>
<location filename="../streaming/session.cpp" line="581"/>
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
<translation>Votre sélection pour activer le mode de souris de bureau à distance peut causer des problèmes dans les jeux.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="583"/>
<location filename="../streaming/session.cpp" line="586"/>
<source>HDR is not supported with software decoding.</source>
<translation>Le HDR n&apos;est pas pris en charge par le décodage logiciel.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="587"/>
<location filename="../streaming/session.cpp" line="590"/>
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
<translation>La sélection de vos paramètres pour forcer le décodage du logiciel peut entraîner de mauvaises performances de streaming.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="592"/>
<location filename="../streaming/session.cpp" line="595"/>
<source>Using unsupported FPS options may cause stuttering or lag.</source>
<translation>L&apos;utilisation d&apos;options de FPS non prises en charge peut entraîner un stuttering ou des lag.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="595"/>
<location filename="../streaming/session.cpp" line="598"/>
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
<translation>La synchronisation vertical sera désactivée lors de la diffusion en continu à une fréquence d&apos;images supérieure à celle de l&apos;affichage.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="612"/>
<location filename="../streaming/session.cpp" line="615"/>
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
<translation>Utilisation du décodage logiciel dû à votre sélection pour forcer les HEVC sans support GPU. Cela peut entraîner de mauvaises performances de streaming.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="615"/>
<location filename="../streaming/session.cpp" line="618"/>
<source>This PC&apos;s GPU doesn&apos;t support HEVC decoding.</source>
<translation>Le GPU de ce PC ne prend pas en charge le décodage HEVC.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="622"/>
<location filename="../streaming/session.cpp" line="625"/>
<source>Your host PC GPU doesn&apos;t support HEVC. A GeForce GTX 900-series (Maxwell) or later GPU is required for HEVC streaming.</source>
<translation>Le GPU de votre PC hôte ne prend pas en charge les HEVC. Un GPU GeForce GTX série 900 (Maxwell) ou plus récent est nécessaire pour le streaming HEVC.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="639"/>
<location filename="../streaming/session.cpp" line="642"/>
<source>%1 doesn&apos;t support HDR10.</source>
<translation>%1 ne prend pas en charge le HDR10.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="643"/>
<location filename="../streaming/session.cpp" line="646"/>
<source>Your host PC GPU doesn&apos;t support HDR streaming. A GeForce GTX 1000-series (Pascal) or later GPU is required for HDR streaming.</source>
<translation>Le GPU de votre PC hôte ne prend pas en charge le streaming HDR. Un GPU GeForce GTX série 1000 (Pascal) ou plus récent est nécessaire pour la diffusion HDR.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="652"/>
<location filename="../streaming/session.cpp" line="655"/>
<source>This PC&apos;s GPU doesn&apos;t support HEVC Main10 decoding for HDR streaming.</source>
<translation>Le GPU de ce PC ne prend pas en charge le décodage HEVC pour le streaming HDR.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="665"/>
<location filename="../streaming/session.cpp" line="668"/>
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
<translation>Une expérience GeForce 3.0 ou supérieure est requise pour le streaming 4K.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="680"/>
<location filename="../streaming/session.cpp" line="683"/>
<source>Your selected surround sound setting is not supported by the current audio device.</source>
<translation>Le réglage du son surround que vous avez sélectionné n&apos;est pas pris en charge par l&apos;appareil audio actuel.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="687"/>
<location filename="../streaming/session.cpp" line="690"/>
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
<translation>Echec de l&apos;ouverture de l&apos;appareil audio. L&apos;audio ne sera pas disponible pendant cette session.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="692"/>
<location filename="../streaming/session.cpp" line="695"/>
<source>An attached gamepad has no mapping and won&apos;t be usable. Visit the Moonlight help to resolve this.</source>
<translation>Une manette de jeun n&apos;a pas était configurée et ne sera pas utilisable. Visitez le Moonlight pour aider à résoudre ce problème.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="700"/>
<location filename="../streaming/session.cpp" line="703"/>
<source>Your host PC&apos;s GPU doesn&apos;t support streaming video resolutions over 4K.</source>
<translation>Le GPU de votre PC hôte ne prend pas en charge les résolutions vidéo en continu supérieures à 4K.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="704"/>
<location filename="../streaming/session.cpp" line="707"/>
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
<translation>Les résolutions vidéo supérieures à 4K sont uniquement prises en charge par le codec HEVC.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="718"/>
<location filename="../streaming/session.cpp" line="721"/>
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC&apos;s GPU.</source>
<translation>Votre choix pour forcer le décodage matériel ne peut être satisfait en raison de l&apos;absence de support de décodage matériel sur le GPU de ce PC.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="721"/>
<location filename="../streaming/session.cpp" line="724"/>
<source>Your codec selection and force hardware decoding setting are not compatible. This PC&apos;s GPU lacks support for decoding your chosen codec.</source>
<translation>Votre sélection de codecs et le réglage du décodage matériel ne sont pas compatibles. Le GPU de ce PC ne prend pas en charge le décodage du codec que vous avez choisi.</translation>
<translation>Votre sélection de codecs et le réglage du décodage matériel ne sont pas compatibles. Le GPU de ce PC ne prend pas en charge le décodage du codec que vous avez choisi.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="1022"/>
<location filename="../streaming/session.cpp" line="1025"/>
<source>GeForce Experience returned error: %1</source>
<translation>GeForce Experience a renvoyé l&apos;erreur : %1</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="1445"/>
<location filename="../streaming/session.cpp" line="1503"/>
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
<translation>Impossible d&apos;initialiser le décodeur vidéo. Veuillez vérifier vos paramètres de diffusion en continu et réessayer.</translation>
</message>
@@ -472,17 +472,17 @@
<message>
<location filename="../gui/SettingsView.qml" line="331"/>
<source>Custom resolutions are not officially supported by GeForce Experience, so it will not set your host display resolution. You will need to set it manually while in game.</source>
<translation type="unfinished"></translation>
<translation>Les résolutions personnalisées ne sont pas officiellement prises en charge par GeForce Experience, qui ne pourra donc pas définir la résolution de votre écran hôte. Vous devrez la définir manuellement dans le jeu.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="332"/>
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
<translation type="unfinished"></translation>
<translation>Les résolutions qui ne sont pas prises en charge par votre client ou votre PC hôte peuvent entraîner des problèmes de diffusion.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="338"/>
<source>Enter a custom resolution:</source>
<translation type="unfinished"></translation>
<translation>Entrez une résolution personnalisée :</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="406"/>
@@ -514,7 +514,7 @@
<message>
<location filename="../gui/SettingsView.qml" line="519"/>
<source>Video bitrate: %1 Mbps</source>
<translation>Bitrate vidéo : %1 Mbps</translation>
<translation>Bitrate vidéo : %1 Mbps</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="527"/>
@@ -528,14 +528,14 @@
</message>
<message>
<location filename="../gui/SettingsView.qml" line="573"/>
<location filename="../gui/SettingsView.qml" line="847"/>
<location filename="../gui/SettingsView.qml" line="860"/>
<source>Fullscreen</source>
<translation type="unfinished"></translation>
<translation>Plein écran</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="592"/>
<source>Fullscreen generally provides the best performance, but borderless windowed may work better with features like macOS Spaces, Alt+Tab, screenshot tools, on-screen overlays, etc.</source>
<translation type="unfinished"></translation>
<translation>Le plein écran offre généralement les meilleures performances, mais le mode fenêtre sans bordure peut mieux fonctionner avec des fonctionnalités comme les espaces sur macOS, Alt+Tab, les outils de capture d&apos;écran, les overlays, etc.</translation>
</message>
<message>
<source>Full-screen</source>
@@ -548,7 +548,7 @@
</message>
<message>
<location filename="../gui/SettingsView.qml" line="581"/>
<location filename="../gui/SettingsView.qml" line="839"/>
<location filename="../gui/SettingsView.qml" line="852"/>
<source>Windowed</source>
<translation>Fenêtré</translation>
</message>
@@ -599,22 +599,22 @@
<message>
<location filename="../gui/SettingsView.qml" line="693"/>
<source>Mute host PC speakers while streaming</source>
<translation type="unfinished"></translation>
<translation>Couper le son des haut-parleurs du PC hôte pendant la diffusion</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="703"/>
<source>You must restart any game currently in progress for this setting to take effect</source>
<translation type="unfinished"></translation>
<translation>Vous devez redémarrer tout jeu en cours pour que ce paramètre prenne effet</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="709"/>
<source>Mute audio stream when Moonlight is not the active window</source>
<translation type="unfinished"></translation>
<translation>Couper le son du stream quand Moonlight n&apos;est pas au premier plan</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="720"/>
<source>Mutes Moonlight&apos;s audio when you Alt+Tab out of the stream or click on a different window.</source>
<translation type="unfinished"></translation>
<translation>Coupe le son du stream quand vous faites Alt+Tab ou si vous cliquez sur une autre fenêtre.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="729"/>
@@ -624,139 +624,139 @@
<message>
<location filename="../gui/SettingsView.qml" line="739"/>
<source>Language</source>
<translation type="unfinished"></translation>
<translation>Langue</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="765"/>
<source>Automatic</source>
<translation type="unfinished"></translation>
<translation>Automatique</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="792"/>
<location filename="../gui/SettingsView.qml" line="805"/>
<source>You must restart Moonlight for this change to take effect</source>
<translation type="unfinished"></translation>
<translation>Vous devez redémarrer Moonlight pour que ce changement prenne effet</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="806"/>
<location filename="../gui/SettingsView.qml" line="819"/>
<source>GUI display mode</source>
<translation type="unfinished"></translation>
<translation>Mode d&apos;affichage du GUI</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="843"/>
<location filename="../gui/SettingsView.qml" line="856"/>
<source>Maximized</source>
<translation type="unfinished"></translation>
<translation>Maximisé</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="900"/>
<location filename="../gui/SettingsView.qml" line="913"/>
<source>Input Settings</source>
<translation>Paramètres d&apos;entrée</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="922"/>
<location filename="../gui/SettingsView.qml" line="934"/>
<source>This enables seamless mouse control without capturing the client&apos;s mouse cursor. It is ideal for remote desktop usage but will not work in most games.</source>
<translation type="unfinished"></translation>
<translation>Cela permet un contrôle transparent de la souris, sans capturer le curseur du client. Il est idéal pour l’utilisation de bureau à distance, mais ne fonctionnera pas dans la plupart des jeux.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="924"/>
<location filename="../gui/SettingsView.qml" line="936"/>
<source>NOTE: Due to a bug in GeForce Experience, this option may not work properly if your host PC has multiple monitors.</source>
<translation type="unfinished"></translation>
<translation>REMARQUE : En raison d&apos;un bogue dans GeForce Experience, cette option peut ne pas fonctionner correctement si votre PC hôte a plusieurs moniteurs.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="943"/>
<location filename="../gui/SettingsView.qml" line="955"/>
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
<translation type="unfinished"></translation>
<translation>REMARQUE : Certains raccourcis clavier comme Ctrl+Alt+Del sur Windows ne peuvent jamais être interceptés, y compris par Moonlight.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="972"/>
<location filename="../gui/SettingsView.qml" line="984"/>
<source>in fullscreen</source>
<translation type="unfinished"></translation>
<translation>en plein écran</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="976"/>
<location filename="../gui/SettingsView.qml" line="988"/>
<source>always</source>
<translation type="unfinished"></translation>
<translation>toujours</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1006"/>
<location filename="../gui/SettingsView.qml" line="1018"/>
<source>Use touchscreen as a virtual trackpad</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1023"/>
<source>Swap left and right mouse buttons</source>
<translation type="unfinished"></translation>
<translation>Utiliser l&apos;écran tactile comme un trackpad virtuel</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1035"/>
<source>Swap left and right mouse buttons</source>
<translation>Permuter les boutons gauche et droit de la souris</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1047"/>
<source>Reverse mouse scrolling direction</source>
<translation type="unfinished"></translation>
<translation>Inverser le sens de défilement de la souris</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1049"/>
<location filename="../gui/SettingsView.qml" line="1061"/>
<source>Gamepad Settings</source>
<translation type="unfinished"></translation>
<translation>Paramètres de la manette</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1059"/>
<location filename="../gui/SettingsView.qml" line="1071"/>
<source>Swap A/B and X/Y gamepad buttons</source>
<translation type="unfinished"></translation>
<translation>Inverser les boutons A/B et X/Y de la manette</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1077"/>
<location filename="../gui/SettingsView.qml" line="1089"/>
<source>This switches gamepads into a Nintendo-style button layout</source>
<translation type="unfinished"></translation>
<translation>Permet d&apos;utiliser les boutons comme sur une manette Nintendo</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1083"/>
<location filename="../gui/SettingsView.qml" line="1095"/>
<source>Force gamepad #1 always connected</source>
<translation type="unfinished"></translation>
<translation>Forcer la manette #1 à être toujours connectée</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1093"/>
<location filename="../gui/SettingsView.qml" line="1105"/>
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
<translation>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</translation>
<translation>Force une seule manette de jeu à toujours rester connectée à l&apos;hôte, même si aucune manette de jeu n&apos;est réellement connectée à ce PC.</translation>
</message>
<message>
<source>This enables mouse control without capturing the client&apos;s mouse cursor. It will not work in most games.</source>
<translation type="vanished">Cela permet de contrôler la souris sans avoir à capturer le curseur du client. Cela ne fonctionne pas dans la plupart des jeux.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="923"/>
<location filename="../gui/SettingsView.qml" line="935"/>
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
<translation>Vous pouvez le basculer pendant la diffusion en utilisant Ctrl+Alt+Shift+M.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="934"/>
<location filename="../gui/SettingsView.qml" line="946"/>
<source>Capture system keyboard shortcuts</source>
<translation type="unfinished"></translation>
<translation>Capturer les raccourcis clavier système</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="942"/>
<location filename="../gui/SettingsView.qml" line="954"/>
<source>This enables the capture of system-wide keyboard shortcuts like Alt+Tab that would normally be handled by the client OS while streaming.</source>
<translation type="unfinished"></translation>
<translation>Cela permet la capture de raccourcis clavier système comme Alt+Tab qui seraient normalement utilisés par le système d’exploitation client.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1101"/>
<location filename="../gui/SettingsView.qml" line="1113"/>
<source>Enable mouse control with gamepads by holding the &apos;Start&apos; button</source>
<translation type="unfinished"></translation>
<translation>Active le contrôle de la souris par la manette en appuyant sur « Start »</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1112"/>
<location filename="../gui/SettingsView.qml" line="1124"/>
<source>Process gamepad input when Moonlight is in the background</source>
<translation type="unfinished"></translation>
<translation>Capturer la manette même lorsque Moonlight est en arrière-plan</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1123"/>
<location filename="../gui/SettingsView.qml" line="1135"/>
<source>Allows Moonlight to capture gamepad inputs even if it&apos;s not the current window in focus</source>
<translation type="unfinished"></translation>
<translation>Permet à Moonlight de capturer la manette même si Moonlight n&apos;est pas au premier plan</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1132"/>
<location filename="../gui/SettingsView.qml" line="1144"/>
<source>Host Settings</source>
<translation>Paramètres de l&apos;hôte</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1172"/>
<location filename="../gui/SettingsView.qml" line="1184"/>
<source>Advanced Settings</source>
<translation>Paramètres avancés</translation>
</message>
@@ -770,17 +770,17 @@
<translation type="vanished">Maximiser la fenêtre Moonlight au démarrage</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="860"/>
<location filename="../gui/SettingsView.qml" line="873"/>
<source>Show connection quality warnings</source>
<translation>Afficher les avertissements sur la qualité de la connexion</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="872"/>
<location filename="../gui/SettingsView.qml" line="885"/>
<source>Discord Rich Presence integration</source>
<translation>Intégration de la présence Discord Rich</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="882"/>
<location filename="../gui/SettingsView.qml" line="895"/>
<source>Updates your Discord status to display the name of the game you&apos;re streaming.</source>
<translation>Met à jour votre statut Discord pour afficher le nom du jeu que vous diffusez en continu.</translation>
</message>
@@ -789,12 +789,12 @@
<translation type="vanished">Forcé la manette de jeu Force #1 à être toujours présente</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1094"/>
<location filename="../gui/SettingsView.qml" line="1106"/>
<source>Only enable this option when streaming a game that doesn&apos;t support gamepads being connected after startup.</source>
<translation>N&apos;activez cette option que lorsque vous diffusez en continu un jeu qui ne prend pas en charge la connexion des manettes de jeu après le démarrage.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="911"/>
<location filename="../gui/SettingsView.qml" line="924"/>
<source>Optimize mouse for remote desktop instead of games</source>
<translation>Optimiser la souris pour le bureau à distance plutôt que pour les jeux</translation>
</message>
@@ -803,7 +803,7 @@
<translation type="vanished">Utiliser l&apos;écran tactile comme trackpad</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1016"/>
<location filename="../gui/SettingsView.qml" line="1028"/>
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
<translation>Lorsqu&apos;on le vérifie, l&apos;écran tactile agit comme un pavé tactile. Lorsqu&apos;il n&apos;est pas coché, l&apos;écran tactile contrôle directement le pointeur de la souris.</translation>
</message>
@@ -824,7 +824,7 @@
<translation type="vanished">Lorsque la case est cochée, permuter les boutons gauche et droit de la souris</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1142"/>
<location filename="../gui/SettingsView.qml" line="1154"/>
<source>Optimize game settings for streaming</source>
<translation>Optimiser les paramètres du jeu pour la diffusion en continu</translation>
</message>
@@ -833,63 +833,63 @@
<translation type="vanished">Lecture audio sur le PC hôte</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1153"/>
<location filename="../gui/SettingsView.qml" line="1165"/>
<source>Quit app on host PC after ending stream</source>
<translation>Quitter l&apos;application sur le PC hôte après avoir terminé le flux</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1163"/>
<location filename="../gui/SettingsView.qml" line="1175"/>
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
<translation>Cela fermera l&apos;application ou le jeu que vous êtes en train de diffuser lorsque vous aurez terminé votre flux. Vous perdrez tout progrès non sauvegardé !</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1182"/>
<location filename="../gui/SettingsView.qml" line="1194"/>
<source>Video decoder</source>
<translation>Décodeur vidéo</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1207"/>
<location filename="../gui/SettingsView.qml" line="1253"/>
<location filename="../gui/SettingsView.qml" line="1219"/>
<location filename="../gui/SettingsView.qml" line="1265"/>
<source>Automatic (Recommended)</source>
<translation>Automatique (recommandé)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1211"/>
<location filename="../gui/SettingsView.qml" line="1223"/>
<source>Force software decoding</source>
<translation>Forcer le décodage des logiciels</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1215"/>
<location filename="../gui/SettingsView.qml" line="1227"/>
<source>Force hardware decoding</source>
<translation>Forcer le décodage du matériel</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1228"/>
<location filename="../gui/SettingsView.qml" line="1240"/>
<source>Video codec</source>
<translation>Codec vidéo</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1257"/>
<location filename="../gui/SettingsView.qml" line="1269"/>
<source>H.264</source>
<translation>H.264</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1261"/>
<location filename="../gui/SettingsView.qml" line="1273"/>
<source>HEVC (H.265)</source>
<translation>HEVC (H.265)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1278"/>
<location filename="../gui/SettingsView.qml" line="1290"/>
<source>Unlock unsupported FPS options</source>
<translation>Débloquer les options non supportées du FPS</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1297"/>
<location filename="../gui/SettingsView.qml" line="1309"/>
<source>Automatically find PCs on the local network (Recommended)</source>
<translation>Trouver automatiquement les PC sur le réseau local (recommandé)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1322"/>
<location filename="../gui/SettingsView.qml" line="1334"/>
<source>Automatically detect blocked connections (Recommended)</source>
<translation>Détecter automatiquement les connexions bloquées (recommandé)</translation>
</message>
@@ -899,7 +899,7 @@
<message>
<location filename="../gui/StreamSegue.qml" line="11"/>
<source>Resuming %1...</source>
<translation type="unfinished"></translation>
<translation>Reprise de %1...</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="12"/>
@@ -910,12 +910,12 @@
<message>
<location filename="../gui/StreamSegue.qml" line="25"/>
<source>Starting %1 failed: Error %2</source>
<translation>Démarrage de %1... echec: erreur %2</translation>
<translation>Le démarrage de %1 a échoué : Erreur %2</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="28"/>
<source>Check your firewall and port forwarding rules for port(s): %1</source>
<translation type="unfinished"></translation>
<translation>Vérifiez vos réglages de port et de pare-feu pour le(s) port(s) suivant(s) : %1</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="74"/>
@@ -925,7 +925,7 @@
<message>
<location filename="../gui/StreamSegue.qml" line="161"/>
<source>Tip:</source>
<translation>Aide:</translation>
<translation>Astuce :</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="161"/>
@@ -935,7 +935,7 @@
<message>
<location filename="../gui/StreamSegue.qml" line="162"/>
<source>Start+Select+L1+R1</source>
<translation>Start+Select+L1+R1</translation>
<translation>Start + Select + L1 + R1</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="162"/>
@@ -1001,12 +1001,12 @@
<message>
<location filename="../gui/main.qml" line="432"/>
<source>This version of Moonlight isn&apos;t optimized for your PC. Please download the &apos;%1&apos; version of Moonlight for the best streaming performance.</source>
<translation type="unfinished"></translation>
<translation>Cette version de Moonlight n&apos;est pas optimisée pour votre PC. Téléchargez la version « %1 » pour de meilleures performances.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="441"/>
<source>Moonlight detected gamepads without a mapping:</source>
<translation>Moonlight a détecté des manettes de jeu san configuration:</translation>
<translation>Moonlight a détecté des manettes sans configuration&#x202f;:</translation>
</message>
<message>
<location filename="../gui/main.qml" line="354"/>
@@ -1035,7 +1035,7 @@
<message>
<location filename="../gui/main.qml" line="451"/>
<source>Are you sure you want to quit?</source>
<translation>Vous êtes sûr de vouloir quitter?</translation>
<translation>Vous êtes sûr de vouloir quitter&#x202f;?</translation>
</message>
<message>
<location filename="../gui/main.qml" line="481"/>
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
+84 -84
View File
@@ -306,107 +306,107 @@
<translation>会话已终止</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="578"/>
<location filename="../streaming/session.cpp" line="581"/>
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
<translation>启用远程桌面鼠标模式可能会导致游戏出现问题。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="583"/>
<location filename="../streaming/session.cpp" line="586"/>
<source>HDR is not supported with software decoding.</source>
<translation>软件解码不支持 HDR。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="587"/>
<location filename="../streaming/session.cpp" line="590"/>
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
<translation>你选择的用于强制软件解码的设置可能会导致流式传输性能不佳。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="592"/>
<location filename="../streaming/session.cpp" line="595"/>
<source>Using unsupported FPS options may cause stuttering or lag.</source>
<translation>使用不受支持的 FPS 选项可能会导致卡顿或延迟。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="595"/>
<location filename="../streaming/session.cpp" line="598"/>
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
<translation>当流式传输的帧率高于显示时,垂直同步将被禁用。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="612"/>
<location filename="../streaming/session.cpp" line="615"/>
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
<translation>根据你的选择使用软件解码,以在没有显卡支持的情况下强制 HEVC。这可能会导致流式传输性能不佳。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="615"/>
<location filename="../streaming/session.cpp" line="618"/>
<source>This PC&apos;s GPU doesn&apos;t support HEVC decoding.</source>
<translation>此计算机的显卡不支持 HEVC 解码。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="622"/>
<location filename="../streaming/session.cpp" line="625"/>
<source>Your host PC GPU doesn&apos;t support HEVC. A GeForce GTX 900-series (Maxwell) or later GPU is required for HEVC streaming.</source>
<translation>目标计算机的显卡不支持 HEVC。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="639"/>
<location filename="../streaming/session.cpp" line="642"/>
<source>%1 doesn&apos;t support HDR10.</source>
<translation>%1 不支持 HDR10。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="643"/>
<location filename="../streaming/session.cpp" line="646"/>
<source>Your host PC GPU doesn&apos;t support HDR streaming. A GeForce GTX 1000-series (Pascal) or later GPU is required for HDR streaming.</source>
<translation>目标计算机的显卡不支持 HDR 流。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="652"/>
<location filename="../streaming/session.cpp" line="655"/>
<source>This PC&apos;s GPU doesn&apos;t support HEVC Main10 decoding for HDR streaming.</source>
<translation>此计算机的显卡不支持 HEVC Main10 解码 HDR 流。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="665"/>
<location filename="../streaming/session.cpp" line="668"/>
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
<translation>4K 流式传输需要 GeForce Experience 3.0 或更高版本。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="680"/>
<location filename="../streaming/session.cpp" line="683"/>
<source>Your selected surround sound setting is not supported by the current audio device.</source>
<translation>当前音频设备不支持你选择的环绕声设置。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="687"/>
<location filename="../streaming/session.cpp" line="690"/>
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
<translation>无法打开音频设备。音频在此会话期间将不可用。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="692"/>
<location filename="../streaming/session.cpp" line="695"/>
<source>An attached gamepad has no mapping and won&apos;t be usable. Visit the Moonlight help to resolve this.</source>
<translation>附加的手柄没有映射,因此无法使用。请访问 Moonlight 帮助解决此问题。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="700"/>
<location filename="../streaming/session.cpp" line="703"/>
<source>Your host PC&apos;s GPU doesn&apos;t support streaming video resolutions over 4K.</source>
<translation>目标计算机的显卡不支持 4K 以上的流式传输视频分辨率。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="704"/>
<location filename="../streaming/session.cpp" line="707"/>
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
<translation>只有 HEVC 编解码器才支持 4K 以上的视频分辨率。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="718"/>
<location filename="../streaming/session.cpp" line="721"/>
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC&apos;s GPU.</source>
<translation>由于此计算机的显卡上缺少硬件解码支持,无法满足强制硬件解码的选择。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="721"/>
<location filename="../streaming/session.cpp" line="724"/>
<source>Your codec selection and force hardware decoding setting are not compatible. This PC&apos;s GPU lacks support for decoding your chosen codec.</source>
<translation>你选择的编解码器和强制硬件解码设置不兼容。此计算机的显卡不支持解码你选择的编解码器。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="1022"/>
<location filename="../streaming/session.cpp" line="1025"/>
<source>GeForce Experience returned error: %1</source>
<translation>GeForce Experience 返回错误: %1</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="1445"/>
<location filename="../streaming/session.cpp" line="1503"/>
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
<translation>无法初始化视频解码器。请检查你的流式传输设置,然后重试。</translation>
</message>
@@ -436,22 +436,22 @@
<message>
<location filename="../gui/SettingsView.qml" line="209"/>
<source>720p</source>
<translation></translation>
<translation>720p</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="215"/>
<source>1080p</source>
<translation></translation>
<translation>1080p</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="221"/>
<source>1440p</source>
<translation></translation>
<translation>1440p</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="227"/>
<source>4K</source>
<translation></translation>
<translation>4K</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="331"/>
@@ -474,7 +474,7 @@
<location filename="../gui/SettingsView.qml" line="427"/>
<location filename="../gui/SettingsView.qml" line="430"/>
<source>%1 FPS</source>
<translation></translation>
<translation>%1 FPS</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="412"/>
@@ -512,7 +512,7 @@
</message>
<message>
<location filename="../gui/SettingsView.qml" line="573"/>
<location filename="../gui/SettingsView.qml" line="847"/>
<location filename="../gui/SettingsView.qml" line="860"/>
<source>Fullscreen</source>
<translation>全屏</translation>
</message>
@@ -523,7 +523,7 @@
</message>
<message>
<location filename="../gui/SettingsView.qml" line="581"/>
<location filename="../gui/SettingsView.qml" line="839"/>
<location filename="../gui/SettingsView.qml" line="852"/>
<source>Windowed</source>
<translation>窗口化</translation>
</message>
@@ -605,77 +605,77 @@
<message>
<location filename="../gui/SettingsView.qml" line="739"/>
<source>Language</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="765"/>
<source>Automatic</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="792"/>
<location filename="../gui/SettingsView.qml" line="805"/>
<source>You must restart Moonlight for this change to take effect</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="806"/>
<location filename="../gui/SettingsView.qml" line="819"/>
<source>GUI display mode</source>
<translation>窗口显示模式</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="843"/>
<location filename="../gui/SettingsView.qml" line="856"/>
<source>Maximized</source>
<translation>最大化</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="860"/>
<location filename="../gui/SettingsView.qml" line="873"/>
<source>Show connection quality warnings</source>
<translation>显示连接质量警告</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="872"/>
<location filename="../gui/SettingsView.qml" line="885"/>
<source>Discord Rich Presence integration</source>
<translation>Discord Rich Presence 集成</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="882"/>
<location filename="../gui/SettingsView.qml" line="895"/>
<source>Updates your Discord status to display the name of the game you&apos;re streaming.</source>
<translation>更新你的 Discord 状态,以显示正在运行的游戏名称。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="900"/>
<location filename="../gui/SettingsView.qml" line="913"/>
<source>Input Settings</source>
<translation>输入设置</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="911"/>
<location filename="../gui/SettingsView.qml" line="924"/>
<source>Optimize mouse for remote desktop instead of games</source>
<translation>为远程桌面而不是游戏优化鼠标</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="922"/>
<location filename="../gui/SettingsView.qml" line="934"/>
<source>This enables seamless mouse control without capturing the client&apos;s mouse cursor. It is ideal for remote desktop usage but will not work in most games.</source>
<translation>这可以实现无缝鼠标控制,而无需捕获客户端的鼠标光标。这是理想的远程桌面使用方案,但不会在大多数游戏中工作。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="923"/>
<location filename="../gui/SettingsView.qml" line="935"/>
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
<translation>你可以使用 Ctrl+Alt+Shift+M 切换鼠标控制模式。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="924"/>
<location filename="../gui/SettingsView.qml" line="936"/>
<source>NOTE: Due to a bug in GeForce Experience, this option may not work properly if your host PC has multiple monitors.</source>
<translation>注意:由于 GeForce Experience 的 Bug,如果你的目标计算机有多个显示器,则此选项可能无法正常工作。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="934"/>
<location filename="../gui/SettingsView.qml" line="946"/>
<source>Capture system keyboard shortcuts</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="942"/>
<location filename="../gui/SettingsView.qml" line="954"/>
<source>This enables the capture of system-wide keyboard shortcuts like Alt+Tab that would normally be handled by the client OS while streaming.</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<source>Capture system keyboard shortcuts while streaming in fullscreen</source>
@@ -686,158 +686,158 @@
<translation type="vanished">这允许捕获系统范围内的键盘快捷键(如Alt+Tab),这些快捷键通常在全屏流式传输时由客户端操作系统处理。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="943"/>
<location filename="../gui/SettingsView.qml" line="955"/>
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
<translation>注意:Windows 上的某些键盘快捷键(如 Ctrl+Alt+Del)不能被任何应用程序截获,包括 Moonlight。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="972"/>
<location filename="../gui/SettingsView.qml" line="984"/>
<source>in fullscreen</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="976"/>
<location filename="../gui/SettingsView.qml" line="988"/>
<source>always</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1006"/>
<location filename="../gui/SettingsView.qml" line="1018"/>
<source>Use touchscreen as a virtual trackpad</source>
<translation>将触摸屏用作虚拟触控板</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1016"/>
<location filename="../gui/SettingsView.qml" line="1028"/>
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
<translation>选中时,触摸屏就像一个触控板。取消选中时,触摸屏将直接控制鼠标指针。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1023"/>
<location filename="../gui/SettingsView.qml" line="1035"/>
<source>Swap left and right mouse buttons</source>
<translation>交换鼠标左键和右键</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1035"/>
<location filename="../gui/SettingsView.qml" line="1047"/>
<source>Reverse mouse scrolling direction</source>
<translation>反转鼠标滚动方向</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1049"/>
<location filename="../gui/SettingsView.qml" line="1061"/>
<source>Gamepad Settings</source>
<translation>手柄设置</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1059"/>
<location filename="../gui/SettingsView.qml" line="1071"/>
<source>Swap A/B and X/Y gamepad buttons</source>
<translation>交换手柄的 A/B 和 X/Y 按钮</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1077"/>
<location filename="../gui/SettingsView.qml" line="1089"/>
<source>This switches gamepads into a Nintendo-style button layout</source>
<translation>这会将手柄切换为任天堂风格的按钮布局</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1083"/>
<location filename="../gui/SettingsView.qml" line="1095"/>
<source>Force gamepad #1 always connected</source>
<translation>强制手柄 #1 始终连接</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1093"/>
<location filename="../gui/SettingsView.qml" line="1105"/>
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
<translation>强制单个手柄始终与目标计算机保持连接,即使没有任何手柄实际连接到此计算机。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1094"/>
<location filename="../gui/SettingsView.qml" line="1106"/>
<source>Only enable this option when streaming a game that doesn&apos;t support gamepads being connected after startup.</source>
<translation>仅在游戏启动后不支持手柄连接时才启用此选项。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1101"/>
<location filename="../gui/SettingsView.qml" line="1113"/>
<source>Enable mouse control with gamepads by holding the &apos;Start&apos; button</source>
<translation>按住手柄的“Start”按钮启用鼠标控制</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1112"/>
<location filename="../gui/SettingsView.qml" line="1124"/>
<source>Process gamepad input when Moonlight is in the background</source>
<translation>当 Moonlight 在后台时处理手柄输入</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1123"/>
<location filename="../gui/SettingsView.qml" line="1135"/>
<source>Allows Moonlight to capture gamepad inputs even if it&apos;s not the current window in focus</source>
<translation>即使不是焦点窗口,也允许 Moonlight 捕获手柄的输入</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1132"/>
<location filename="../gui/SettingsView.qml" line="1144"/>
<source>Host Settings</source>
<translation>目标计算机设置</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1142"/>
<location filename="../gui/SettingsView.qml" line="1154"/>
<source>Optimize game settings for streaming</source>
<translation>优化游戏设置以进行流式传输</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1153"/>
<location filename="../gui/SettingsView.qml" line="1165"/>
<source>Quit app on host PC after ending stream</source>
<translation>流式传输结束后退出目标计算机上的应用程序</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1163"/>
<location filename="../gui/SettingsView.qml" line="1175"/>
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
<translation>当你结束流式传输时,这将关闭正在运行的应用程序或游戏。这会导致你失去所有未保存的游戏进度!</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1172"/>
<location filename="../gui/SettingsView.qml" line="1184"/>
<source>Advanced Settings</source>
<translation>高级设置</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1182"/>
<location filename="../gui/SettingsView.qml" line="1194"/>
<source>Video decoder</source>
<translation>视频解码器</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1207"/>
<location filename="../gui/SettingsView.qml" line="1253"/>
<location filename="../gui/SettingsView.qml" line="1219"/>
<location filename="../gui/SettingsView.qml" line="1265"/>
<source>Automatic (Recommended)</source>
<translation>自动 (推荐)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1211"/>
<location filename="../gui/SettingsView.qml" line="1223"/>
<source>Force software decoding</source>
<translation>强制软件解码</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1215"/>
<location filename="../gui/SettingsView.qml" line="1227"/>
<source>Force hardware decoding</source>
<translation>强制硬件解码</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1228"/>
<location filename="../gui/SettingsView.qml" line="1240"/>
<source>Video codec</source>
<translation>视频编解码器</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1257"/>
<location filename="../gui/SettingsView.qml" line="1269"/>
<source>H.264</source>
<translation></translation>
<translation>H.264</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1261"/>
<location filename="../gui/SettingsView.qml" line="1273"/>
<source>HEVC (H.265)</source>
<translation></translation>
<translation>HEVC (H.265)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1278"/>
<location filename="../gui/SettingsView.qml" line="1290"/>
<source>Unlock unsupported FPS options</source>
<translation>解锁不受支持的 FPS 选项</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1297"/>
<location filename="../gui/SettingsView.qml" line="1309"/>
<source>Automatically find PCs on the local network (Recommended)</source>
<translation>自动在本地网络上查找计算机 (推荐)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1322"/>
<location filename="../gui/SettingsView.qml" line="1334"/>
<source>Automatically detect blocked connections (Recommended)</source>
<translation>自动检测被阻止的连接 (推荐)</translation>
</message>
@@ -883,12 +883,12 @@
<message>
<location filename="../gui/StreamSegue.qml" line="162"/>
<source>Start+Select+L1+R1</source>
<translation></translation>
<translation>Start+Select+L1+R1</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="162"/>
<source>Ctrl+Alt+Shift+Q</source>
<translation></translation>
<translation>Ctrl+Alt+Shift+Q</translation>
</message>
</context>
<context>
+10 -2
View File
@@ -23,12 +23,20 @@
<file>languages/qml_fr.qm</file>
<file>languages/qml_zh_cn.ts</file>
<file>languages/qml_zh_cn.qm</file>
<file>languages/qml_nb_NO.ts</file>
<file>languages/qml_nb_NO.qm</file>
<file>languages/qml_ru.ts</file>
<file>languages/qml_ru.qm</file>
<file>languages/qml_es.ts</file>
<file>languages/qml_es.qm</file>
</qresource>
<qresource prefix="/data">
<file alias="gamecontrollerdb.txt">SDL_GameControllerDB/gamecontrollerdb.txt</file>
<file alias="ModeSeven.ttf">ModeSeven.ttf</file>
<file alias="egl.frag">shaders/egl.frag</file>
<file alias="egl.vert">shaders/egl.vert</file>
<file alias="egl_nv12.frag">shaders/egl_nv12.frag</file>
<file alias="egl_nv12.vert">shaders/egl_nv12.vert</file>
<file alias="egl_opaque.frag">shaders/egl_opaque.frag</file>
<file alias="egl_opaque.vert">shaders/egl_opaque.vert</file>
<file alias="egl_overlay.frag">shaders/egl_overlay.frag</file>
<file alias="egl_overlay.vert">shaders/egl_overlay.vert</file>
</qresource>
+6
View File
@@ -189,6 +189,12 @@ QString StreamingPreferences::getSuffixFromLanguage(StreamingPreferences::Langua
return "fr";
case LANG_ZH_CN:
return "zh_cn";
case LANG_NB_NO:
return "nb_NO";
case LANG_RU:
return "ru";
case LANG_ES:
return "es";
case LANG_AUTO:
default:
return QLocale::system().name();
+4 -1
View File
@@ -69,7 +69,10 @@ public:
LANG_EN,
LANG_FR,
LANG_ZH_CN,
LANG_DE
LANG_DE,
LANG_NB_NO,
LANG_RU,
LANG_ES
};
Q_ENUM(Language);
+12
View File
@@ -0,0 +1,12 @@
#version 300 es
#extension GL_OES_EGL_image_external : require
precision mediump float;
out vec4 FragColor;
in vec2 vTextCoord;
uniform samplerExternalOES uTexture;
void main() {
FragColor = texture2D(uTexture, vTextCoord);
}
+10
View File
@@ -0,0 +1,10 @@
#version 300 es
layout (location = 0) in vec2 aPosition; // 2D: X,Y
layout (location = 1) in vec2 aTexCoord;
out vec2 vTextCoord;
void main() {
vTextCoord = aTexCoord;
gl_Position = vec4(aPosition, 0, 1);
}
+133 -52
View File
@@ -26,6 +26,7 @@ DrmRenderer::DrmRenderer()
m_CurrentFbId(0)
{
#ifdef HAVE_EGL
m_EGLExtDmaBuf = false;
m_eglCreateImage = nullptr;
m_eglCreateImageKHR = nullptr;
m_eglDestroyImage = nullptr;
@@ -297,6 +298,8 @@ void DrmRenderer::renderFrame(AVFrame* frame)
uint32_t handles[4] = {};
uint32_t pitches[4] = {};
uint32_t offsets[4] = {};
uint64_t modifiers[4] = {};
uint32_t flags = 0;
SDL_Rect src, dst;
@@ -318,12 +321,18 @@ void DrmRenderer::renderFrame(AVFrame* frame)
return;
}
// Pass along the modifiers to DRM if there are some in the descriptor
if (drmFrame->objects[0].format_modifier != DRM_FORMAT_MOD_INVALID) {
flags |= DRM_MODE_FB_MODIFIERS;
}
SDL_assert(drmFrame->nb_layers == 1);
SDL_assert(drmFrame->layers[0].nb_planes == 2);
for (int i = 0; i < drmFrame->layers[0].nb_planes; i++) {
handles[i] = primeHandle;
pitches[i] = drmFrame->layers[0].planes[i].pitch;
offsets[i] = drmFrame->layers[0].planes[i].offset;
modifiers[i] = drmFrame->objects[0].format_modifier;
}
// Remember the last FB object we created so we can free it
@@ -331,12 +340,15 @@ void DrmRenderer::renderFrame(AVFrame* frame)
uint32_t lastFbId = m_CurrentFbId;
// Create a frame buffer object from the PRIME buffer
err = drmModeAddFB2(m_DrmFd, frame->width, frame->height,
drmFrame->layers[0].format,
handles, pitches, offsets, &m_CurrentFbId, 0);
// NB: It is an error to pass modifiers without DRM_MODE_FB_MODIFIERS set.
err = drmModeAddFB2WithModifiers(m_DrmFd, frame->width, frame->height,
drmFrame->layers[0].format,
handles, pitches, offsets,
(flags & DRM_MODE_FB_MODIFIERS) ? modifiers : NULL,
&m_CurrentFbId, flags);
if (err < 0) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"drmModeAddFB2() failed: %d",
"drmModeAddFB2WithModifiers() failed: %d",
errno);
m_CurrentFbId = lastFbId;
return;
@@ -387,7 +399,8 @@ bool DrmRenderer::canExportEGL() {
}
AVPixelFormat DrmRenderer::getEGLImagePixelFormat() {
return AV_PIX_FMT_NV12;
// This tells EGLRenderer to treat the EGLImage as a single opaque texture
return AV_PIX_FMT_DRM_PRIME;
}
bool DrmRenderer::initializeEGL(EGLDisplay,
@@ -398,6 +411,8 @@ bool DrmRenderer::initializeEGL(EGLDisplay,
return false;
}
m_EGLExtDmaBuf = ext.isSupported("EGL_EXT_image_dma_buf_import_modifiers");
// NB: eglCreateImage() and eglCreateImageKHR() have slightly different definitions
m_eglCreateImage = (typeof(m_eglCreateImage))eglGetProcAddress("eglCreateImage");
m_eglCreateImageKHR = (typeof(m_eglCreateImageKHR))eglGetProcAddress("eglCreateImageKHR");
@@ -416,61 +431,125 @@ bool DrmRenderer::initializeEGL(EGLDisplay,
ssize_t DrmRenderer::exportEGLImages(AVFrame *frame, EGLDisplay dpy,
EGLImage images[EGL_MAX_PLANES]) {
ssize_t count = 0;
AVDRMFrameDescriptor* drmFrame = (AVDRMFrameDescriptor*)frame->data[0];
memset(images, 0, sizeof(EGLImage) * EGL_MAX_PLANES);
SDL_assert(drmFrame->nb_objects == 1);
SDL_assert(drmFrame->nb_layers == 1);
SDL_assert(drmFrame->layers[0].nb_planes == 2);
// Max 30 attributes (1 key + 1 value for each)
const int MAX_ATTRIB_COUNT = 30 * 2;
EGLAttrib attribs[MAX_ATTRIB_COUNT] = {
EGL_LINUX_DRM_FOURCC_EXT, (EGLAttrib)drmFrame->layers[0].format,
EGL_WIDTH, frame->width,
EGL_HEIGHT, frame->height,
};
int attribIndex = 6;
for (int i = 0; i < drmFrame->layers[0].nb_planes; ++i) {
const auto &plane = drmFrame->layers[0].planes[i];
const auto &object = drmFrame->objects[plane.object_index];
const int EGL_ATTRIB_COUNT = 13;
EGLAttrib attribs[EGL_ATTRIB_COUNT] = {
EGL_LINUX_DRM_FOURCC_EXT, i == 0 ? DRM_FORMAT_R8 : DRM_FORMAT_GR88,
EGL_WIDTH, i == 0 ? frame->width : frame->width / 2,
EGL_HEIGHT, i == 0 ? frame->height : frame->height / 2,
EGL_DMA_BUF_PLANE0_FD_EXT, object.fd,
EGL_DMA_BUF_PLANE0_OFFSET_EXT, plane.offset,
EGL_DMA_BUF_PLANE0_PITCH_EXT, plane.pitch,
EGL_NONE
};
if (m_eglCreateImage) {
images[i] = m_eglCreateImage(dpy, EGL_NO_CONTEXT,
EGL_LINUX_DMA_BUF_EXT,
nullptr, attribs);
if (!images[i]) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"eglCreateImage() Failed: %d", eglGetError());
goto fail;
switch (i) {
case 0:
attribs[attribIndex++] = EGL_DMA_BUF_PLANE0_FD_EXT;
attribs[attribIndex++] = object.fd;
attribs[attribIndex++] = EGL_DMA_BUF_PLANE0_OFFSET_EXT;
attribs[attribIndex++] = plane.offset;
attribs[attribIndex++] = EGL_DMA_BUF_PLANE0_PITCH_EXT;
attribs[attribIndex++] = plane.pitch;
if (m_EGLExtDmaBuf && object.format_modifier != DRM_FORMAT_MOD_INVALID) {
attribs[attribIndex++] = EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT;
attribs[attribIndex++] = (EGLint)(object.format_modifier & 0xFFFFFFFF);
attribs[attribIndex++] = EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT;
attribs[attribIndex++] = (EGLint)(object.format_modifier >> 32);
}
break;
case 1:
attribs[attribIndex++] = EGL_DMA_BUF_PLANE1_FD_EXT;
attribs[attribIndex++] = object.fd;
attribs[attribIndex++] = EGL_DMA_BUF_PLANE1_OFFSET_EXT;
attribs[attribIndex++] = plane.offset;
attribs[attribIndex++] = EGL_DMA_BUF_PLANE1_PITCH_EXT;
attribs[attribIndex++] = plane.pitch;
if (m_EGLExtDmaBuf && object.format_modifier != DRM_FORMAT_MOD_INVALID) {
attribs[attribIndex++] = EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT;
attribs[attribIndex++] = (EGLint)(object.format_modifier & 0xFFFFFFFF);
attribs[attribIndex++] = EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT;
attribs[attribIndex++] = (EGLint)(object.format_modifier >> 32);
}
break;
case 2:
attribs[attribIndex++] = EGL_DMA_BUF_PLANE2_FD_EXT;
attribs[attribIndex++] = object.fd;
attribs[attribIndex++] = EGL_DMA_BUF_PLANE2_OFFSET_EXT;
attribs[attribIndex++] = plane.offset;
attribs[attribIndex++] = EGL_DMA_BUF_PLANE2_PITCH_EXT;
attribs[attribIndex++] = plane.pitch;
if (m_EGLExtDmaBuf && object.format_modifier != DRM_FORMAT_MOD_INVALID) {
attribs[attribIndex++] = EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT;
attribs[attribIndex++] = (EGLint)(object.format_modifier & 0xFFFFFFFF);
attribs[attribIndex++] = EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT;
attribs[attribIndex++] = (EGLint)(object.format_modifier >> 32);
}
break;
case 3:
attribs[attribIndex++] = EGL_DMA_BUF_PLANE3_FD_EXT;
attribs[attribIndex++] = object.fd;
attribs[attribIndex++] = EGL_DMA_BUF_PLANE3_OFFSET_EXT;
attribs[attribIndex++] = plane.offset;
attribs[attribIndex++] = EGL_DMA_BUF_PLANE3_PITCH_EXT;
attribs[attribIndex++] = plane.pitch;
if (m_EGLExtDmaBuf && object.format_modifier != DRM_FORMAT_MOD_INVALID) {
attribs[attribIndex++] = EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT;
attribs[attribIndex++] = (EGLint)(object.format_modifier & 0xFFFFFFFF);
attribs[attribIndex++] = EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT;
attribs[attribIndex++] = (EGLint)(object.format_modifier >> 32);
}
break;
default:
Q_UNREACHABLE();
}
else {
// Cast the EGLAttrib array elements to EGLint for the KHR extension
EGLint intAttribs[EGL_ATTRIB_COUNT];
for (int i = 0; i < EGL_ATTRIB_COUNT; i++) {
intAttribs[i] = (EGLint)attribs[i];
}
images[i] = m_eglCreateImageKHR(dpy, EGL_NO_CONTEXT,
EGL_LINUX_DMA_BUF_EXT,
nullptr, intAttribs);
if (!images[i]) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"eglCreateImageKHR() Failed: %d", eglGetError());
goto fail;
}
}
++count;
}
return count;
// Terminate the attribute list
attribs[attribIndex++] = EGL_NONE;
SDL_assert(attribIndex <= MAX_ATTRIB_COUNT);
// Our EGLImages are non-planar, so we only populate the first entry
if (m_eglCreateImage) {
images[0] = m_eglCreateImage(dpy, EGL_NO_CONTEXT,
EGL_LINUX_DMA_BUF_EXT,
nullptr, attribs);
if (!images[0]) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"eglCreateImage() Failed: %d", eglGetError());
goto fail;
}
}
else {
// Cast the EGLAttrib array elements to EGLint for the KHR extension
EGLint intAttribs[MAX_ATTRIB_COUNT];
for (int i = 0; i < MAX_ATTRIB_COUNT; i++) {
intAttribs[i] = (EGLint)attribs[i];
}
images[0] = m_eglCreateImageKHR(dpy, EGL_NO_CONTEXT,
EGL_LINUX_DMA_BUF_EXT,
nullptr, intAttribs);
if (!images[0]) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"eglCreateImageKHR() Failed: %d", eglGetError());
goto fail;
}
}
return 1;
fail:
freeEGLImages(dpy, images);
@@ -478,14 +557,16 @@ fail:
}
void DrmRenderer::freeEGLImages(EGLDisplay dpy, EGLImage images[EGL_MAX_PLANES]) {
for (size_t i = 0; i < EGL_MAX_PLANES; ++i) {
if (m_eglDestroyImage) {
m_eglDestroyImage(dpy, images[i]);
}
else {
m_eglDestroyImageKHR(dpy, images[i]);
}
if (m_eglDestroyImage) {
m_eglDestroyImage(dpy, images[0]);
}
else {
m_eglDestroyImageKHR(dpy, images[0]);
}
// Our EGLImages are non-planar
SDL_assert(images[1] == 0);
SDL_assert(images[2] == 0);
}
#endif
@@ -35,6 +35,7 @@ private:
SDL_Rect m_OutputRect;
#ifdef HAVE_EGL
bool m_EGLExtDmaBuf;
PFNEGLCREATEIMAGEPROC m_eglCreateImage;
PFNEGLDESTROYIMAGEPROC m_eglDestroyImage;
PFNEGLCREATEIMAGEKHRPROC m_eglCreateImageKHR;
+53 -14
View File
@@ -250,7 +250,7 @@ void EGLRenderer::renderOverlay(Overlay::OverlayType type)
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_OverlayTextures[type]);
glUniform1i(m_OverlayShaderProgramParams[PARAM_TEXTURE], 0);
glUniform1i(m_OverlayShaderProgramParams[OVERLAY_PARAM_TEXTURE], 0);
glDrawArrays(GL_TRIANGLES, 0, 6);
}
@@ -373,24 +373,39 @@ bool EGLRenderer::compileShaders() {
SDL_assert(m_EGLImagePixelFormat != AV_PIX_FMT_NONE);
// XXX: TODO: other formats
SDL_assert(m_EGLImagePixelFormat == AV_PIX_FMT_NV12);
if (m_EGLImagePixelFormat == AV_PIX_FMT_NV12) {
m_ShaderProgram = compileShader("egl_nv12.vert", "egl_nv12.frag");
if (!m_ShaderProgram) {
return false;
}
m_ShaderProgram = compileShader("egl.vert", "egl.frag");
if (!m_ShaderProgram) {
m_ShaderProgramParams[NV12_PARAM_YUVMAT] = glGetUniformLocation(m_ShaderProgram, "yuvmat");
m_ShaderProgramParams[NV12_PARAM_OFFSET] = glGetUniformLocation(m_ShaderProgram, "offset");
m_ShaderProgramParams[NV12_PARAM_PLANE1] = glGetUniformLocation(m_ShaderProgram, "plane1");
m_ShaderProgramParams[NV12_PARAM_PLANE2] = glGetUniformLocation(m_ShaderProgram, "plane2");
}
else if (m_EGLImagePixelFormat == AV_PIX_FMT_DRM_PRIME) {
m_ShaderProgram = compileShader("egl_opaque.vert", "egl_opaque.frag");
if (!m_ShaderProgram) {
return false;
}
m_ShaderProgramParams[OPAQUE_PARAM_TEXTURE] = glGetUniformLocation(m_ShaderProgram, "uTexture");
}
else {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"Unsupported EGL pixel format: %d",
m_EGLImagePixelFormat);
SDL_assert(false);
return false;
}
m_ShaderProgramParams[PARAM_YUVMAT] = glGetUniformLocation(m_ShaderProgram, "yuvmat");
m_ShaderProgramParams[PARAM_OFFSET] = glGetUniformLocation(m_ShaderProgram, "offset");
m_ShaderProgramParams[PARAM_PLANE1] = glGetUniformLocation(m_ShaderProgram, "plane1");
m_ShaderProgramParams[PARAM_PLANE2] = glGetUniformLocation(m_ShaderProgram, "plane2");
m_OverlayShaderProgram = compileShader("egl_overlay.vert", "egl_overlay.frag");
if (!m_OverlayShaderProgram) {
return false;
}
m_OverlayShaderProgramParams[PARAM_TEXTURE] = glGetUniformLocation(m_OverlayShaderProgram, "uTexture");
m_OverlayShaderProgramParams[OVERLAY_PARAM_TEXTURE] = glGetUniformLocation(m_OverlayShaderProgram, "uTexture");
return true;
}
@@ -778,10 +793,16 @@ void EGLRenderer::renderFrame(AVFrame* frame)
glUseProgram(m_ShaderProgram);
m_glBindVertexArrayOES(m_VAO);
glUniformMatrix3fv(m_ShaderProgramParams[PARAM_YUVMAT], 1, GL_FALSE, getColorMatrix());
glUniform3fv(m_ShaderProgramParams[PARAM_OFFSET], 1, getColorOffsets());
glUniform1i(m_ShaderProgramParams[PARAM_PLANE1], 0);
glUniform1i(m_ShaderProgramParams[PARAM_PLANE2], 1);
// Bind parameters for the shaders
if (m_EGLImagePixelFormat == AV_PIX_FMT_NV12) {
glUniformMatrix3fv(m_ShaderProgramParams[NV12_PARAM_YUVMAT], 1, GL_FALSE, getColorMatrix());
glUniform3fv(m_ShaderProgramParams[NV12_PARAM_OFFSET], 1, getColorOffsets());
glUniform1i(m_ShaderProgramParams[NV12_PARAM_PLANE1], 0);
glUniform1i(m_ShaderProgramParams[NV12_PARAM_PLANE2], 1);
}
else if (m_EGLImagePixelFormat == AV_PIX_FMT_DRM_PRIME) {
glUniform1i(m_ShaderProgramParams[OPAQUE_PARAM_TEXTURE], 0);
}
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
@@ -815,3 +836,21 @@ void EGLRenderer::renderFrame(AVFrame* frame)
av_frame_unref(m_LastFrame);
av_frame_move_ref(m_LastFrame, frame);
}
bool EGLRenderer::testRenderFrame(AVFrame* frame)
{
EGLImage imgs[EGL_MAX_PLANES];
// Make sure we can get working EGLImages from the backend renderer.
// Some devices (Raspberry Pi) will happily decode into DRM formats that
// its own GL implementation won't accept in eglCreateImage().
ssize_t plane_count = m_Backend->exportEGLImages(frame, m_EGLDisplay, imgs);
if (plane_count <= 0) {
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
"Backend failed to export EGL image for test frame");
return false;
}
m_Backend->freeEGLImages(m_EGLDisplay, imgs);
return true;
}
@@ -12,6 +12,7 @@ public:
virtual bool initialize(PDECODER_PARAMETERS params) override;
virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary** options) override;
virtual void renderFrame(AVFrame* frame) override;
virtual bool testRenderFrame(AVFrame* frame) override;
virtual void notifyOverlayUpdated(Overlay::OverlayType) override;
virtual bool isPixelFormatSupported(int videoFormat, enum AVPixelFormat pixelFormat) override;
virtual AVPixelFormat getPreferredPixelFormat(int videoFormat) override;
@@ -51,13 +52,14 @@ private:
PFNGLBINDVERTEXARRAYOESPROC m_glBindVertexArrayOES;
PFNGLDELETEVERTEXARRAYSOESPROC m_glDeleteVertexArraysOES;
#define PARAM_YUVMAT 0
#define PARAM_OFFSET 1
#define PARAM_PLANE1 2
#define PARAM_PLANE2 3
#define NV12_PARAM_YUVMAT 0
#define NV12_PARAM_OFFSET 1
#define NV12_PARAM_PLANE1 2
#define NV12_PARAM_PLANE2 3
#define OPAQUE_PARAM_TEXTURE 0
int m_ShaderProgramParams[4];
#define PARAM_TEXTURE 0
#define OVERLAY_PARAM_TEXTURE 0
int m_OverlayShaderProgramParams[1];
int m_OldContextProfileMask;
@@ -42,11 +42,26 @@ typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLenum platf
#define EGL_DMA_BUF_PLANE0_FD_EXT 0x3272
#define EGL_DMA_BUF_PLANE0_OFFSET_EXT 0x3273
#define EGL_DMA_BUF_PLANE0_PITCH_EXT 0x3274
#define EGL_DMA_BUF_PLANE1_FD_EXT 0x3275
#define EGL_DMA_BUF_PLANE1_OFFSET_EXT 0x3276
#define EGL_DMA_BUF_PLANE1_PITCH_EXT 0x3277
#define EGL_DMA_BUF_PLANE2_FD_EXT 0x3278
#define EGL_DMA_BUF_PLANE2_OFFSET_EXT 0x3279
#define EGL_DMA_BUF_PLANE2_PITCH_EXT 0x327A
#endif
#ifndef EGL_EXT_image_dma_buf_import_modifiers
#define EGL_DMA_BUF_PLANE3_FD_EXT 0x3440
#define EGL_DMA_BUF_PLANE3_OFFSET_EXT 0x3441
#define EGL_DMA_BUF_PLANE3_PITCH_EXT 0x3442
#define EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT 0x3443
#define EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT 0x3444
#define EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT 0x3445
#define EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT 0x3446
#define EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT 0x3447
#define EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT 0x3448
#define EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT 0x3449
#define EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT 0x344A
#endif
#define EGL_MAX_PLANES 4
@@ -71,6 +86,13 @@ public:
virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary** options) = 0;
virtual void renderFrame(AVFrame* frame) = 0;
virtual bool testRenderFrame(AVFrame*) {
// If the renderer doesn't provide an explicit test routine,
// we will always assume that any returned AVFrame can be
// rendered successfully.
return true;
}
virtual bool needsTestFrame() {
// No test frame required by default
return false;
@@ -351,3 +351,36 @@ Exit:
av_frame_free(&swFrame);
}
}
bool SdlRenderer::testRenderFrame(AVFrame* frame)
{
// If we are acting as the frontend for a hardware
// accelerated decoder, we'll need to read the frame
// back to render it. Test that this can be done
// for the given frame successfully.
if (frame->hw_frames_ctx != nullptr) {
auto hwFrameCtx = (AVHWFramesContext*)frame->hw_frames_ctx->data;
AVFrame* swFrame = av_frame_alloc();
if (swFrame == nullptr) {
return false;
}
swFrame->width = frame->width;
swFrame->height = frame->height;
swFrame->format = hwFrameCtx->sw_format;
int err = av_hwframe_transfer_data(swFrame, frame, 0);
av_frame_free(&swFrame);
if (err != 0) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"av_hwframe_transfer_data() failed: %d",
err);
return false;
}
}
return true;
}
@@ -11,6 +11,7 @@ public:
virtual void renderFrame(AVFrame* frame) override;
virtual bool isRenderThreadSupported() override;
virtual bool isPixelFormatSupported(int videoFormat, enum AVPixelFormat pixelFormat) override;
virtual bool testRenderFrame(AVFrame* frame) override;
private:
void renderOverlay(Overlay::OverlayType type);
+53 -34
View File
@@ -193,17 +193,22 @@ void FFmpegVideoDecoder::reset()
}
}
bool FFmpegVideoDecoder::createFrontendRenderer(PDECODER_PARAMETERS params)
bool FFmpegVideoDecoder::createFrontendRenderer(PDECODER_PARAMETERS params, bool eglOnly)
{
if (eglOnly) {
#ifdef HAVE_EGL
if (m_BackendRenderer->canExportEGL()) {
m_FrontendRenderer = new EGLRenderer(m_BackendRenderer);
if (m_FrontendRenderer->initialize(params)) {
return true;
if (m_BackendRenderer->canExportEGL()) {
m_FrontendRenderer = new EGLRenderer(m_BackendRenderer);
if (m_FrontendRenderer->initialize(params)) {
return true;
}
delete m_FrontendRenderer;
m_FrontendRenderer = nullptr;
}
delete m_FrontendRenderer;
}
#endif
// If we made it here, we failed to create the EGLRenderer
return false;
}
if (m_BackendRenderer->isDirectRenderingSupported()) {
// The backend renderer can render to the display
@@ -221,13 +226,13 @@ bool FFmpegVideoDecoder::createFrontendRenderer(PDECODER_PARAMETERS params)
return true;
}
bool FFmpegVideoDecoder::completeInitialization(AVCodec* decoder, PDECODER_PARAMETERS params, bool testFrame)
bool FFmpegVideoDecoder::completeInitialization(AVCodec* decoder, PDECODER_PARAMETERS params, bool testFrame, bool eglOnly)
{
// In test-only mode, we should only see test frames
SDL_assert(!m_TestOnly || testFrame);
// Create the frontend renderer based on the capabilities of the backend renderer
if (!createFrontendRenderer(params)) {
if (!createFrontendRenderer(params, eglOnly)) {
return false;
}
@@ -365,6 +370,14 @@ bool FFmpegVideoDecoder::completeInitialization(AVCodec* decoder, PDECODER_PARAM
}
}
// Allow the renderer to do any validation it wants on this frame
if (!m_FrontendRenderer->testRenderFrame(frame)) {
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
"Render test failed");
av_frame_free(&frame);
return false;
}
av_frame_free(&frame);
if (err < 0) {
char errorstring[512];
@@ -555,42 +568,48 @@ bool FFmpegVideoDecoder::tryInitializeRenderer(AVCodec* decoder,
const AVCodecHWConfig* hwConfig,
std::function<IFFmpegRenderer*()> createRendererFunc)
{
m_BackendRenderer = createRendererFunc();
m_HwDecodeCfg = hwConfig;
if (m_BackendRenderer != nullptr &&
m_BackendRenderer->initialize(params) &&
completeInitialization(decoder, params, m_TestOnly || m_BackendRenderer->needsTestFrame())) {
if (m_TestOnly) {
// This decoder is only for testing capabilities, so don't bother
// creating a usable renderer
return true;
}
if (m_BackendRenderer->needsTestFrame()) {
// The test worked, so now let's initialize it for real
reset();
if ((m_BackendRenderer = createRendererFunc()) != nullptr &&
m_BackendRenderer->initialize(params) &&
completeInitialization(decoder, params, false)) {
// i == 0 - Indirect via EGL frontend with zero-copy DMA-BUF passing
// i == 1 - Direct rendering or indirect via SDL read-back
for (int i = 0; i < 2; i++) {
SDL_assert(m_BackendRenderer == nullptr);
if ((m_BackendRenderer = createRendererFunc()) != nullptr &&
m_BackendRenderer->initialize(params) &&
completeInitialization(decoder, params, m_TestOnly || m_BackendRenderer->needsTestFrame(), i == 0 /* EGL */)) {
if (m_TestOnly) {
// This decoder is only for testing capabilities, so don't bother
// creating a usable renderer
return true;
}
else {
SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION,
"Decoder failed to initialize after successful test");
if (m_BackendRenderer->needsTestFrame()) {
// The test worked, so now let's initialize it for real
reset();
if ((m_BackendRenderer = createRendererFunc()) != nullptr &&
m_BackendRenderer->initialize(params) &&
completeInitialization(decoder, params, false, i == 0 /* EGL */)) {
return true;
}
else {
SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION,
"Decoder failed to initialize after successful test");
reset();
}
}
else {
// No test required. Good to go now.
return true;
}
}
else {
// No test required. Good to go now.
return true;
// Failed to initialize, so keep looking
reset();
}
}
else {
// Failed to initialize or test frame failed, so keep looking
reset();
}
// reset() must be called before we reach this point!
SDL_assert(m_BackendRenderer == nullptr);
return false;
}
+2 -2
View File
@@ -26,7 +26,7 @@ public:
virtual IFFmpegRenderer* getBackendRenderer();
private:
bool completeInitialization(AVCodec* decoder, PDECODER_PARAMETERS params, bool testFrame);
bool completeInitialization(AVCodec* decoder, PDECODER_PARAMETERS params, bool testFrame, bool eglOnly);
void stringifyVideoStats(VIDEO_STATS& stats, char* output);
@@ -34,7 +34,7 @@ private:
void addVideoStats(VIDEO_STATS& src, VIDEO_STATS& dst);
bool createFrontendRenderer(PDECODER_PARAMETERS params);
bool createFrontendRenderer(PDECODER_PARAMETERS params, bool eglOnly);
bool tryInitializeRendererForDecoderByName(const char* decoderName,
PDECODER_PARAMETERS params);
+1 -1
View File
@@ -1 +1 @@
3.1.0
3.1.1
+1 -1
View File
@@ -24,7 +24,7 @@ install:
- sh: '[ "$BUILD_TARGET" != linux ] || sudo apt install -y qt514base qt514quickcontrols2 qt514svg qt514wayland nasm libgbm-dev libdrm-dev libfreetype6-dev libasound2-dev libdbus-1-dev libegl1-mesa-dev libgl1-mesa-dev libgles2-mesa-dev libglu1-mesa-dev libibus-1.0-dev libpulse-dev libudev-dev libx11-dev libxcursor-dev libxext-dev libxi-dev libxinerama-dev libxkbcommon-dev libxrandr-dev libxss-dev libxt-dev libxv-dev libxxf86vm-dev wayland-protocols libopus-dev libvdpau-dev'
- sh: 'if [[ "$BUILD_TARGET" = linux ]]; then export SDL2_REV=dfa64eadd38a6a8125290dcf121f1bc285e98dad && git clone https://github.com/libsdl-org/SDL.git SDL2 && cd SDL2 && git checkout $SDL2_REV && ./configure --enable-video-kmsdrm && make -j$(nproc) && sudo make install && cd ..; fi'
- sh: 'if [[ "$BUILD_TARGET" = linux ]]; then export SDL2_TTF_VER=2.0.15 && wget https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-$SDL2_TTF_VER.tar.gz && tar -xvf SDL2_ttf-$SDL2_TTF_VER.tar.gz && cd SDL2_ttf-$SDL2_TTF_VER && ./configure && make -j$(nproc) && sudo make install && cd ..; fi'
- sh: 'if [[ "$BUILD_TARGET" = linux ]]; then export LIBVA_VER=2.10.0 && wget https://github.com/intel/libva/releases/download/$LIBVA_VER/libva-$LIBVA_VER.tar.bz2 && tar -xvf libva-$LIBVA_VER.tar.bz2 && cd libva-$LIBVA_VER && ./configure && make -j$(nproc) && sudo make install && cd ..; fi'
- sh: 'if [[ "$BUILD_TARGET" = linux ]]; then export LIBVA_VER=2.11.0 && git clone https://github.com/intel/libva.git && cd libva && git checkout $LIBVA_VER && ./autogen.sh && ./configure && make -j$(nproc) && sudo make install && cd ..; fi'
- sh: 'if [[ "$BUILD_TARGET" = linux ]]; then export NVHDR_VER=8.1.24.12 && wget https://github.com/FFmpeg/nv-codec-headers/releases/download/n$NVHDR_VER/nv-codec-headers-$NVHDR_VER.tar.gz && tar -xvf nv-codec-headers-$NVHDR_VER.tar.gz && cd nv-codec-headers-$NVHDR_VER && sudo make install && cd ..; fi'
- sh: 'if [[ "$BUILD_TARGET" = linux ]]; then export FFMPEG_VER=4.3.1 && wget https://ffmpeg.org/releases/ffmpeg-$FFMPEG_VER.tar.bz2 && tar -xvf ffmpeg-$FFMPEG_VER.tar.bz2 && cd ffmpeg-$FFMPEG_VER && ./configure $FFMPEG_CONFIGURE_ARGS && make -j$(nproc) && sudo make install && sudo ldconfig && cd ..; fi'
- sh: 'if [[ "$BUILD_TARGET" = linux ]]; then mkdir $HOME/bin && wget -O $HOME/bin/linuxdeployqt https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage && chmod a+x $HOME/bin/linuxdeployqt; fi'
+1 -1
Submodule libs updated: db54134a65...c5149747ff