功能:完善2K串流、显示恢复与输入优化

This commit is contained in:
songyiming committed 2026-11-03 13:43:50 +08:00
1 parent e47b01beec
commit 938ec97cce
95 files changed
+5788 -72

No files matched your search

@@ -10,7 +10,11 @@ class MoonlightSessionTest : public QObject {
private slots:
void parsesSplitReadyMarkers();
void requiresBothReadyMarkers();
void acceptsSeparateHardwareTestDecoder();
void rejectsSecondStart();
void buildsConsistentStreamArguments();
void selectsProfileWithoutLosingStats();
void rejectsInvalidDecoderOverride();
};
void MoonlightSessionTest::parsesSplitReadyMarkers() {
@@ -38,6 +42,19 @@ void MoonlightSessionTest::requiresBothReadyMarkers() {
QVERIFY(!parser.isReady());
}
void MoonlightSessionTest::acceptsSeparateHardwareTestDecoder() {
MoonlightOutputParser parser;
parser.append("Using custom H.264 decoder (H264_DECODER_HINT): h264_rkmpp\n");
QVERIFY(!parser.isReady());
parser.append("Not reusing test decoder for h264_rkmpp\n");
QVERIFY(parser.hasTestDecode());
QVERIFY(!parser.isReady());
parser.append("Renderer 'EGL' with 'DRM' backend chosen\n");
QVERIFY(parser.isReady());
parser.append("Connection terminated: -1\n");
QVERIFY(!parser.isReady());
}
void MoonlightSessionTest::rejectsSecondStart() {
QTemporaryDir tempDir;
QVERIFY(tempDir.isValid());
@@ -90,5 +107,61 @@ void MoonlightSessionTest::rejectsSecondStart() {
qputenv("PATH", oldPath);
}
void MoonlightSessionTest::buildsConsistentStreamArguments() {
ConnectionTicket ticket;
ticket.endpoint = QStringLiteral("192.168.1.70");
ticket.app = QStringLiteral("Desktop");
ticket.width = 2560;
ticket.height = 1440;
ticket.fps = 30;
MoonlightSession::Options options;
options.profile = QStringLiteral("low-latency");
options.decoder = QStringLiteral("software");
options.videoCodec = QStringLiteral("H.264");
options.vsync = false;
options.framePacing = false;
options.performanceOverlay = true;
const QStringList args = MoonlightSession::buildStreamArguments(ticket, options);
QVERIFY(args.contains(QStringLiteral("--resolution")));
QVERIFY(args.contains(QStringLiteral("2560x1440")));
QVERIFY(args.contains(QStringLiteral("--fps")));
QVERIFY(args.contains(QStringLiteral("30")));
QVERIFY(args.contains(QStringLiteral("--bitrate")));
QVERIFY(args.contains(QStringLiteral("30000")));
QVERIFY(args.contains(QStringLiteral("--no-vsync")));
QVERIFY(args.contains(QStringLiteral("--no-frame-pacing")));
QVERIFY(args.contains(QStringLiteral("--performance-overlay")));
QVERIFY(args.contains(QStringLiteral("--absolute-mouse")));
}
void MoonlightSessionTest::selectsProfileWithoutLosingStats() {
QProcessEnvironment environment;
environment.insert(QStringLiteral("VDI_STREAM_PROFILE"), QStringLiteral("low-latency"));
environment.insert(QStringLiteral("VDI_STREAM_STATS"), QStringLiteral("1"));
auto options = MoonlightSession::optionsFromEnvironment(environment);
QVERIFY(!options.vsync);
QVERIFY(!options.framePacing);
QVERIFY(options.performanceOverlay);
environment.insert(QStringLiteral("VDI_STREAM_PROFILE"), QStringLiteral("smooth"));
options = MoonlightSession::optionsFromEnvironment(environment);
QVERIFY(options.vsync);
QVERIFY(options.framePacing);
QVERIFY(options.performanceOverlay);
}
void MoonlightSessionTest::rejectsInvalidDecoderOverride() {
QProcessEnvironment environment;
environment.insert(QStringLiteral("VDI_MOONLIGHT_DECODER"), QStringLiteral("h264_rkmpp"));
environment.insert(QStringLiteral("VDI_STREAM_PROFILE"), QStringLiteral("invalid"));
auto options = MoonlightSession::optionsFromEnvironment(environment);
QCOMPARE(options.decoder, QStringLiteral("software"));
QCOMPARE(options.profile, QStringLiteral("smooth"));
environment.insert(QStringLiteral("VDI_MOONLIGHT_DECODER"), QStringLiteral("hardware"));
options = MoonlightSession::optionsFromEnvironment(environment);
QCOMPARE(options.decoder, QStringLiteral("hardware"));
}
QTEST_GUILESS_MAIN(MoonlightSessionTest)
#include "test_moonlight_session.moc"