Showing preview only (6,956K chars total). Download the full file or copy to clipboard to get everything.
Repository: qiin2333/foundation-sunshine
Branch: master
Commit: 3beecddb0cd1
Files: 586
Total size: 6.2 MB
Directory structure:
gitextract_wjclcvr9/
├── .clang-format
├── .codeql-prebuild-cpp-Linux.sh
├── .codeql-prebuild-cpp-Windows.sh
├── .codeql-prebuild-cpp-macOS.sh
├── .coderabbit.yaml
├── .dockerignore
├── .flake8
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report_en.yml
│ │ ├── bug_report_zh.yml
│ │ ├── config.yml
│ │ ├── feature_request_en.yml
│ │ └── feature_request_zh.yml
│ ├── RELEASE_TEMPLATE.md
│ └── workflows/
│ ├── main.yml
│ ├── sign-and-repackage.yml
│ ├── test-signpath.yml
│ ├── translate-simple.yml
│ └── update-driver-versions.yml
├── .gitignore
├── .gitmodules
├── .prettierrc.json
├── .readthedocs.yaml
├── .rstcheck.cfg
├── CMakeLists.txt
├── CMakePresets.json
├── DOCKER_README.md
├── LICENSE
├── NOTICE
├── README.de.md
├── README.en.md
├── README.fr.md
├── README.ja.md
├── README.md
├── README.md.backup
├── cmake/
│ ├── FindLIBCAP.cmake
│ ├── FindLIBDRM.cmake
│ ├── FindLibva.cmake
│ ├── FindSystemd.cmake
│ ├── FindUdev.cmake
│ ├── FindWayland.cmake
│ ├── compile_definitions/
│ │ ├── common.cmake
│ │ ├── linux.cmake
│ │ ├── macos.cmake
│ │ ├── unix.cmake
│ │ └── windows.cmake
│ ├── dependencies/
│ │ ├── Boost_Sunshine.cmake
│ │ ├── common.cmake
│ │ ├── libevdev_Sunshine.cmake
│ │ ├── linux.cmake
│ │ ├── macos.cmake
│ │ ├── nlohmann_json.cmake
│ │ ├── unix.cmake
│ │ └── windows.cmake
│ ├── macros/
│ │ ├── common.cmake
│ │ ├── linux.cmake
│ │ ├── macos.cmake
│ │ ├── unix.cmake
│ │ └── windows.cmake
│ ├── packaging/
│ │ ├── ChineseSimplified.isl
│ │ ├── FetchDriverDeps.cmake
│ │ ├── FetchGUI.cmake
│ │ ├── common.cmake
│ │ ├── linux.cmake
│ │ ├── macos.cmake
│ │ ├── sunshine.iss.in
│ │ ├── unix.cmake
│ │ ├── windows.cmake
│ │ ├── windows_innosetup.cmake
│ │ ├── windows_nsis.cmake
│ │ └── windows_wix.cmake
│ ├── prep/
│ │ ├── build_version.cmake
│ │ ├── constants.cmake
│ │ ├── init.cmake
│ │ ├── options.cmake
│ │ └── special_package_configuration.cmake
│ └── targets/
│ ├── common.cmake
│ ├── linux.cmake
│ ├── macos.cmake
│ ├── unix.cmake
│ └── windows.cmake
├── codecov.yml
├── crowdin.yml
├── docker/
│ ├── archlinux.dockerfile
│ ├── clion-toolchain.dockerfile
│ ├── debian-bookworm.dockerfile
│ ├── fedora-39.dockerfile
│ ├── fedora-40.dockerfile
│ ├── ubuntu-22.04.dockerfile
│ └── ubuntu-24.04.dockerfile
├── docs/
│ ├── Doxyfile
│ ├── Doxyfile-1.10.0-default
│ ├── WEBUI_DEVELOPMENT.md
│ ├── WGC_vs_DDAPI_Smoothness_Fun_Guide.md
│ ├── app_examples.md
│ ├── building.md
│ ├── changelog.md
│ ├── configuration.md
│ ├── contributing.md
│ ├── gamestream_migration.md
│ ├── getting_started.md
│ ├── guides.md
│ ├── legal.md
│ ├── performance_tuning.md
│ ├── run_command_dev_guide.md
│ ├── source/
│ │ ├── about/
│ │ │ └── advanced_usage.rst
│ │ └── source_code/
│ │ └── src/
│ │ ├── display_device/
│ │ │ ├── display_device.rst
│ │ │ ├── parsed_config.rst
│ │ │ ├── session.rst
│ │ │ ├── settings.rst
│ │ │ └── to_string.rst
│ │ └── platform/
│ │ └── windows/
│ │ └── display_device/
│ │ ├── settings_data.rst
│ │ ├── settings_topology.rst
│ │ └── windows_utils.rst
│ ├── third_party_packages.md
│ ├── troubleshooting.md
│ └── webhook_format.md
├── gh-pages-template/
│ └── index.html
├── package.json
├── scripts/
│ ├── README_I18N.md
│ ├── _locale.py
│ ├── format-i18n.js
│ ├── generate-checksums.ps1
│ ├── icons/
│ │ └── convert_and_pack.sh
│ ├── linux_build.sh
│ ├── requirements.txt
│ ├── reverse-sync-i18n.js
│ ├── update_clang_format.py
│ ├── validate-i18n.js
│ └── vmouse_smoke.ps1
├── src/
│ ├── abr.cpp
│ ├── abr.h
│ ├── amf/
│ │ ├── amf_config.h
│ │ ├── amf_d3d11.cpp
│ │ ├── amf_d3d11.h
│ │ ├── amf_encoded_frame.h
│ │ └── amf_encoder.h
│ ├── assets/
│ │ └── abr_prompt.md
│ ├── audio.cpp
│ ├── audio.h
│ ├── cbs.cpp
│ ├── cbs.h
│ ├── config.cpp
│ ├── config.h
│ ├── confighttp.cpp
│ ├── confighttp.h
│ ├── crypto.cpp
│ ├── crypto.h
│ ├── display_device/
│ │ ├── display_device.h
│ │ ├── parsed_config.cpp
│ │ ├── parsed_config.h
│ │ ├── session.cpp
│ │ ├── session.h
│ │ ├── settings.cpp
│ │ ├── settings.h
│ │ ├── to_string.cpp
│ │ ├── to_string.h
│ │ ├── vdd_utils.cpp
│ │ └── vdd_utils.h
│ ├── entry_handler.cpp
│ ├── entry_handler.h
│ ├── file_handler.cpp
│ ├── file_handler.h
│ ├── globals.cpp
│ ├── globals.h
│ ├── httpcommon.cpp
│ ├── httpcommon.h
│ ├── input.cpp
│ ├── input.h
│ ├── logging.cpp
│ ├── logging.h
│ ├── main.cpp
│ ├── main.h
│ ├── move_by_copy.h
│ ├── network.cpp
│ ├── network.h
│ ├── nvenc/
│ │ ├── common_impl/
│ │ │ ├── nvenc_base.cpp
│ │ │ ├── nvenc_base.h
│ │ │ ├── nvenc_utils.cpp
│ │ │ └── nvenc_utils.h
│ │ ├── nvenc_config.h
│ │ ├── nvenc_encoded_frame.h
│ │ ├── nvenc_encoder.h
│ │ └── win/
│ │ ├── impl/
│ │ │ ├── nvenc_d3d11_base.cpp
│ │ │ ├── nvenc_d3d11_base.h
│ │ │ ├── nvenc_d3d11_native.cpp
│ │ │ ├── nvenc_d3d11_native.h
│ │ │ ├── nvenc_d3d11_on_cuda.cpp
│ │ │ ├── nvenc_d3d11_on_cuda.h
│ │ │ ├── nvenc_dynamic_factory_1100.cpp
│ │ │ ├── nvenc_dynamic_factory_1100.h
│ │ │ ├── nvenc_dynamic_factory_1200.cpp
│ │ │ ├── nvenc_dynamic_factory_1200.h
│ │ │ ├── nvenc_dynamic_factory_1202.cpp
│ │ │ ├── nvenc_dynamic_factory_1202.h
│ │ │ ├── nvenc_dynamic_factory_blueprint.h
│ │ │ └── nvenc_shared_dll.h
│ │ ├── nvenc_d3d11.h
│ │ ├── nvenc_dynamic_factory.cpp
│ │ └── nvenc_dynamic_factory.h
│ ├── nvhttp.cpp
│ ├── nvhttp.h
│ ├── platform/
│ │ ├── common.h
│ │ ├── linux/
│ │ │ ├── audio.cpp
│ │ │ ├── cuda.cpp
│ │ │ ├── cuda.cu
│ │ │ ├── cuda.h
│ │ │ ├── display_device.cpp
│ │ │ ├── graphics.cpp
│ │ │ ├── graphics.h
│ │ │ ├── input/
│ │ │ │ ├── inputtino.cpp
│ │ │ │ ├── inputtino_common.h
│ │ │ │ ├── inputtino_gamepad.cpp
│ │ │ │ ├── inputtino_gamepad.h
│ │ │ │ ├── inputtino_keyboard.cpp
│ │ │ │ ├── inputtino_keyboard.h
│ │ │ │ ├── inputtino_mouse.cpp
│ │ │ │ ├── inputtino_mouse.h
│ │ │ │ ├── inputtino_pen.cpp
│ │ │ │ ├── inputtino_pen.h
│ │ │ │ ├── inputtino_touch.cpp
│ │ │ │ ├── inputtino_touch.h
│ │ │ │ └── legacy_input.cpp
│ │ │ ├── kmsgrab.cpp
│ │ │ ├── misc.cpp
│ │ │ ├── misc.h
│ │ │ ├── publish.cpp
│ │ │ ├── vaapi.cpp
│ │ │ ├── vaapi.h
│ │ │ ├── wayland.cpp
│ │ │ ├── wayland.h
│ │ │ ├── wlgrab.cpp
│ │ │ ├── x11grab.cpp
│ │ │ └── x11grab.h
│ │ ├── macos/
│ │ │ ├── av_audio.h
│ │ │ ├── av_audio.m
│ │ │ ├── av_img_t.h
│ │ │ ├── av_video.h
│ │ │ ├── av_video.m
│ │ │ ├── display.mm
│ │ │ ├── display_device.cpp
│ │ │ ├── input.cpp
│ │ │ ├── microphone.mm
│ │ │ ├── misc.h
│ │ │ ├── misc.mm
│ │ │ ├── nv12_zero_device.cpp
│ │ │ ├── nv12_zero_device.h
│ │ │ └── publish.cpp
│ │ ├── run_command.h
│ │ └── windows/
│ │ ├── PolicyConfig.h
│ │ ├── audio.cpp
│ │ ├── display.h
│ │ ├── display_amd.cpp
│ │ ├── display_base.cpp
│ │ ├── display_device/
│ │ │ ├── device_hdr_states.cpp
│ │ │ ├── device_modes.cpp
│ │ │ ├── device_topology.cpp
│ │ │ ├── general_functions.cpp
│ │ │ ├── session_listener.cpp
│ │ │ ├── session_listener.h
│ │ │ ├── settings.cpp
│ │ │ ├── settings_topology.cpp
│ │ │ ├── settings_topology.h
│ │ │ ├── windows_utils.cpp
│ │ │ └── windows_utils.h
│ │ ├── display_ram.cpp
│ │ ├── display_vram.cpp
│ │ ├── display_wgc.cpp
│ │ ├── dsu_server.cpp
│ │ ├── dsu_server.h
│ │ ├── ftime_compat.cpp
│ │ ├── input.cpp
│ │ ├── keylayout.h
│ │ ├── mic_write.cpp
│ │ ├── mic_write.h
│ │ ├── misc.cpp
│ │ ├── misc.h
│ │ ├── nvprefs/
│ │ │ ├── driver_settings.cpp
│ │ │ ├── driver_settings.h
│ │ │ ├── nvapi_opensource_wrapper.cpp
│ │ │ ├── nvprefs_common.cpp
│ │ │ ├── nvprefs_common.h
│ │ │ ├── nvprefs_interface.cpp
│ │ │ ├── nvprefs_interface.h
│ │ │ ├── undo_data.cpp
│ │ │ ├── undo_data.h
│ │ │ ├── undo_file.cpp
│ │ │ └── undo_file.h
│ │ ├── publish.cpp
│ │ ├── virtual_mouse.cpp
│ │ ├── virtual_mouse.h
│ │ ├── win_dark_mode.cpp
│ │ ├── win_dark_mode.h
│ │ └── windows.rc.in
│ ├── process.cpp
│ ├── process.h
│ ├── round_robin.h
│ ├── rswrapper.c
│ ├── rswrapper.h
│ ├── rtsp.cpp
│ ├── rtsp.h
│ ├── stat_trackers.cpp
│ ├── stat_trackers.h
│ ├── stb_image.h
│ ├── stb_image_write.h
│ ├── stream.cpp
│ ├── stream.h
│ ├── sync.h
│ ├── system_tray.cpp
│ ├── system_tray.h
│ ├── system_tray_i18n.cpp
│ ├── system_tray_i18n.h
│ ├── task_pool.h
│ ├── thread_pool.h
│ ├── thread_safe.h
│ ├── upnp.cpp
│ ├── upnp.h
│ ├── utility.h
│ ├── uuid.h
│ ├── version.h.in
│ ├── video.cpp
│ ├── video.h
│ ├── video_colorspace.cpp
│ ├── video_colorspace.h
│ ├── webhook.cpp
│ ├── webhook.h
│ ├── webhook_format.cpp
│ ├── webhook_format.h
│ ├── webhook_httpsclient.cpp
│ └── webhook_httpsclient.h
├── src_assets/
│ ├── common/
│ │ └── assets/
│ │ └── web/
│ │ ├── apps.html
│ │ ├── components/
│ │ │ ├── AccordionItem.vue
│ │ │ ├── AppCard.vue
│ │ │ ├── AppEditor.vue
│ │ │ ├── AppListItem.vue
│ │ │ ├── Checkbox.vue
│ │ │ ├── CheckboxField.vue
│ │ │ ├── CommandTable.vue
│ │ │ ├── CoverFinder.vue
│ │ │ ├── FormField.vue
│ │ │ ├── ImageSelector.vue
│ │ │ ├── LogDiagnosisModal.vue
│ │ │ ├── LogsSection.vue
│ │ │ ├── ScanResultModal.vue
│ │ │ ├── SetupWizard.vue
│ │ │ ├── TroubleshootingCard.vue
│ │ │ ├── common/
│ │ │ │ ├── ErrorLogs.vue
│ │ │ │ ├── Icon.vue
│ │ │ │ ├── Locale.vue
│ │ │ │ ├── ResourceCard.vue
│ │ │ │ ├── ThemeToggle.vue
│ │ │ │ └── VersionCard.vue
│ │ │ └── layout/
│ │ │ ├── Navbar.vue
│ │ │ └── PlatformLayout.vue
│ │ ├── composables/
│ │ │ ├── useAiDiagnosis.js
│ │ │ ├── useApps.js
│ │ │ ├── useBackground.js
│ │ │ ├── useConfig.js
│ │ │ ├── useLogout.js
│ │ │ ├── useLogs.js
│ │ │ ├── usePin.js
│ │ │ ├── useQrPair.js
│ │ │ ├── useSetupWizard.js
│ │ │ ├── useTheme.js
│ │ │ ├── useTroubleshooting.js
│ │ │ ├── useVersion.js
│ │ │ └── useWelcome.js
│ │ ├── config/
│ │ │ ├── firebase.js
│ │ │ └── i18n.js
│ │ ├── config.html
│ │ ├── configs/
│ │ │ └── tabs/
│ │ │ ├── Advanced.vue
│ │ │ ├── AudioVideo.vue
│ │ │ ├── ContainerEncoders.vue
│ │ │ ├── Files.vue
│ │ │ ├── General.vue
│ │ │ ├── Inputs.vue
│ │ │ ├── Network.vue
│ │ │ ├── audiovideo/
│ │ │ │ ├── AdapterNameSelector.vue
│ │ │ │ ├── DisplayDeviceOptions.vue
│ │ │ │ ├── DisplayModesSettings.vue
│ │ │ │ ├── ExperimentalFeatures.vue
│ │ │ │ ├── LegacyDisplayOutputSelector.vue
│ │ │ │ ├── NewDisplayOutputSelector.vue
│ │ │ │ └── VirtualDisplaySettings.vue
│ │ │ └── encoders/
│ │ │ ├── AmdAmfEncoder.vue
│ │ │ ├── IntelQuickSyncEncoder.vue
│ │ │ ├── NvidiaNvencEncoder.vue
│ │ │ ├── SoftwareEncoder.vue
│ │ │ └── VideotoolboxEncoder.vue
│ │ ├── fonts/
│ │ │ └── fonts.css
│ │ ├── index.html
│ │ ├── init.js
│ │ ├── password.html
│ │ ├── pin.html
│ │ ├── platform-i18n.js
│ │ ├── public/
│ │ │ └── assets/
│ │ │ ├── css/
│ │ │ │ └── sunshine.css
│ │ │ └── locale/
│ │ │ ├── bg.json
│ │ │ ├── cs.json
│ │ │ ├── de.json
│ │ │ ├── en.json
│ │ │ ├── en_GB.json
│ │ │ ├── en_US.json
│ │ │ ├── es.json
│ │ │ ├── fr.json
│ │ │ ├── it.json
│ │ │ ├── ja.json
│ │ │ ├── ko.json
│ │ │ ├── pl.json
│ │ │ ├── pt.json
│ │ │ ├── pt_BR.json
│ │ │ ├── ru.json
│ │ │ ├── sv.json
│ │ │ ├── tr.json
│ │ │ ├── uk.json
│ │ │ ├── zh.json
│ │ │ └── zh_TW.json
│ │ ├── scripts/
│ │ │ └── extract-welcome-locales.js
│ │ ├── services/
│ │ │ └── appService.js
│ │ ├── styles/
│ │ │ ├── apps.less
│ │ │ ├── global.less
│ │ │ ├── modal-glass.less
│ │ │ ├── var.css
│ │ │ └── welcome.less
│ │ ├── sunshine_version.js
│ │ ├── template_header.html
│ │ ├── template_header_dev.html
│ │ ├── troubleshooting.html
│ │ ├── utils/
│ │ │ ├── README.md
│ │ │ ├── constants.js
│ │ │ ├── coverSearch.js
│ │ │ ├── errorHandler.js
│ │ │ ├── fileSelection.js
│ │ │ ├── helpers.js
│ │ │ ├── imageUtils.js
│ │ │ ├── steamApi.js
│ │ │ ├── theme.js
│ │ │ └── validation.js
│ │ ├── views/
│ │ │ ├── Apps.vue
│ │ │ ├── Config.vue
│ │ │ ├── Home.vue
│ │ │ ├── Password.vue
│ │ │ ├── Pin.vue
│ │ │ ├── Troubleshooting.vue
│ │ │ └── Welcome.vue
│ │ └── welcome.html.template
│ ├── linux/
│ │ ├── assets/
│ │ │ ├── apps.json
│ │ │ └── shaders/
│ │ │ └── opengl/
│ │ │ ├── ConvertUV.frag
│ │ │ ├── ConvertUV.vert
│ │ │ ├── ConvertY.frag
│ │ │ ├── Scene.frag
│ │ │ └── Scene.vert
│ │ └── misc/
│ │ ├── 60-sunshine.rules
│ │ └── postinst
│ ├── macos/
│ │ ├── assets/
│ │ │ ├── Info.plist
│ │ │ └── apps.json
│ │ └── misc/
│ │ └── uninstall_pkg.sh
│ └── windows/
│ ├── assets/
│ │ ├── apps.json
│ │ └── shaders/
│ │ └── directx/
│ │ ├── convert_yuv420_packed_uv_bicubic_ps.hlsl
│ │ ├── convert_yuv420_packed_uv_bicubic_ps_hybrid_log_gamma.hlsl
│ │ ├── convert_yuv420_packed_uv_bicubic_ps_linear.hlsl
│ │ ├── convert_yuv420_packed_uv_bicubic_ps_perceptual_quantizer.hlsl
│ │ ├── convert_yuv420_packed_uv_bicubic_vs.hlsl
│ │ ├── convert_yuv420_packed_uv_type0_ps.hlsl
│ │ ├── convert_yuv420_packed_uv_type0_ps_hybrid_log_gamma.hlsl
│ │ ├── convert_yuv420_packed_uv_type0_ps_linear.hlsl
│ │ ├── convert_yuv420_packed_uv_type0_ps_perceptual_quantizer.hlsl
│ │ ├── convert_yuv420_packed_uv_type0_vs.hlsl
│ │ ├── convert_yuv420_packed_uv_type0s_ps.hlsl
│ │ ├── convert_yuv420_packed_uv_type0s_ps_hybrid_log_gamma.hlsl
│ │ ├── convert_yuv420_packed_uv_type0s_ps_linear.hlsl
│ │ ├── convert_yuv420_packed_uv_type0s_ps_perceptual_quantizer.hlsl
│ │ ├── convert_yuv420_packed_uv_type0s_vs.hlsl
│ │ ├── convert_yuv420_planar_y_bicubic_ps.hlsl
│ │ ├── convert_yuv420_planar_y_bicubic_ps_hybrid_log_gamma.hlsl
│ │ ├── convert_yuv420_planar_y_bicubic_ps_linear.hlsl
│ │ ├── convert_yuv420_planar_y_bicubic_ps_perceptual_quantizer.hlsl
│ │ ├── convert_yuv420_planar_y_ps.hlsl
│ │ ├── convert_yuv420_planar_y_ps_hybrid_log_gamma.hlsl
│ │ ├── convert_yuv420_planar_y_ps_linear.hlsl
│ │ ├── convert_yuv420_planar_y_ps_perceptual_quantizer.hlsl
│ │ ├── convert_yuv420_planar_y_vs.hlsl
│ │ ├── convert_yuv444_packed_ayuv_ps.hlsl
│ │ ├── convert_yuv444_packed_ayuv_ps_linear.hlsl
│ │ ├── convert_yuv444_packed_vs.hlsl
│ │ ├── convert_yuv444_packed_y410_ps.hlsl
│ │ ├── convert_yuv444_packed_y410_ps_hybrid_log_gamma.hlsl
│ │ ├── convert_yuv444_packed_y410_ps_linear.hlsl
│ │ ├── convert_yuv444_packed_y410_ps_perceptual_quantizer.hlsl
│ │ ├── convert_yuv444_planar_ps.hlsl
│ │ ├── convert_yuv444_planar_ps_hybrid_log_gamma.hlsl
│ │ ├── convert_yuv444_planar_ps_linear.hlsl
│ │ ├── convert_yuv444_planar_ps_perceptual_quantizer.hlsl
│ │ ├── convert_yuv444_planar_vs.hlsl
│ │ ├── cursor_ps.hlsl
│ │ ├── cursor_ps_normalize_white.hlsl
│ │ ├── cursor_vs.hlsl
│ │ ├── hdr_luminance_analysis_cs.hlsl
│ │ ├── hdr_luminance_reduce_cs.hlsl
│ │ ├── include/
│ │ │ ├── base_vs.hlsl
│ │ │ ├── base_vs_types.hlsl
│ │ │ ├── common.hlsl
│ │ │ ├── convert_base.hlsl
│ │ │ ├── convert_hybrid_log_gamma_base.hlsl
│ │ │ ├── convert_linear_base.hlsl
│ │ │ ├── convert_perceptual_quantizer_base.hlsl
│ │ │ ├── convert_yuv420_packed_uv_bicubic_ps_base.hlsl
│ │ │ ├── convert_yuv420_packed_uv_ps_base.hlsl
│ │ │ ├── convert_yuv420_planar_y_bicubic_ps_base.hlsl
│ │ │ ├── convert_yuv420_planar_y_ps_base.hlsl
│ │ │ └── convert_yuv444_ps_base.hlsl
│ │ ├── simple_cursor_ps.hlsl
│ │ └── simple_cursor_vs.hlsl
│ └── misc/
│ ├── autostart/
│ │ └── autostart-service.bat
│ ├── firewall/
│ │ ├── add-firewall-rule.bat
│ │ └── delete-firewall-rule.bat
│ ├── gamepad/
│ │ ├── install-gamepad.bat
│ │ └── uninstall-gamepad.bat
│ ├── install_portable.bat
│ ├── languages/
│ │ ├── de-DE.lang
│ │ ├── en-US.lang
│ │ ├── fr-FR.lang
│ │ ├── ja-JP.lang
│ │ ├── ru-RU.lang
│ │ └── zh-Simple.lang
│ ├── migration/
│ │ ├── IMAGE_MIGRATION.md
│ │ ├── migrate-config.bat
│ │ └── migrate-images.ps1
│ ├── path/
│ │ └── update-path.bat
│ ├── service/
│ │ ├── install-service.bat
│ │ ├── sleep.bat
│ │ └── uninstall-service.bat
│ ├── uninstall_portable.bat
│ ├── vdd/
│ │ ├── driver/
│ │ │ └── vdd_settings.xml
│ │ ├── install-vdd.bat
│ │ └── uninstall-vdd.bat
│ ├── vmouse/
│ │ ├── driver/
│ │ │ ├── README.md
│ │ │ └── ZakoVirtualMouse.cer
│ │ ├── install-vmouse.bat
│ │ └── uninstall-vmouse.bat
│ └── vsink/
│ ├── install-vsink.bat
│ └── uninstall-vsink.bat
├── sunshine.icns
├── tests/
│ ├── CMakeLists.txt
│ ├── tests_common.h
│ ├── tests_environment.h
│ ├── tests_events.h
│ ├── tests_log_checker.h
│ ├── tests_main.cpp
│ ├── tools/
│ │ ├── vmouse_logging_stubs.cpp
│ │ ├── vmouse_probe.cpp
│ │ └── vmouse_send_diag.cpp
│ └── unit/
│ ├── platform/
│ │ ├── test_common.cpp
│ │ └── windows/
│ │ └── test_virtual_mouse.cpp
│ ├── test_audio.cpp
│ ├── test_entry_handler.cpp
│ ├── test_file_handler.cpp
│ ├── test_httpcommon.cpp
│ ├── test_logging.cpp
│ ├── test_mouse.cpp
│ ├── test_network.cpp
│ ├── test_rswrapper.cpp
│ ├── test_stream.cpp
│ ├── test_video.cpp
│ ├── test_webhook.cpp
│ └── test_webhook_config.cpp
├── third-party/
│ ├── .clang-format-ignore
│ ├── glad/
│ │ ├── include/
│ │ │ ├── EGL/
│ │ │ │ └── eglplatform.h
│ │ │ ├── KHR/
│ │ │ │ └── khrplatform.h
│ │ │ └── glad/
│ │ │ ├── egl.h
│ │ │ └── gl.h
│ │ └── src/
│ │ ├── egl.c
│ │ └── gl.c
│ └── nvfbc/
│ ├── NvFBC.h
│ └── helper_math.h
├── tools/
│ ├── CMakeLists.txt
│ ├── audio.cpp
│ ├── build-qiin-tabtip.sh
│ ├── dxgi.cpp
│ ├── qiin-tabtip.cpp
│ ├── sunshinesvc.cpp
│ └── test_args.cpp
├── translate_simple.py
├── vite-plugin-ejs-v7.js
├── vite.config.js
└── vite.dev.config.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .clang-format
================================================
---
# This file is centrally managed in https://github.com/<organization>/.github/
# Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in
# the above-mentioned repo.
# Generated from CLion C/C++ Code Style settings
BasedOnStyle: LLVM
AccessModifierOffset: -2
AlignAfterOpenBracket: DontAlign
AlignConsecutiveAssignments: false
AlignOperands: Align
AllowAllArgumentsOnNextLine: false
AllowAllConstructorInitializersOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: Always
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortIfStatementsOnASingleLine: WithoutElse
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: true
AlignTrailingComments: false
AlwaysBreakAfterReturnType: All
AlwaysBreakTemplateDeclarations: MultiLine
BreakBeforeBraces: Custom
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: Never
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterUnion: false
BeforeCatch: true
BeforeElse: true
IndentBraces: false
SplitEmptyFunction: false
SplitEmptyRecord: true
BreakBeforeBinaryOperators: None
BreakBeforeTernaryOperators: false
BreakConstructorInitializers: AfterColon
BreakInheritanceList: AfterColon
ColumnLimit: 0
CompactNamespaces: false
ContinuationIndentWidth: 2
IndentCaseLabels: true
IndentPPDirectives: BeforeHash
IndentWidth: 2
KeepEmptyLinesAtTheStartOfBlocks: false
MaxEmptyLinesToKeep: 1
NamespaceIndentation: All
ObjCSpaceAfterProperty: true
ObjCSpaceBeforeProtocolList: true
PointerAlignment: Right
ReflowComments: true
SpaceAfterCStyleCast: true
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: true
SpaceBeforeCtorInitializerColon: false
SpaceBeforeInheritanceColon: false
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: Never
SpacesInCStyleCastParentheses: false
SpacesInContainerLiterals: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
TabWidth: 2
Cpp11BracedListStyle: false
UseTab: Never
================================================
FILE: .codeql-prebuild-cpp-Linux.sh
================================================
# install dependencies for C++ analysis
set -e
chmod +x ./scripts/linux_build.sh
./scripts/linux_build.sh --skip-package --ubuntu-test-repo
# Delete CUDA
rm -rf ./build/cuda
# skip autobuild
echo "skip_autobuild=true" >> "$GITHUB_OUTPUT"
================================================
FILE: .codeql-prebuild-cpp-Windows.sh
================================================
# install dependencies for C++ analysis
set -e
# update pacman
pacman --noconfirm -Syu
gcc_version="15.1.0-5"
broken_deps=(
"mingw-w64-ucrt-x86_64-gcc"
"mingw-w64-ucrt-x86_64-gcc-libs"
)
tarballs=""
for dep in "${broken_deps[@]}"; do
tarball="${dep}-${gcc_version}-any.pkg.tar.zst"
# download and install working version
wget https://repo.msys2.org/mingw/ucrt64/${tarball}
tarballs="${tarballs} ${tarball}"
done
# install broken dependencies
if [ -n "$tarballs" ]; then
pacman -U --noconfirm ${tarballs}
fi
# install dependencies
dependencies=(
"git"
"mingw-w64-ucrt-x86_64-cmake"
"mingw-w64-ucrt-x86_64-cppwinrt"
"mingw-w64-ucrt-x86_64-curl-winssl"
"mingw-w64-ucrt-x86_64-MinHook"
"mingw-w64-ucrt-x86_64-miniupnpc"
"mingw-w64-ucrt-x86_64-nlohmann-json"
"mingw-w64-ucrt-x86_64-nodejs"
"mingw-w64-ucrt-x86_64-nsis"
"mingw-w64-ucrt-x86_64-onevpl"
"mingw-w64-ucrt-x86_64-openssl"
"mingw-w64-ucrt-x86_64-opus"
"mingw-w64-ucrt-x86_64-toolchain"
)
# Note: mingw-w64-ucrt-x86_64-rust conflicts with fixed gcc-15.1.0-5
# We install Rust via rustup instead
pacman -Syu --noconfirm --ignore="$(IFS=,; echo "${broken_deps[*]}")" "${dependencies[@]}"
# install Rust via rustup (for Tauri GUI)
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📦 Installing Rust via rustup (required for Tauri GUI)"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
# check if cargo already exists
if command -v cargo &> /dev/null; then
echo "✅ Rust already installed: $(cargo --version)"
else
echo "📥 Downloading and installing rustup..."
# download rustup-init for Windows
curl --proto '=https' --tlsv1.2 -sSf https://win.rustup.rs/x86_64 -o /tmp/rustup-init.exe
# install rustup with defaults (non-interactive)
/tmp/rustup-init.exe -y --default-toolchain stable --profile minimal
# add cargo to PATH for current session
export PATH="$HOME/.cargo/bin:$PATH"
# verify installation
if command -v cargo &> /dev/null; then
echo "✅ Rust installed successfully: $(cargo --version)"
echo " rustc: $(rustc --version)"
else
echo "❌ Rust installation failed!"
echo " Please install manually from: https://rustup.rs/"
exit 1
fi
fi
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
# build
mkdir -p build
cmake \
-B build \
-G Ninja \
-S . \
-DBUILD_DOCS=OFF \
-DBUILD_WERROR=ON
ninja -C build
# skip autobuild
echo "skip_autobuild=true" >> "$GITHUB_OUTPUT"
================================================
FILE: .codeql-prebuild-cpp-macOS.sh
================================================
# install dependencies for C++ analysis
set -e
# install dependencies
dependencies=(
"cmake"
"miniupnpc"
"ninja"
"node"
"openssl@3"
"opus"
"pkg-config"
)
brew install "${dependencies[@]}"
# build
mkdir -p build
cd build || exit 1
cmake \
-DBOOST_USE_STATIC=OFF \
-DBUILD_DOCS=OFF \
-G "Unix Makefiles" ..
make -j"$(sysctl -n hw.logicalcpu)"
# skip autobuild
echo "skip_autobuild=true" >> "$GITHUB_OUTPUT"
================================================
FILE: .coderabbit.yaml
================================================
# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
language: zh-CN
early_access: true
reviews:
profile: chill
high_level_summary: true
high_level_summary_in_walkthrough: true
collapse_walkthrough: false
sequence_diagrams: true
estimate_code_review_effort: true
assess_linked_issues: true
related_prs: true
poem: false
review_status: true
review_details: true
path_filters:
- "!third-party/**"
- "!node_modules/**"
- "!build/**"
- "!cmake-*/**"
- "!docs/doxyconfig*"
- "!**/*.log"
- "!package-lock.json"
- "!**/*.obj"
- "!**/*.etl"
- "!**/*.csv"
- "!**/*.cat"
- "!**/*.bmp"
path_instructions:
- path: "src/**/*.{cpp,c,h}"
instructions: >
Sunshine 核心 C++ 源码,自托管游戏串流服务器。审查要点:内存安全、
线程安全、RAII 资源管理、安全漏洞。注意预处理宏控制的平台相关代码。
- path: "src/platform/**"
instructions: >
平台抽象层代码(Windows/Linux/macOS)。确保各平台实现一致,
注意 Windows API 调用的错误处理和资源释放。
- path: "cmake/**"
instructions: >
CMake 构建系统文件。审查跨平台兼容性、现代 CMake 实践。
- path: "src_assets/**/*.{vue,js,html}"
instructions: >
基于 Vue.js 的 Web 配置面板。审查 XSS/CSRF 安全性、
组件设计、状态管理和可访问性。
- path: "docker/**"
instructions: >
Docker 配置文件。审查最小化基础镜像、层缓存、安全性。
- path: "packaging/**"
instructions: >
打包配置(Inno Setup、Flatpak、DEB 等)。审查安装路径、
权限设置和依赖声明的正确性。
- path: "tests/**"
instructions: >
测试文件。验证测试覆盖率、边界情况和断言正确性。
auto_review:
enabled: true
drafts: false
base_branches:
- master
tools:
cppcheck:
enabled: true
shellcheck:
enabled: true
yamllint:
enabled: true
markdownlint:
enabled: true
chat:
auto_reply: true
knowledge_base:
opt_out: false
learnings:
scope: auto
================================================
FILE: .dockerignore
================================================
# ignore hidden files
.*
# do not ignore .git, needed for versioning
!/.git
# do not ignore .rstcheck.cfg, needed to test building docs
!/.rstcheck.cfg
# ignore repo directories and files
docker/
gh-pages-template/
scripts/
tools/
crowdin.yml
# don't ignore linux build script
!scripts/linux_build.sh
# ignore dev directories
build/
cmake-*/
venv/
# ignore artifacts
artifacts/
================================================
FILE: .flake8
================================================
[flake8]
filename =
*.py,
*.pys
max-line-length = 120
extend-exclude =
venv/
================================================
FILE: .gitattributes
================================================
# ensure dockerfiles are checked out with LF line endings
Dockerfile text eol=lf
*.dockerfile text eol=lf
# ensure flatpak lint json files are checked out with LF line endings
*flatpak-lint-*.json text eol=lf
================================================
FILE: .github/FUNDING.yml
================================================
custom: [
"https://www.ifdian.net/a/qiin2333",
"https://www.ifdian.net/a/Yundi339"
]
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report_en.yml
================================================
name: "🐛 Bug Report (English)"
description: "Report a bug to help us improve"
title: "[Bug]: "
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
## 📋 Before You Submit
Thank you for taking the time to report this issue!
This project is **Foundation Sunshine**, a self-hosted game stream host for Moonlight.
**Please check before submitting:**
- [ ] I have searched existing issues to avoid duplicates
- [ ] This issue is specific to **Foundation Sunshine**, not other versions of Sunshine
- [ ] I have checked the [documentation](https://docs.qq.com/aio/DSGdQc3htbFJjSFdO?p=YTpMj5JNNdB5hEKJhhqlSB) for solutions
- [ ] I am using Windows 10/Windows 11 (Virtual Display feature requires Windows 10 22H2 or higher)
---
- type: dropdown
id: bug-type
attributes:
label: "🏷️ Bug Category"
description: "What type of bug is this?"
options:
- "📺 Video Streaming issues"
- "🎨 HDR Support issues"
- "🖥️ Virtual Display issues"
- "🎤 Remote Microphone issues"
- "🔊 Audio issues"
- "🌐 Network Connection issues"
- "🎮 Gamepad/Controller issues"
- "⚙️ Settings/Configuration issues"
- "💻 Web Control Panel issues"
- "💥 Crash/Freeze"
- "🔋 Performance/Encoding issues"
- "🔧 Pairing/Device Management issues"
- "❓ Other"
validations:
required: true
- type: textarea
id: describe-bug
attributes:
label: "📝 Bug Description"
description: "Describe the bug clearly and concisely. What happened? What did you expect to happen?"
placeholder: |
Example:
When I start streaming, the video output is black screen. The HDR display is enabled but the stream shows no content. I expect the stream to display the game content correctly.
validations:
required: true
- type: textarea
id: steps-reproduce
attributes:
label: "🔄 Steps to Reproduce"
description: "Provide detailed steps to reproduce the issue"
placeholder: |
1. Start Sunshine server
2. Connect from Moonlight client
3. Launch a game/application
4. Perform specific action that triggers the bug
5. Bug occurs
validations:
required: true
- type: textarea
id: affected-games
attributes:
label: "🎯 Affected Games/Apps"
description: "Which games or applications are affected? Does it happen in all games or specific ones?"
placeholder: |
- All games/applications
- Specific games (list them)
- Desktop streaming
- Only with HDR enabled
validations:
required: false
- type: dropdown
id: reproducibility
attributes:
label: "🔁 Reproducibility"
description: "How often can you reproduce this issue?"
options:
- "Always (100%)"
- "Often (>50%)"
- "Sometimes (<50%)"
- "Rarely (<10%)"
- "Only once"
validations:
required: false
- type: markdown
attributes:
value: |
---
## 🖥️ Host Server Information
- type: dropdown
id: host-os
attributes:
label: "💻 Host Operating System"
description: "Operating system running Sunshine (Only Windows 10/Windows 11 supported)"
options:
- "Windows 10"
- "Windows 11"
validations:
required: true
- type: input
id: os-version
attributes:
label: "📌 Windows Specific Version"
description: "Please get the specific Windows version from your system (e.g., Windows 10 22H2, Windows 11 23H2, Windows 10 LTSC 2021, etc.)"
placeholder: "e.g. Windows 10 22H2 / Windows 11 23H2 / Windows 10 LTSC 2021"
validations:
required: false
- type: input
id: sunshine-version
attributes:
label: "☀️ Sunshine Version"
description: "Sunshine server version"
placeholder: "e.g. v0.23.1 / commit hash"
validations:
required: true
- type: dropdown
id: gpu-vendor
attributes:
label: "🎨 GPU Vendor"
description: "Your GPU manufacturer"
options:
- "NVIDIA"
- "AMD"
- "Intel"
- "Other/Unknown"
validations:
required: true
- type: input
id: gpu-model
attributes:
label: "🎨 GPU Model & Driver"
description: "GPU model and driver version"
placeholder: "e.g. RTX 4090 / Driver 545.92"
validations:
required: false
- type: dropdown
id: encoder
attributes:
label: "🔧 Video Encoder"
description: "Which encoder is being used?"
options:
- "NVENC (NVIDIA)"
- "AMD VCE"
- "Intel QSV"
- "Software (x264/x265)"
- "Auto/Unknown"
validations:
required: false
- type: markdown
attributes:
value: |
---
## 📱 Client Information (Optional)
- type: input
id: client-device
attributes:
label: "📱 Client Device"
description: "Moonlight client device and version (if relevant)"
placeholder: "e.g. Android Moonlight V+ v12.5.1 / Windows Moonlight-QT / iOS VoidLink"
validations:
required: false
- type: markdown
attributes:
value: |
---
## 🔧 Configuration & Troubleshooting
- type: dropdown
id: settings-default
attributes:
label: "⚙️ Configuration Modified?"
description: "Have you changed any Sunshine settings from default?"
options:
- "No, using default settings"
- "Yes, configuration modified"
validations:
required: false
- type: textarea
id: settings-adjusted-settings
attributes:
label: "📋 Modified Configuration"
description: "If you modified settings, list them here (bitrate, encoder, HDR, display, etc.)"
validations:
required: false
- type: markdown
attributes:
value: |
---
## 📎 Additional Information
- type: textarea
id: screenshots
attributes:
label: "📸 Screenshots/Videos"
description: "If applicable, add screenshots or screen recordings to help explain the problem"
placeholder: "Drag and drop images/videos here"
validations:
required: false
- type: textarea
id: logs
attributes:
label: "📜 Log Output"
description: "If you have relevant log output, paste it here. Especially helpful for connection or crash issues"
render: shell
validations:
required: false
- type: textarea
id: additional
attributes:
label: "💬 Additional Information"
description: "What settings have been modified besides default settings?"
placeholder: |
Example:
- Modified settings: Resolution, bitrate, encoder, etc.
- Network: Local LAN / Internet / VPN
- Connection type: WiFi 6 / 5GHz / Ethernet
- Display: Resolution, refresh rate, multi-monitor setup
- HDR: Display model, HDR settings
- Controller: Xbox / PlayStation / Other
- Special software: Antivirus, firewall, other streaming software
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report_zh.yml
================================================
name: "🐛 问题报告(中文)"
description: "报告问题帮助我们改进"
title: "[Bug]: "
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
## 📋 提交前请注意
感谢您花时间报告这个问题!
此项目是 **Foundation Sunshine**,一个自托管的游戏串流服务器。
**提交前请检查**
- [ ] 我已搜索现有 issues,避免重复提交
- [ ] 此问题针对 **Foundation Sunshine**,不是其他版本的 Sunshine
- [ ] 我已查阅[使用文档](https://docs.qq.com/aio/DSGdQc3htbFJjSFdO?p=YTpMj5JNNdB5hEKJhhqlSB)寻找解决方案
- [ ] 我使用的是 Windows 10/Windows 11(虚拟显示器功能需要 Windows 10 22H2 及以上版本)
---
- type: dropdown
id: bug-type
attributes:
label: "🏷️ 问题类型"
description: "这是什么类型的问题?"
options:
- "📺 视频串流问题"
- "🎨 HDR 支持问题"
- "🖥️ 虚拟显示器问题"
- "🎤 远程麦克风问题"
- "🔊 音频问题"
- "🌐 网络连接问题"
- "🎮 手柄/控制器问题"
- "⚙️ 设置/配置问题"
- "💻 Web 控制面板问题"
- "💥 崩溃/卡死"
- "🔋 性能/编码问题"
- "🔧 配对/设备管理问题"
- "❓ 其他"
validations:
required: true
- type: textarea
id: describe-bug
attributes:
label: "📝 问题描述"
description: "清晰简洁地描述问题。发生了什么?您期望发生什么?"
placeholder: |
示例:
当我开始串流时,视频输出是黑屏。HDR 显示器已启用,但串流显示没有内容。我期望串流能正确显示游戏内容。
validations:
required: true
- type: textarea
id: steps-reproduce
attributes:
label: "🔄 复现步骤"
description: "提供详细的复现步骤"
placeholder: |
1. 启动 Sunshine 服务器
2. 从 Moonlight 客户端连接
3. 启动游戏/应用
4. 执行触发问题的特定操作
5. 问题出现
validations:
required: true
- type: textarea
id: affected-games
attributes:
label: "🎯 受影响的游戏/应用"
description: "哪些游戏或应用受到影响?是所有游戏都有问题还是特定游戏?"
placeholder: |
- 所有游戏/应用
- 特定游戏(请列出)
- 桌面串流
- 仅在启用 HDR 时
validations:
required: false
- type: dropdown
id: reproducibility
attributes:
label: "🔁 可复现性"
description: "多久能复现一次此问题?"
options:
- "总是发生 (100%)"
- "经常发生 (>50%)"
- "有时发生 (<50%)"
- "很少发生 (<10%)"
- "只发生过一次"
validations:
required: false
- type: markdown
attributes:
value: |
---
## 🖥️ 主机服务器信息
- type: dropdown
id: host-os
attributes:
label: "💻 主机操作系统"
description: "运行 Sunshine 的操作系统(仅支持 Windows 10/Windows 11)"
options:
- "Windows 10"
- "Windows 11"
validations:
required: true
- type: input
id: os-version
attributes:
label: "📌 Windows 具体版本"
description: "请从系统中获取 Windows 的具体版本信息(如:Windows 10 22H2、Windows 11 23H2、Windows 10 LTSC 2021 等)"
placeholder: "例如: Windows 10 22H2 / Windows 11 23H2 / Windows 10 LTSC 2021"
validations:
required: false
- type: input
id: sunshine-version
attributes:
label: "☀️ Sunshine 版本"
description: "Sunshine 服务器版本"
placeholder: "例如: v0.23.1 / commit hash"
validations:
required: true
- type: dropdown
id: gpu-vendor
attributes:
label: "🎨 显卡厂商"
description: "您的显卡制造商"
options:
- "NVIDIA"
- "AMD"
- "Intel"
- "其他/未知"
validations:
required: true
- type: input
id: gpu-model
attributes:
label: "🎨 显卡型号及驱动"
description: "显卡型号和驱动版本"
placeholder: "例如: RTX 4090 / 驱动 545.92"
validations:
required: false
- type: dropdown
id: encoder
attributes:
label: "🔧 视频编码器"
description: "使用哪个编码器?"
options:
- "NVENC (NVIDIA)"
- "AMD VCE"
- "Intel QSV"
- "软件编码 (x264/x265)"
- "自动/未知"
validations:
required: false
- type: markdown
attributes:
value: |
---
## 📱 客户端信息(可选)
- type: input
id: client-device
attributes:
label: "📱 客户端设备"
description: "Moonlight 客户端设备和版本(如相关)"
placeholder: "例如: Android Moonlight V+ v12.5.1 / Windows Moonlight-QT / iOS VoidLink"
validations:
required: false
- type: markdown
attributes:
value: |
---
## 🔧 配置与故障排除
- type: dropdown
id: settings-default
attributes:
label: "⚙️ 是否修改过配置?"
description: "您是否修改过默认配置?"
options:
- "否,使用默认设置"
- "是,已修改配置"
validations:
required: false
- type: textarea
id: settings-adjusted-settings
attributes:
label: "📋 已修改的配置"
description: "如果修改了设置,请列出(码率、编码器、HDR、显示器等)"
validations:
required: false
- type: markdown
attributes:
value: |
---
## 📎 附加信息
- type: textarea
id: screenshots
attributes:
label: "📸 截图/视频"
description: "如有必要,请添加截图或录屏来帮助说明问题"
placeholder: "在此处拖放图片/视频"
validations:
required: false
- type: textarea
id: logs
attributes:
label: "📜 日志输出"
description: "如有相关日志输出,请粘贴在此。对于连接或崩溃问题特别有帮助"
render: shell
validations:
required: false
- type: textarea
id: additional
attributes:
label: "💬 其他补充"
description: "除了默认设置外还修改了什么内容?"
placeholder: |
示例:
- 修改的设置: 分辨率、码率、编码器等
- 网络: 本地局域网 / 外网 / VPN
- 连接类型: WiFi 6 / 5GHz / 有线
- 显示器: 分辨率、刷新率、多显示器设置
- HDR: 显示器型号、HDR 设置
- 手柄: Xbox / PlayStation / 其他
- 特殊软件: 杀毒软件、防火墙、其他串流软件
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request_en.yml
================================================
name: "✨ Feature Request (English)"
description: "Suggest a new feature or improvement"
title: "[Feature]: "
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
## 💡 Feature Request
Thank you for taking the time to suggest a new feature!
This project is **Foundation Sunshine**, a self-hosted game stream host for Moonlight.
**⚠️ Important: This template is only for submitting Sunshine server-side feature requests. Client-side (Moonlight) issues should not be submitted here.**
**Please check before submitting:**
- [ ] I have searched existing issues and feature requests to avoid duplicates
- [ ] This feature is not already available in the latest version
- [ ] This feature is specific to the server-side (Sunshine), not the client-side (Moonlight)
- [ ] I am using Windows 10/Windows 11 (Virtual Display feature requires Windows 10 22H2 or higher)
---
- type: dropdown
id: feature-type
attributes:
label: "🏷️ Feature Category"
description: "What type of feature is this?"
options:
- "🎨 HDR Support"
- "🖥️ Virtual Display"
- "🎤 Remote Microphone"
- "📺 Video Encoding/Streaming"
- "🔊 Audio Processing"
- "🌐 Network/Connection"
- "💻 Web Control Panel"
- "⚙️ Configuration/Settings"
- "🔧 Device/Pairing Management"
- "🎮 Controller/Input Support"
- "🔋 Performance Optimization"
- "📊 Monitoring/Logging"
- "🔒 Security/Authentication"
- "❓ Other"
validations:
required: false
- type: dropdown
id: priority
attributes:
label: "📊 Priority"
description: "How important is this feature to you?"
options:
- "🔴 Critical - Can't use app without it"
- "🟠 High - Significantly improves experience"
- "🟡 Medium - Nice to have"
- "🟢 Low - Minor improvement"
validations:
required: false
- type: textarea
id: problem
attributes:
label: "😤 Problem Statement"
description: "Is your feature request related to a problem? Describe the frustration"
placeholder: |
Example:
When streaming ends, my game doesn't close and continues running in the background.
validations:
required: true
- type: textarea
id: solution
attributes:
label: "💡 Proposed Solution"
description: "Describe the solution you'd like. Be as specific as possible"
placeholder: |
Example:
I need a feature that can execute specified background commands when streaming ends. It would be much better if this feature could be supported.
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: "🔄 Alternative Solutions"
description: "Have you considered any alternative solutions or workarounds?"
placeholder: |
Example:
1. Use third-party scripts to execute commands when streaming ends
2. Implement similar functionality through Task Scheduler
3. Manually manage game processes
validations:
required: false
- type: textarea
id: use-case
attributes:
label: "🎯 Use Case"
description: "Describe a specific scenario where this feature would be useful"
placeholder: |
Example:
When streaming ends, I need to automatically close the game process to free up system resources. This feature would help me manage multiple streaming sessions more efficiently.
validations:
required: false
- type: dropdown
id: willing-to-test
attributes:
label: "🧪 Willing to Test?"
description: "Would you be willing to test this feature if implemented?"
options:
- "Yes, I can test and provide feedback"
- "Maybe, depends on timing"
- "No"
validations:
required: false
- type: markdown
attributes:
value: |
---
## 📎 Additional Information
- type: textarea
id: screenshots
attributes:
label: "📸 Mockups/References"
description: "Add mockups, sketches, or reference screenshots from other apps that have similar features"
placeholder: "Drag and drop images here"
validations:
required: false
- type: textarea
id: additional
attributes:
label: "💬 Additional Information"
description: "Log information, what settings have been modified besides default settings?"
placeholder: |
Example:
- Log level: Verbose/Debug
- Modified settings: Resolution, bitrate, encoder, etc.
validations:
required: false
- type: markdown
attributes:
value: |
---
## 🖥️ System Information (Optional)
- type: dropdown
id: host-os
attributes:
label: "💻 Host Operating System"
description: "Your host OS (Only Windows 10/Windows 11 supported)"
options:
- "Windows 10"
- "Windows 11"
validations:
required: false
- type: input
id: os-version
attributes:
label: "📌 Windows Specific Version"
description: "Please get the specific Windows version from your system (e.g., Windows 10 22H2, Windows 11 23H2, Windows 10 LTSC 2021, etc.)"
placeholder: "e.g. Windows 10 22H2 / Windows 11 23H2 / Windows 10 LTSC 2021"
validations:
required: false
- type: dropdown
id: gpu-vendor
attributes:
label: "🎨 GPU Vendor"
description: "Your GPU manufacturer (if relevant to the feature)"
options:
- "NVIDIA"
- "AMD"
- "Intel"
- "Not applicable"
- "Other/Unknown"
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request_zh.yml
================================================
name: "✨ 功能建议(中文)"
description: "建议新功能或改进"
title: "[Feature]: "
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
## 💡 功能建议
感谢您花时间提出新功能建议!
此项目是 **Foundation Sunshine**,一个自托管的游戏串流服务器。
**⚠️ 重要提示:此模板仅用于提交 Sunshine 服务器端的功能建议,客户端(Moonlight)相关问题请勿在此提交。**
**提交前请检查**
- [ ] 我已搜索现有 issues,避免重复
- [ ] 此功能在最新版本中尚不可用
- [ ] 此功能针对服务器端(Sunshine),而非客户端(Moonlight)
- [ ] 我使用的是 Windows 10/Windows 11(虚拟显示器功能需要 Windows 10 22H2 及以上版本)
---
- type: dropdown
id: feature-type
attributes:
label: "🏷️ 功能类别"
description: "这是什么类型的功能?"
options:
- "� 界面体验"
- "🎨 HDR 支持"
- "🖥️ 虚拟显示器"
- "🎤 远程麦克风"
- "📺 视频编码/串流"
- "🔊 音频处理"
- "🌐 网络/连接"
- "💻 控制面板"
- "⚙️ 配置/设置"
- "🔧 设备/配对管理"
- "🎮 控制器/输入支持"
- "🔋 性能优化"
- "📊 监控/日志"
- "🔒 安全/认证"
- "❓ 其他"
validations:
required: false
- type: dropdown
id: priority
attributes:
label: "📊 优先级"
description: "这个功能对您有多重要?"
options:
- "🔴 关键 - 没有它无法使用"
- "🟠 高 - 显著改善体验"
- "🟡 中 - 有了更好"
- "🟢 低 - 小改进"
validations:
required: false
- type: textarea
id: problem
attributes:
label: "😤 问题描述"
description: "您的功能请求是否与某个问题相关?请描述您遇到的困扰"
placeholder: |
示例:
当我串流结束时,我的游戏没有关闭,而是继续在后台运行。
validations:
required: true
- type: textarea
id: solution
attributes:
label: "💡 建议的解决方案"
description: "描述您希望的解决方案。请尽可能具体"
placeholder: |
示例:
我需要一个功能,当串流结束时,能够执行指定后台命令,如果能够支持这个功能会好得多。
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: "🔄 替代方案"
description: "您是否考虑过任何替代解决方案或变通办法?"
placeholder: |
示例:
1. 使用第三方脚本在串流结束时执行命令
2. 通过任务计划程序实现类似功能
3. 手动管理游戏进程
validations:
required: false
- type: textarea
id: use-case
attributes:
label: "🎯 使用场景"
description: "描述一个这个功能会很有用的具体场景"
placeholder: |
示例:
当串流结束时,我需要自动关闭游戏进程以释放系统资源。这个功能将帮助我更高效地管理多个串流会话。
validations:
required: false
- type: dropdown
id: willing-to-test
attributes:
label: "🧪 愿意测试吗?"
description: "如果实现了此功能,您愿意帮忙测试吗?"
options:
- "是,我可以测试并提供反馈"
- "也许,取决于时间"
- "否"
validations:
required: false
- type: markdown
attributes:
value: |
---
## 📎 附加信息
- type: textarea
id: screenshots
attributes:
label: "📸 效果图/参考"
description: "添加效果图、草图,或其他有类似功能的应用的参考截图"
placeholder: "在此处拖放图片"
validations:
required: false
- type: textarea
id: additional
attributes:
label: "💬 其他补充"
description: "日志信息、除了默认设置外还修改了什么内容?"
placeholder: |
示例:
- 日志级别: 详细/调试
- 修改的设置: 分辨率、码率、编码器等
validations:
required: false
- type: markdown
attributes:
value: |
---
## 🖥️ 系统信息(可选)
- type: dropdown
id: host-os
attributes:
label: "💻 主机操作系统"
description: "您的主机操作系统(仅支持 Windows 10/Windows 11)"
options:
- "Windows 10"
- "Windows 11"
validations:
required: false
- type: input
id: os-version
attributes:
label: "📌 Windows 具体版本"
description: "请从系统中获取 Windows 的具体版本信息(如:Windows 10 22H2、Windows 11 23H2、Windows 10 LTSC 2021 等)"
placeholder: "例如: Windows 10 22H2 / Windows 11 23H2 / Windows 10 LTSC 2021"
validations:
required: false
- type: dropdown
id: gpu-vendor
attributes:
label: "🎨 显卡厂商"
description: "您的显卡制造商(如与功能相关)"
options:
- "NVIDIA"
- "AMD"
- "Intel"
- "不适用"
- "其他/未知"
validations:
required: false
================================================
FILE: .github/RELEASE_TEMPLATE.md
================================================
## What's Changed
### ✨ New Features
* **feat:** 功能描述 by [@用户名](https://github.com/用户名) in [#PR号](https://github.com/qiin2333/Sunshine-Foundation/pull/PR号)
### 🔧 Improvements & Refactors
* **refactor:** 改进描述 by [@用户名](https://github.com/用户名) in [#PR号](https://github.com/qiin2333/Sunshine-Foundation/pull/PR号)
* **chore:** 任务描述 by [@用户名](https://github.com/用户名) in [#PR号](https://github.com/qiin2333/Sunshine-Foundation/pull/PR号)
### 🐛 Bug Fixes
* **fix:** 修复描述 by [@用户名](https://github.com/用户名) in [#PR号](https://github.com/qiin2333/Sunshine-Foundation/pull/PR号)
---
## ⚠️ 注意事项
* 版本特定的注意事项,例如驱动更新要求、配置变更等
---
## 🎉 New Contributors
* [@用户名](https://github.com/用户名) made their first contribution in [#PR号](https://github.com/qiin2333/Sunshine-Foundation/pull/PR号)
---
**Full Changelog**: https://github.com/qiin2333/Sunshine-Foundation/compare/PREVIOUS_TAG...CURRENT_TAG
---
## 👥 Contributors
| <a href="https://github.com/用户名"><img src="https://avatars.githubusercontent.com/用户名?s=80" width="80" height="80" alt="用户名"/><br/><sub><b>用户名</b></sub></a><br/><sub>合并次数 merges</sub> |
| :---: |
================================================
FILE: .github/workflows/main.yml
================================================
name: Build and Release
on:
pull_request:
branches:
- master
types:
- opened
- synchronize
- reopened
push:
branches:
- master
release:
types: [published]
workflow_dispatch:
concurrency:
group: '${{ github.workflow }}-${{ github.ref }}'
cancel-in-progress: true
jobs:
github_env:
name: GitHub Env Debug
runs-on: ubuntu-latest
steps:
- name: Dump github context
run: echo "$GITHUB_CONTEXT"
shell: bash
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
setup_release:
name: Setup Release
outputs:
publish_release: ${{ steps.setup_release_auto.outputs.publish_release || steps.setup_release_release.outputs.publish_release || steps.setup_release_manual.outputs.publish_release }}
release_body: ${{ steps.setup_release_auto.outputs.release_body || steps.setup_release_release.outputs.release_body || steps.setup_release_manual.outputs.release_body }}
release_commit: ${{ steps.setup_release_auto.outputs.release_commit || steps.setup_release_release.outputs.release_commit || steps.setup_release_manual.outputs.release_commit }}
release_generate_release_notes: ${{ steps.setup_release_auto.outputs.release_generate_release_notes || steps.setup_release_release.outputs.release_generate_release_notes || steps.setup_release_manual.outputs.release_generate_release_notes }}
release_tag: ${{ steps.setup_release_auto.outputs.release_tag || steps.setup_release_release.outputs.release_tag || steps.setup_release_manual.outputs.release_tag }}
release_version: ${{ steps.setup_release_auto.outputs.release_version || steps.setup_release_release.outputs.release_version || steps.setup_release_manual.outputs.release_version }}
permissions:
contents: write # read does not work to check squash and merge details
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Debug GitHub Event
run: |
echo "GitHub Event Name: ${{ github.event_name }}"
echo "Has commits field: ${{ contains(toJson(github.event), 'commits') }}"
- name: Setup Release (Auto)
id: setup_release_auto
if: github.event_name != 'workflow_dispatch' && github.event_name != 'release'
uses: LizardByte/setup-release-action@v2025.426.225
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Release (Release event)
id: setup_release_release
if: github.event_name == 'release'
env:
RELEASE_BODY: ${{ github.event.release.body }}
run: |
TAG="${{ github.event.release.tag_name }}"
SUFFIX=$([ "${{ github.event.release.target_commitish }}" = "master" ] && echo "" || echo "-dev")
echo "publish_release=true" >> $GITHUB_OUTPUT
{
echo "release_body<<RELEASE_BODY_EOF"
echo "$RELEASE_BODY"
echo "RELEASE_BODY_EOF"
} >> $GITHUB_OUTPUT
echo "release_commit=${{ github.event.release.target_commitish }}" >> $GITHUB_OUTPUT
echo "release_generate_release_notes=false" >> $GITHUB_OUTPUT
echo "release_tag=${TAG}${SUFFIX}" >> $GITHUB_OUTPUT
echo "release_version=${TAG}${SUFFIX}" >> $GITHUB_OUTPUT
- name: Setup Release (Manual)
id: setup_release_manual
if: github.event_name == 'workflow_dispatch'
run: |
SUFFIX=$([ "${{ github.ref_name }}" = "master" ] && echo "" || echo "-dev")
echo "publish_release=false" >> $GITHUB_OUTPUT
echo "release_body=Manual build (${{ github.ref_name }})" >> $GITHUB_OUTPUT
echo "release_commit=${{ github.sha }}" >> $GITHUB_OUTPUT
echo "release_generate_release_notes=false" >> $GITHUB_OUTPUT
echo "release_tag=manual-$(date +%Y%m%d-%H%M%S)${SUFFIX}" >> $GITHUB_OUTPUT
echo "release_version=manual-$(date +%Y%m%d-%H%M%S)${SUFFIX}" >> $GITHUB_OUTPUT
build_win:
name: Windows
needs: setup_release
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ github.event_name == 'release' && github.event.release.tag_name || github.sha }}
submodules: recursive
- name: Setup Dependencies Windows
uses: msys2/setup-msys2@v2
with:
msystem: ucrt64
update: true
install: >-
wget
curl
- name: Update Windows dependencies
env:
gcc_version: '15.1.0-5'
opus_version: '1.6.1-1'
shell: msys2 {0}
run: |
broken_deps=(
"mingw-w64-ucrt-x86_64-gcc"
"mingw-w64-ucrt-x86_64-gcc-libs"
)
tarballs=""
for dep in "${broken_deps[@]}"; do
tarball="${dep}-${gcc_version}-any.pkg.tar.zst"
# download and install working version
wget https://repo.msys2.org/mingw/ucrt64/${tarball}
tarballs="${tarballs} ${tarball}"
done
# download pinned opus version
opus_tarball="mingw-w64-ucrt-x86_64-opus-${opus_version}-any.pkg.tar.zst"
wget https://repo.msys2.org/mingw/ucrt64/${opus_tarball}
# install broken dependencies
if [ -n "$tarballs" ]; then
pacman -U --noconfirm ${tarballs}
fi
# install dependencies
dependencies=(
"git"
"mingw-w64-ucrt-x86_64-cmake"
"mingw-w64-ucrt-x86_64-ninja"
"mingw-w64-ucrt-x86_64-cppwinrt"
"mingw-w64-ucrt-x86_64-curl-winssl"
"mingw-w64-ucrt-x86_64-graphviz"
"mingw-w64-ucrt-x86_64-MinHook"
"mingw-w64-ucrt-x86_64-miniupnpc"
"mingw-w64-ucrt-x86_64-nlohmann-json"
# "mingw-w64-ucrt-x86_64-nodejs" # Replaced by actions/setup-node (vite 8 requires MSVC Node.js)
# "mingw-w64-ucrt-x86_64-nsis" # Replaced by Inno Setup
"mingw-w64-ucrt-x86_64-onevpl"
"mingw-w64-ucrt-x86_64-openssl"
"mingw-w64-ucrt-x86_64-toolchain"
"mingw-w64-ucrt-x86_64-autotools"
)
pacman -Syu --noconfirm --ignore="$(IFS=,; echo "${broken_deps[*]}")" "${dependencies[@]}"
# install pinned opus after Syu to prevent upgrade
pacman --noconfirm -U ${opus_tarball}
- name: Verify Build Tools
shell: msys2 {0}
run: |
echo "Verifying build tools are installed..."
which cmake || (echo "cmake not found" && exit 1)
which ninja || (echo "ninja not found" && exit 1)
which gcc || (echo "gcc not found" && exit 1)
echo "All build tools verified successfully"
echo " CMake: $(cmake --version | head -1)"
echo " Ninja: $(ninja --version)"
echo " GCC: $(gcc --version | head -1)"
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
- name: Cache npm dependencies
uses: actions/cache@v4
with:
path: node_modules
key: npm-${{ hashFiles('package.json') }}
- name: Build Web UI
shell: pwsh
run: |
npm install
New-Item -ItemType Directory -Force -Path build | Out-Null
$env:SUNSHINE_SOURCE_ASSETS_DIR = "${{ github.workspace }}\src_assets"
$env:SUNSHINE_ASSETS_DIR = "${{ github.workspace }}\build"
npm run build
- name: Build Windows
shell: msys2 {0}
env:
BRANCH: ${{ github.head_ref || github.ref_name }}
BUILD_VERSION: ${{ needs.setup_release.outputs.release_tag }}.杂鱼
COMMIT: ${{ needs.setup_release.outputs.release_commit }}
GITHUB_TOKEN: ${{ secrets.DRIVER_DOWNLOAD_TOKEN }}
run: |
mkdir -p build
cmake \
-B build \
-G Ninja \
-S . \
-DBUILD_DOCS=OFF \
-DBUILD_WEB_UI=OFF \
-DSUNSHINE_ASSETS_DIR=assets \
-DSUNSHINE_PUBLISHER_NAME='${{ github.repository_owner }}' \
-DSUNSHINE_PUBLISHER_WEBSITE='https://github.com/qiin2333/Sunshine-Foundation' \
-DSUNSHINE_PUBLISHER_ISSUE_URL='https://github.com/qiin2333/Sunshine-Foundation/issues'
ninja -C build
- name: Cache Inno Setup
id: inno-cache
uses: actions/cache@v4
with:
path: C:\Program Files (x86)\Inno Setup 6
key: inno-setup-6
- name: Install Inno Setup
if: steps.inno-cache.outputs.cache-hit != 'true'
shell: pwsh
run: |
# Download and install Inno Setup 6 (silent install)
$url = "https://jrsoftware.org/download.php/is.exe"
$installer = "$env:TEMP\innosetup.exe"
Invoke-WebRequest -Uri $url -OutFile $installer
Start-Process -FilePath $installer -ArgumentList '/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-' -Wait
- name: Add Inno Setup to PATH
shell: pwsh
run: |
echo "C:\Program Files (x86)\Inno Setup 6" >> $env:GITHUB_PATH
- name: Package Windows
shell: msys2 {0}
run: |
mkdir -p artifacts
cd build
# package - 生成 Inno Setup 安装包和 ZIP 便携版
# 先安装到 staging 目录
cmake --install . --prefix ./inno_staging
# 运行 Inno Setup 编译器
"/c/Program Files (x86)/Inno Setup 6/ISCC.exe" sunshine_installer.iss
# 生成 ZIP 便携版
cpack -G ZIP --config ./CPackConfig.cmake --verbose
# move
mv ./cpack_artifacts/Sunshine.exe ../artifacts/sunshine-windows-installer.exe
mv ./cpack_artifacts/Sunshine.zip ../artifacts/sunshine-windows-portable.zip
- name: Generate Checksums
shell: pwsh
run: |
# 生成 SHA256 校验和
.\scripts\generate-checksums.ps1 -Path .\artifacts -Output "SHA256SUMS.txt"
- name: Package Windows Debug Info
working-directory: build
run: |
# use .dbg file extension for binaries to avoid confusion with real packages
Get-ChildItem -File -Recurse | `
% { Rename-Item -Path $_.PSPath -NewName $_.Name.Replace(".exe",".dbg") }
# save the binaries with debug info
7z -r `
"-xr!CMakeFiles" `
"-xr!cpack_artifacts" `
a "../artifacts/sunshine-win32-debuginfo.7z" "*.dbg"
- name: Rename release assets
shell: msys2 {0}
run: |
# Format tag to vYEAR.DATE where DATE is zero-padded to 4 digits
TAG="${{ needs.setup_release.outputs.release_tag }}"
NEWTAG="$TAG"
if [[ "$TAG" =~ ^v([0-9]{4})\.([0-9]+) ]]; then
YEAR="${BASH_REMATCH[1]}"
DATE_PART="${BASH_REMATCH[2]}"
DATE_PADDED=$(printf "%04d" "$DATE_PART")
NEWTAG="v${YEAR}.${DATE_PADDED}"
fi
# 重命名安装包和便携版
mv artifacts/sunshine-windows-installer.exe "artifacts/Sunshine.${NEWTAG}.WindowsInstaller.exe"
mv artifacts/sunshine-windows-portable.zip "artifacts/Sunshine.${NEWTAG}.WindowsPortable.zip"
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: sunshine-windows-r${{ github.run_number }}
path: |
artifacts/Sunshine.*.WindowsInstaller.exe
artifacts/Sunshine.*.WindowsPortable.zip
artifacts/SHA256SUMS.txt
artifacts/checksums.json
if-no-files-found: error
- name: Create/Update GitHub Release
if: needs.setup_release.outputs.publish_release == 'true'
uses: LizardByte/create-release-action@v2025.426.1549
with:
allowUpdates: true
body: ${{ needs.setup_release.outputs.release_body }}
generateReleaseNotes: ${{ needs.setup_release.outputs.release_generate_release_notes }}
name: ${{ needs.setup_release.outputs.release_tag }}.杂鱼
prerelease: true
tag: ${{ needs.setup_release.outputs.release_tag }}.杂鱼
token: ${{ secrets.GH_BOT_TOKEN }}
================================================
FILE: .github/workflows/sign-and-repackage.yml
================================================
# 签名并重新打包工作流(仅用于正式发布版本)
# 流程:
# 1. 编译当前分支的代码(只编译一次)
# 2. 生成未签名的 ZIP 和 Inno Setup staging 目录
# 3. 将所有 EXE/DLL 文件提交到 SignPath 签名
# 4. 用签名文件重新打包 ZIP 便携版
# 5. 用签名文件替换 Inno Setup staging 目录中的文件并重新打包
# 6. 签名最终的 Inno Setup 安装包
# 注意:只在正式发布(非预发布)时运行,确保代码版本和签名文件一致
name: Sign and Repackage (Release Only)
on:
release:
types: [published]
workflow_dispatch:
inputs:
ref:
description: "Branch or tag to checkout (e.g., master, v2025.1116)"
required: true
default: "master"
release-tag:
description: "Release tag for naming the output files"
required: true
jobs:
sign-and-repackage:
name: Sign Files and Repackage
runs-on: windows-latest
# 只在正式发布时运行(不是预发布)
if: ${{ (github.event_name == 'release' && !github.event.release.prerelease) || github.event_name == 'workflow_dispatch' }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.ref || github.ref }}
submodules: recursive
- name: Setup Dependencies Windows
uses: msys2/setup-msys2@v2
with:
msystem: ucrt64
update: true
install: >-
wget
- name: Update Windows dependencies
env:
gcc_version: '15.1.0-5'
shell: msys2 {0}
run: |
broken_deps=(
"mingw-w64-ucrt-x86_64-gcc"
"mingw-w64-ucrt-x86_64-gcc-libs"
)
tarballs=""
for dep in "${broken_deps[@]}"; do
tarball="${dep}-${gcc_version}-any.pkg.tar.zst"
# download and install working version
wget https://repo.msys2.org/mingw/ucrt64/${tarball}
tarballs="${tarballs} ${tarball}"
done
# install broken dependencies
if [ -n "$tarballs" ]; then
pacman -U --noconfirm ${tarballs}
fi
# install dependencies
dependencies=(
"git"
"mingw-w64-ucrt-x86_64-cmake"
"mingw-w64-ucrt-x86_64-ninja"
"mingw-w64-ucrt-x86_64-cppwinrt"
"mingw-w64-ucrt-x86_64-curl-winssl"
"mingw-w64-ucrt-x86_64-graphviz"
"mingw-w64-ucrt-x86_64-MinHook"
"mingw-w64-ucrt-x86_64-miniupnpc"
"mingw-w64-ucrt-x86_64-nlohmann-json"
"mingw-w64-ucrt-x86_64-nodejs"
# "mingw-w64-ucrt-x86_64-nsis" # Replaced by Inno Setup
"mingw-w64-ucrt-x86_64-onevpl"
"mingw-w64-ucrt-x86_64-openssl"
"mingw-w64-ucrt-x86_64-opus"
"mingw-w64-ucrt-x86_64-toolchain"
)
# Note: mingw-w64-ucrt-x86_64-rust conflicts with fixed gcc-15.1.0-5
# We install Rust via rustup in a separate step
pacman -Syu --noconfirm --ignore="$(IFS=,; echo "${broken_deps[*]}")" "${dependencies[@]}"
- name: Install Rust (for Tauri GUI)
shell: msys2 {0}
run: |
echo "Installing Rust via rustup..."
# Rust installs to Windows user directory
WINDOWS_USER=$(cmd //c "echo %USERNAME%" | tr -d '\r')
CARGO_BIN="/c/Users/${WINDOWS_USER}/.cargo/bin"
export PATH="$CARGO_BIN:$PATH"
# Check if cargo already exists
if command -v cargo &> /dev/null; then
echo "Rust already installed: $(cargo --version)"
else
# Download and install rustup
curl --proto '=https' --tlsv1.2 -sSf https://win.rustup.rs/x86_64 -o /tmp/rustup-init.exe
/tmp/rustup-init.exe -y --default-toolchain stable --profile minimal
# Refresh PATH
sleep 3
export PATH="$CARGO_BIN:$PATH"
# Verify installation
if [ -f "$CARGO_BIN/cargo.exe" ]; then
echo "Rust installed successfully: $(cargo --version)"
else
echo "Warning: Rust installed but cargo not found at $CARGO_BIN"
exit 1
fi
fi
- name: Verify Build Tools
shell: msys2 {0}
run: |
echo "Verifying build tools are installed..."
which cmake || (echo "cmake not found" && exit 1)
which ninja || (echo "ninja not found" && exit 1)
which gcc || (echo "gcc not found" && exit 1)
# verify Rust is in PATH
WINDOWS_USER=$(cmd //c "echo %USERNAME%" | tr -d '\r')
CARGO_BIN="/c/Users/${WINDOWS_USER}/.cargo/bin"
export PATH="$CARGO_BIN:$PATH"
which cargo || (echo "cargo not found" && exit 1)
echo "All build tools verified successfully"
echo " CMake: $(cmake --version | head -1)"
echo " Ninja: $(ninja --version)"
echo " GCC: $(gcc --version | head -1)"
echo " Cargo: $(cargo --version)"
- name: Build Windows
shell: msys2 {0}
env:
BRANCH: master
BUILD_VERSION: ${{ github.event_name == 'release' && github.event.release.tag_name || github.event.inputs.release-tag }}.杂鱼
COMMIT: ${{ github.sha }}
run: |
# add Rust to PATH for Tauri GUI build
WINDOWS_USER=$(cmd //c "echo %USERNAME%" | tr -d '\r')
CARGO_BIN="/c/Users/${WINDOWS_USER}/.cargo/bin"
export PATH="$CARGO_BIN:$PATH"
mkdir -p build
cmake \
-B build \
-G Ninja \
-S . \
-DBUILD_DOCS=OFF \
-DSUNSHINE_ASSETS_DIR=assets \
-DSUNSHINE_PUBLISHER_NAME='${{ github.repository_owner }}' \
-DSUNSHINE_PUBLISHER_WEBSITE='https://github.com/qiin2333/Sunshine-Foundation' \
-DSUNSHINE_PUBLISHER_ISSUE_URL='https://github.com/qiin2333/Sunshine-Foundation/issues'
ninja -C build
ninja -C build sunshine-control-panel
# Install Inno Setup
- name: Install Inno Setup
shell: pwsh
run: |
$url = "https://jrsoftware.org/download.php/is.exe"
$installer = "$env:TEMP\innosetup.exe"
Invoke-WebRequest -Uri $url -OutFile $installer
Start-Process -FilePath $installer -ArgumentList '/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-' -Wait
echo "C:\Program Files (x86)\Inno Setup 6" >> $env:GITHUB_PATH
# 生成未签名的打包产物
- name: Package unsigned files
shell: msys2 {0}
run: |
cd build
# 生成 ZIP 便携版(包含所有文件)
cpack -G ZIP --verbose
# 生成 Inno Setup staging 目录
echo "Generating Inno Setup staging directory..."
cmake --install . --prefix ./inno_staging
cd ..
# 列出生成的文件
echo "Generated files:"
ls -lh build/cpack_artifacts/
# 解压 Portable ZIP 获取所有需要签名的文件
- name: Extract files for signing
shell: bash
run: |
PORTABLE=$(find build/cpack_artifacts -name "*.zip" | head -n 1)
if [ -n "$PORTABLE" ]; then
echo "Extracting: $PORTABLE"
mkdir -p unsigned-files
7z x "$PORTABLE" -o"unsigned-files" -y -aoa
echo "Extracted files for signing:"
ls -laR unsigned-files/
else
echo "No portable ZIP found"
exit 1
fi
# 上传所有未签名的文件到 SignPath
- name: Upload unsigned files for signing
id: upload-unsigned
uses: actions/upload-artifact@v4
with:
name: files-for-signing
path: unsigned-files/
# 提交到 SignPath 签名(使用生产策略)
- name: Submit to SignPath for signing
uses: signpath/github-action-submit-signing-request@v1
with:
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }}
project-slug: Sunshine-Foundation
signing-policy-slug: release-signing
artifact-configuration-slug: windows-portable
github-artifact-id: "${{ steps.upload-unsigned.outputs.artifact-id }}"
output-artifact-directory: signed-files
wait-for-completion: true
wait-for-completion-timeout-in-seconds: 600
service-unavailable-timeout-in-seconds: 600
# 验证签名
- name: Verify all signatures
shell: pwsh
run: |
Write-Host "Verifying signatures..."
$signedFiles = Get-ChildItem -Path "signed-files" -Recurse -File -Include *.exe,*.dll
foreach ($file in $signedFiles) {
Write-Host "`n=== $($file.Name) ==="
$signature = Get-AuthenticodeSignature $file.FullName
Write-Host "Status: $($signature.Status)"
if ($signature.Status -ne "Valid") {
Write-Error "Signature invalid for: $($file.Name)"
exit 1
}
}
Write-Host "`n✓ All signatures are VALID!" -ForegroundColor Green
# 使用签名后的文件重新打包 ZIP 便携版
- name: Repackage signed Portable ZIP
shell: bash
run: |
cd signed-files
# 使用与输入一致的版本号
if [ -n "${{ github.event.inputs.release-tag }}" ]; then
VERSION="${{ github.event.inputs.release-tag }}"
elif [ -n "${{ github.event.release.tag_name }}" ]; then
VERSION="${{ github.event.release.tag_name }}"
else
VERSION="v$(date +%Y.%m%d)"
fi
7z a "../Sunshine-${VERSION}-Windows-Portable-Signed.zip" * -y
cd ..
echo "Created signed portable package:"
ls -lh Sunshine-*-Portable-Signed.zip
# 使用签名文件重新打包 Inno Setup 安装包
- name: Repackage signed Inno Setup installer
shell: msys2 {0}
run: |
echo "Repackaging Inno Setup installer with signed files..."
STAGING_DIR="build/inno_staging"
# 检查 staging 目录是否存在
if [ ! -d "$STAGING_DIR" ]; then
echo "Error: Inno Setup staging directory not found: $STAGING_DIR"
ls -laR build/
exit 1
fi
# 替换为签名后的文件
SIGNED_SRC="signed-files/Sunshine"
echo "Replacing with signed files..."
cp -fv "$SIGNED_SRC/sunshine.exe" "$STAGING_DIR/sunshine.exe"
cp -fv "$SIGNED_SRC/zlib1.dll" "$STAGING_DIR/zlib1.dll"
cp -fv "$SIGNED_SRC/tools/sunshinesvc.exe" "$STAGING_DIR/tools/sunshinesvc.exe"
cp -fv "$SIGNED_SRC/tools/qiin-tabtip.exe" "$STAGING_DIR/tools/qiin-tabtip.exe"
cp -fv "$SIGNED_SRC/tools/device-toggler.exe" "$STAGING_DIR/tools/device-toggler.exe"
cp -fv "$SIGNED_SRC/tools/DevManView.exe" "$STAGING_DIR/tools/DevManView.exe"
cp -fv "$SIGNED_SRC/tools/restart64.exe" "$STAGING_DIR/tools/restart64.exe"
cp -fv "$SIGNED_SRC/tools/SetDpi.exe" "$STAGING_DIR/tools/SetDpi.exe"
cp -fv "$SIGNED_SRC/tools/setreg.exe" "$STAGING_DIR/tools/setreg.exe"
cp -fv "$SIGNED_SRC/tools/audio-info.exe" "$STAGING_DIR/tools/audio-info.exe"
cp -fv "$SIGNED_SRC/tools/dxgi-info.exe" "$STAGING_DIR/tools/dxgi-info.exe"
cp -fv "$SIGNED_SRC/assets/gui/sunshine-gui.exe" "$STAGING_DIR/assets/gui/sunshine-gui.exe"
# 运行 Inno Setup 编译器重新打包
echo "Running ISCC to repackage installer..."
"/c/Program Files (x86)/Inno Setup 6/ISCC.exe" "build/sunshine_installer.iss"
# 使用与 Portable ZIP 一致的版本号
if [ -n "${{ github.event.inputs.release-tag }}" ]; then
VERSION="${{ github.event.inputs.release-tag }}"
elif [ -n "${{ github.event.release.tag_name }}" ]; then
VERSION="${{ github.event.release.tag_name }}"
else
VERSION="v$(date +%Y.%m%d)"
fi
mv -fv "build/cpack_artifacts/Sunshine.exe" "Sunshine-${VERSION}-Windows-Installer-Signed.exe"
echo "Created signed installer:"
ls -lh Sunshine-*-Installer-Signed.exe
# 签名最终的 Inno Setup 安装包
- name: Upload installer for final signing
id: upload-installer
uses: actions/upload-artifact@v4
with:
name: installer-for-final-signing
path: Sunshine-*-Installer-Signed.exe
- name: Sign installer
uses: signpath/github-action-submit-signing-request@v1
with:
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }}
project-slug: Sunshine-Foundation
signing-policy-slug: release-signing
artifact-configuration-slug: windows-installer
github-artifact-id: "${{ steps.upload-installer.outputs.artifact-id }}"
output-artifact-directory: final-signed
wait-for-completion: true
wait-for-completion-timeout-in-seconds: 600
service-unavailable-timeout-in-seconds: 600
# 验证最终签名
- name: Verify final installer signature
shell: pwsh
run: |
$installer = Get-ChildItem "final-signed" -Filter "*.exe" | Select-Object -First 1
if ($installer) {
Write-Host "Verifying installer signature..."
$signature = Get-AuthenticodeSignature $installer.FullName
Write-Host "Status: $($signature.Status)"
if ($signature.Status -eq "Valid") {
Write-Host "✓ Installer signature is VALID!" -ForegroundColor Green
}
}
# 上传最终的签名文件
- name: Upload final signed packages
uses: actions/upload-artifact@v4
with:
name: sunshine-windows-fully-signed
path: |
Sunshine-*-Portable-Signed.zip
final-signed/*.exe
if-no-files-found: error
# 发布到 GitHub Release
- name: Create Release
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ github.event_name == 'release' && github.event.release.tag_name || github.event.inputs.release-tag }}
name: ${{ github.event_name == 'release' && github.event.release.name || github.event.inputs.release-tag }} (Signed)
files: |
Sunshine-*-Portable-Signed.zip
final-signed/*.exe
draft: true
prerelease: true
allowUpdates: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/test-signpath.yml
================================================
# SignPath 测试工作流
# 用于手动测试 SignPath 签名功能
name: Test SignPath Signing
on:
workflow_dispatch:
inputs:
artifact-name:
description: 'Artifact name to sign'
required: false
default: 'sunshine-windows'
run-id:
description: 'Run ID to download artifact from (leave empty for latest)'
required: false
jobs:
test-sign:
name: Test SignPath
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
# 如果提供了 run-id,从指定的 run 下载
- name: Download specific artifact
if: ${{ github.event.inputs.run-id != '' }}
uses: actions/download-artifact@v4
with:
name: ${{ github.event.inputs.artifact-name }}
path: artifacts
run-id: ${{ github.event.inputs.run-id }}
github-token: ${{ secrets.GITHUB_TOKEN }}
# 如果没有提供 run-id,尝试从最近的成功构建下载
- name: Download latest artifact
if: ${{ github.event.inputs.run-id == '' }}
uses: dawidd6/action-download-artifact@v3
with:
workflow: main.yml
name: ${{ github.event.inputs.artifact-name }}
path: artifacts
check_artifacts: true
search_artifacts: true
- name: List downloaded files
shell: bash
run: |
echo "Downloaded files:"
ls -lR artifacts/
# 查找文件
- name: Find installer file
id: find-installer
shell: bash
run: |
INSTALLER=$(find artifacts -name "*.exe" -name "*Installer*" | head -n 1)
if [ -z "$INSTALLER" ]; then
echo "No installer found"
echo "has-installer=false" >> $GITHUB_OUTPUT
else
echo "Found installer: $INSTALLER"
echo "installer-file=$INSTALLER" >> $GITHUB_OUTPUT
echo "has-installer=true" >> $GITHUB_OUTPUT
fi
- name: Find portable file
id: find-portable
shell: bash
run: |
PORTABLE=$(find artifacts -name "*.zip" -name "*Portable*" | head -n 1)
if [ -z "$PORTABLE" ]; then
echo "No portable package found"
echo "has-portable=false" >> $GITHUB_OUTPUT
else
echo "Found portable: $PORTABLE"
echo "portable-file=$PORTABLE" >> $GITHUB_OUTPUT
echo "has-portable=true" >> $GITHUB_OUTPUT
fi
# 解压 Portable ZIP 以减少一层嵌套
- name: Extract Portable ZIP
if: ${{ steps.find-portable.outputs.has-portable == 'true' }}
shell: bash
run: |
mkdir -p artifacts/portable-extracted
7z x "${{ steps.find-portable.outputs.portable-file }}" -o"artifacts/portable-extracted"
echo "Extracted portable files:"
ls -laR artifacts/portable-extracted/
# 为 Installer 创建单独的 artifact
- name: Upload Installer for SignPath
id: upload-installer
if: ${{ steps.find-installer.outputs.has-installer == 'true' }}
uses: actions/upload-artifact@v4
with:
name: installer-for-signing
path: ${{ steps.find-installer.outputs.installer-file }}
# 为 Portable 创建单独的 artifact(上传解压后的文件夹)
- name: Upload Portable for SignPath
id: upload-portable
if: ${{ steps.find-portable.outputs.has-portable == 'true' }}
uses: actions/upload-artifact@v4
with:
name: portable-for-signing
path: artifacts/portable-extracted/
# 测试签名 - Installer
- name: Test SignPath - Installer
if: ${{ steps.find-installer.outputs.has-installer == 'true' }}
uses: signpath/github-action-submit-signing-request@v1
with:
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }}
project-slug: Sunshine-Foundation
signing-policy-slug: test-signing
artifact-configuration-slug: windows-installer
github-artifact-id: '${{ steps.upload-installer.outputs.artifact-id }}'
output-artifact-directory: artifacts/signed/installer
wait-for-completion: true
wait-for-completion-timeout-in-seconds: 600
service-unavailable-timeout-in-seconds: 600
# 测试签名 - Portable
- name: Test SignPath - Portable
if: ${{ steps.find-portable.outputs.has-portable == 'true' }}
uses: signpath/github-action-submit-signing-request@v1
with:
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }}
project-slug: Sunshine-Foundation
signing-policy-slug: test-signing
artifact-configuration-slug: windows-portable
github-artifact-id: '${{ steps.upload-portable.outputs.artifact-id }}'
output-artifact-directory: artifacts/signed/portable
wait-for-completion: true
wait-for-completion-timeout-in-seconds: 600
service-unavailable-timeout-in-seconds: 600
# 列出签名后的文件
- name: List signed files
shell: bash
run: |
echo "Signed files:"
if [ -d "artifacts/signed" ]; then
ls -laR artifacts/signed/
else
echo "No signed files directory found"
fi
# 验证签名
- name: Verify Signatures
shell: pwsh
run: |
if (Test-Path "artifacts/signed") {
Write-Host "Verifying signatures..."
# 递归搜索所有签名文件
$signedFiles = Get-ChildItem -Path "artifacts/signed" -Recurse -File
if ($signedFiles.Count -eq 0) {
Write-Warning "No signed files found"
} else {
Write-Host "Found $($signedFiles.Count) signed file(s)"
foreach ($file in $signedFiles) {
Write-Host "`n=== Checking: $($file.Name) ==="
Write-Host "Path: $($file.FullName)"
$signature = Get-AuthenticodeSignature $file.FullName
Write-Host "Status: $($signature.Status)"
if ($signature.SignerCertificate) {
Write-Host "Signer: $($signature.SignerCertificate.Subject)"
}
if ($signature.TimeStamperCertificate) {
Write-Host "Timestamp: $($signature.TimeStamperCertificate.Subject)"
}
if ($signature.Status -eq "Valid") {
Write-Host "✓ Signature is VALID" -ForegroundColor Green
} elseif ($signature.Status -eq "NotSigned") {
Write-Warning "⚠ File is NOT SIGNED"
} else {
Write-Warning "⚠ Signature status: $($signature.Status)"
}
}
}
} else {
Write-Warning "Signed files directory not found"
}
# 上传已签名的文件
- name: Upload Signed Files
uses: actions/upload-artifact@v4
with:
name: signpath-test-signed
path: artifacts/signed/
if-no-files-found: warn
================================================
FILE: .github/workflows/translate-simple.yml
================================================
name: Simple README Translation
on:
push:
branches:
- master
paths:
- 'README.md'
workflow_dispatch:
jobs:
translate-simple:
name: Simple README Translation
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- name: Checkout
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.9'
- name: Install translation dependencies
run: |
pip install requests
- name: Create translation script
run: |
cat > translate_simple.py << 'EOF'
import os
import re
import requests
# 项目名和术语保护列表
PROTECTED_TERMS = [
'Sunshine', 'README', 'GitHub', 'CI', 'API', 'Markdown', 'OpenAI', 'DeepL', 'Google Translate',
# 可在此添加更多术语
]
def mask_terms(text):
for term in PROTECTED_TERMS:
text = re.sub(rf'(?<![`\w]){re.escape(term)}(?![`\w])', f'@@@{term}@@@', text)
return text
def unmask_terms(text):
for term in PROTECTED_TERMS:
text = text.replace(f'@@@{term}@@@', term)
return text
def translate_with_deepseek(text, target_lang):
# 使用 DeepSeek API 进行翻译
api_key = os.getenv('DEEPSEEK_API_KEY')
if not api_key:
raise Exception('DEEPSEEK_API_KEY 环境变量未设置')
url = 'https://api.deepseek.com/v1/chat/completions'
prompt = f"请将以下 Markdown 内容翻译为{target_lang},但不要翻译项目名和术语:{', '.join(PROTECTED_TERMS)}。保持原有格式、链接和图片。\n\n{text}"
headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
}
payload = {
"model": "deepseek-chat",
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.2
}
resp = requests.post(url, headers=headers, json=payload)
resp.raise_for_status()
result = resp.json()
return result['choices'][0]['message']['content']
def translate_readme():
with open('README.md', 'r', encoding='utf-8') as f:
content = f.read()
languages = [
('en', 'English'),
('fr', 'French'),
('de', 'German'),
('ja', 'Japanese')
]
for lang_code, lang_name in languages:
try:
if lang_code == 'zh_CN':
translated_content = content
else:
masked = mask_terms(content)
translated = translate_with_deepseek(masked, lang_name)
translated = unmask_terms(translated)
# 去除 DeepSeek 返回的多余提示,只保留第一个 Markdown 标题及后面内容
lines = translated.splitlines()
for idx, line in enumerate(lines):
if line.strip().startswith('#'):
translated_content = '\n'.join(lines[idx:])
break
else:
translated_content = translated.strip()
filename = f'README.{lang_code}.md'
with open(filename, 'w', encoding='utf-8') as f:
f.write(translated_content)
print(f"✓ Translated to {lang_name} ({lang_code})")
except Exception as e:
print(f"✗ Failed to translate to {lang_name}: {e}")
if __name__ == "__main__":
translate_readme()
EOF
- name: Run translation
env:
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
run: python translate_simple.py
- name: Add language selector to README
run: |
# Check if language selector already exists
if grep -q "多语言支持" README.md; then
echo "Language selector already exists, skipping..."
else
# Create a backup of the original README
cp README.md README.md.backup
# Create the language selector content
cat > language_selector.md << 'EOF'
## 🌐 多语言支持 / Multi-language Support
<div align="center">
[](README.en.md)
[](README.md)
[](README.fr.md)
[](README.de.md)
[](README.ja.md)
</div>
---
EOF
# Insert language selector after the first line (title)
head -n 1 README.md > README.md.new
cat language_selector.md >> README.md.new
tail -n +2 README.md >> README.md.new
# Replace the original file
mv README.md.new README.md
# Clean up
rm language_selector.md
echo "✓ Added language selector to main README"
fi
- name: Create Pull Request
uses: peter-evans/create-pull-request@v5
with:
token: ${{ secrets.GITHUB_TOKEN }}
title: "docs: add multi-language README translations with language selector"
body: |
## 自动翻译更新
此PR包含以下语言的README翻译:
- English (en)
- French (fr)
- German (de)
- Japanese (ja)
### 翻译说明
- 使用Google Translate API自动翻译
- 保持原始Markdown格式
- 保留所有链接和图片
- 建议人工检查翻译质量
### 生成的文件
- `README.en.md` - 英语版本
- `README.fr.md` - 法语版本
- `README.de.md` - 德语版本
- `README.ja.md` - 日语版本
### 新增功能
- 在主README文件中添加了语言选择器
- 用户可以通过徽章快速访问不同语言版本
- 支持5种语言的快速切换
---
*此PR由CI自动生成,当README.md文件更新时触发*
branch: docs/translations
delete-branch: true
commit-message: "docs: add multi-language README translations with language selector [skip ci]"
- name: Create summary
run: |
echo "## Translation Summary" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "The following README translations were generated:" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
for file in README.*.md; do
if [ -f "$file" ]; then
lang=$(echo $file | sed 's/README\.\(.*\)\.md/\1/')
echo "- $lang" >> $GITHUB_STEP_SUMMARY
fi
done
echo "" >> $GITHUB_STEP_SUMMARY
echo "✓ Language selector added to main README" >> $GITHUB_STEP_SUMMARY
================================================
FILE: .github/workflows/update-driver-versions.yml
================================================
# Update driver version pins in cmake/packaging/FetchDriverDeps.cmake
#
# Driver binaries are no longer committed to the repo.
# CMake downloads them at configure time from GitHub Releases.
# This workflow updates the version pins and creates a PR.
name: Update Driver Versions
on:
workflow_dispatch:
inputs:
component:
description: 'Which driver to update'
required: true
type: choice
options:
- vmouse
- vdd
- nefcon
- all
version:
description: 'Release tag (e.g. v1.1.0). Leave empty for latest.'
required: false
default: ''
type: string
repository_dispatch:
types: [driver-release]
jobs:
update-version:
name: Update Driver Version Pin
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Resolve versions and update pins
shell: bash
env:
GH_TOKEN: ${{ github.token }}
run: |
CMAKE_FILE="cmake/packaging/FetchDriverDeps.cmake"
COMPONENT="${{ github.event.inputs.component }}"
VERSION="${{ github.event.inputs.version }}"
# Override with repository_dispatch values
if [ "${{ github.event_name }}" = "repository_dispatch" ]; then
COMPONENT="${{ github.event.client_payload.component }}"
VERSION="${{ github.event.client_payload.version }}"
echo "Triggered by repository_dispatch: component=$COMPONENT version=$VERSION"
fi
resolve_latest() {
local repo="$1"
local tag
tag=$(gh api "repos/${repo}/releases/latest" --jq '.tag_name' 2>/dev/null || echo "")
echo "$tag"
}
update_pin() {
local var_name="$1"
local new_version="$2"
if [ -z "$new_version" ]; then
echo "Warning: empty version for ${var_name}, skipping"
return
fi
echo "Updating ${var_name} to ${new_version}"
sed -i "s|set(${var_name} \"[^\"]*\"|set(${var_name} \"${new_version}\"|" "$CMAKE_FILE"
}
declare -A REPOS=(
[vmouse]="AlkaidLab/ZakoVirtualMouse"
[vdd]="qiin2333/zako-vdd"
[nefcon]="nefarius/nefcon"
)
declare -A VARS=(
[vmouse]="VMOUSE_DRIVER_VERSION"
[vdd]="VDD_DRIVER_VERSION"
[nefcon]="NEFCON_VERSION"
)
if [ "$COMPONENT" = "all" ]; then
COMPONENTS=(vmouse vdd nefcon)
else
COMPONENTS=("$COMPONENT")
fi
SUMMARY=""
for comp in "${COMPONENTS[@]}"; do
repo="${REPOS[$comp]}"
var="${VARS[$comp]}"
ver="$VERSION"
if [ -z "$ver" ]; then
ver=$(resolve_latest "$repo")
fi
if [ -n "$ver" ]; then
update_pin "$var" "$ver"
SUMMARY="${SUMMARY}\n- ${comp}: ${ver}"
else
echo "Warning: could not resolve version for ${comp}"
fi
done
echo "SUMMARY<<EOF" >> "$GITHUB_ENV"
echo -e "$SUMMARY" >> "$GITHUB_ENV"
echo "EOF" >> "$GITHUB_ENV"
echo "Updated CMake file:"
grep -E "^set\((VMOUSE_DRIVER_VERSION|VDD_DRIVER_VERSION|NEFCON_VERSION)" "$CMAKE_FILE"
- name: Create PR
uses: peter-evans/create-pull-request@v6
with:
commit-message: "chore: update driver version pins"
title: "Update driver versions"
body: |
Automated update of driver version pins in `FetchDriverDeps.cmake`.
Updated versions:
${{ env.SUMMARY }}
CMake will download the new driver binaries at configure time.
branch: update-driver-versions
delete-branch: true
================================================
FILE: .gitignore
================================================
# Prerequisites
*.d
# Compiled Object files
*.slo
*.lo
*.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
# Fortran module files
*.mod
*.smod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.out
*.app
# JetBrains IDE
.idea/
# VSCode IDE
.vscode/
.vs/
# build directories
build/
cmake-*/
docs/doxyconfig*
# Build logs
build.log
*.log
# CMake user presets (personal overrides)
CMakeUserPresets.json
# npm
node_modules/
package-lock.json
# Translations
*.mo
*.pot
# Dummy macOS files
.DS_Store
# Python
*.pyc
venv/
# Dev notes (analysis docs, guide generation, images)
_dev_notes/
# Temp HID trace files
temphidtrace*
# Windows NUL device artifact
nul
# Driver binaries (downloaded at build time via FetchDriverDeps.cmake)
src_assets/windows/misc/vdd/driver/*.dll
src_assets/windows/misc/vdd/driver/*.inf
src_assets/windows/misc/vdd/driver/*.cat
src_assets/windows/misc/vdd/driver/*.cer
src_assets/windows/misc/vdd/driver/*.zip
src_assets/windows/misc/vdd/driver/*.exe
src_assets/windows/misc/vmouse/driver/*.dll
src_assets/windows/misc/vmouse/driver/*.inf
src_assets/windows/misc/vmouse/driver/*.cat
# Generated files
src_assets/common/assets/web/welcome.html
src_assets/common/assets/web/dist/
# Local dev scripts
build.sh
# Vulkan HDR layer source (standalone tool, not part of Sunshine)
src/vk_layer_hdr_inject/
================================================
FILE: .gitmodules
================================================
[submodule "packaging/linux/flatpak/deps/flatpak-builder-tools"]
path = packaging/linux/flatpak/deps/flatpak-builder-tools
url = https://github.com/flatpak/flatpak-builder-tools.git
branch = master
[submodule "packaging/linux/flatpak/deps/shared-modules"]
path = packaging/linux/flatpak/deps/shared-modules
url = https://github.com/flathub/shared-modules.git
branch = master
[submodule "third-party/build-deps"]
path = third-party/build-deps
url = https://github.com/LizardByte/build-deps.git
branch = dist
[submodule "third-party/doxyconfig"]
path = third-party/doxyconfig
url = https://github.com/LizardByte/doxyconfig.git
branch = master
[submodule "third-party/googletest"]
path = third-party/googletest
url = https://github.com/google/googletest.git
branch = main
[submodule "third-party/inputtino"]
path = third-party/inputtino
url = https://github.com/games-on-whales/inputtino.git
branch = stable
[submodule "third-party/moonlight-common-c"]
path = third-party/moonlight-common-c
url = https://github.com/moonlight-stream/moonlight-common-c.git
branch = master
[submodule "third-party/nanors"]
path = third-party/nanors
url = https://github.com/sleepybishop/nanors.git
branch = master
[submodule "third-party/nvenc-headers/1100"]
path = third-party/nvenc-headers/1100
url = https://github.com/FFmpeg/nv-codec-headers.git
branch = sdk/11.0
[submodule "third-party/nvenc-headers/1200"]
path = third-party/nvenc-headers/1200
url = https://github.com/FFmpeg/nv-codec-headers.git
branch = sdk/12.0
[submodule "third-party/nvenc-headers/1202"]
path = third-party/nvenc-headers/1202
url = https://github.com/FFmpeg/nv-codec-headers.git
branch = master
[submodule "third-party/nvapi"]
path = third-party/nvapi
url = https://github.com/NVIDIA/nvapi.git
branch = main
[submodule "third-party/Simple-Web-Server"]
path = third-party/Simple-Web-Server
url = https://github.com/LizardByte-infrastructure/Simple-Web-Server.git
branch = master
[submodule "third-party/TPCircularBuffer"]
path = third-party/TPCircularBuffer
url = https://github.com/michaeltyson/TPCircularBuffer.git
branch = master
[submodule "third-party/tray"]
path = third-party/tray
url = https://github.com/LizardByte/tray.git
branch = master
[submodule "third-party/ViGEmClient"]
path = third-party/ViGEmClient
url = https://github.com/LizardByte/Virtual-Gamepad-Emulation-Client.git
branch = master
[submodule "third-party/wayland-protocols"]
path = third-party/wayland-protocols
url = https://github.com/LizardByte-infrastructure/wayland-protocols.git
branch = main
[submodule "third-party/wlr-protocols"]
path = third-party/wlr-protocols
url = https://github.com/LizardByte-infrastructure/wlr-protocols.git
branch = master
[submodule "src_assets/common/sunshine-control-panel"]
path = src_assets/common/sunshine-control-panel
url = https://github.com/qiin2333/sunshine-control-panel.git
branch = master
================================================
FILE: .prettierrc.json
================================================
{
"printWidth": 120,
"semi": false,
"singleQuote": true,
"prettier.spaceBeforeFunctionParen": true
}
================================================
FILE: .readthedocs.yaml
================================================
---
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
version: 2
build:
os: ubuntu-24.04
tools:
python: "miniconda-latest"
commands:
- |
if [ -f readthedocs_build.sh ]; then
doxyconfig_dir="."
else
doxyconfig_dir="./third-party/doxyconfig"
fi
chmod +x "${doxyconfig_dir}/readthedocs_build.sh"
export DOXYCONFIG_DIR="${doxyconfig_dir}"
"${doxyconfig_dir}/readthedocs_build.sh"
# using conda, we can get newer doxygen and graphviz than ubuntu provide
# https://github.com/readthedocs/readthedocs.org/issues/8151#issuecomment-890359661
conda:
environment: third-party/doxyconfig/environment.yml
submodules:
include: all
recursive: true
================================================
FILE: .rstcheck.cfg
================================================
# configuration file for rstcheck, an rst linting tool
# https://rstcheck.readthedocs.io/en/latest/usage/config
[rstcheck]
ignore_directives =
doxygenfile,
include,
mdinclude,
tab,
todo,
================================================
FILE: CMakeLists.txt
================================================
cmake_minimum_required(VERSION 3.20)
# `CMAKE_CUDA_ARCHITECTURES` requires 3.18
# `set_source_files_properties` requires 3.18
# `cmake_path(CONVERT ... TO_NATIVE_PATH_LIST ...)` requires 3.20
# todo - set this conditionally
project(Sunshine VERSION 0.0.0
DESCRIPTION "Self-hosted game stream host for Moonlight"
HOMEPAGE_URL "https://alkaidlab.com/sunshine")
set(PROJECT_LICENSE "GPL-3.0-only")
set(PROJECT_FQDN "sunshine.alkaidlab.com")
set(PROJECT_BRIEF_DESCRIPTION "GameStream host for Moonlight") # must be <= 35 characters
set(PROJECT_LONG_DESCRIPTION "Offering low latency, cloud gaming server capabilities with support for AMD, Intel, \
and Nvidia GPUs for hardware encoding. Software encoding is also available. You can connect to Sunshine from any \
Moonlight client on a variety of devices. A web UI is provided to allow configuration, and client pairing, from \
your favorite web browser. Pair from the local server or any mobile device.")
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message(STATUS "Setting build type to 'Release' as none was specified.")
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE)
endif()
# set the module path, used for includes
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
# export compile_commands.json
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# set version info for this build
include(${CMAKE_MODULE_PATH}/prep/build_version.cmake)
# cmake build flags
include(${CMAKE_MODULE_PATH}/prep/options.cmake)
# initial prep
include(${CMAKE_MODULE_PATH}/prep/init.cmake)
# configure special package files, such as sunshine.desktop, Flatpak manifest, Portfile , etc.
include(${CMAKE_MODULE_PATH}/prep/special_package_configuration.cmake)
# Exit early if END_BUILD is ON, i.e. when only generating package manifests
if(${END_BUILD})
return()
endif()
# project constants
include(${CMAKE_MODULE_PATH}/prep/constants.cmake)
# load macros
include(${CMAKE_MODULE_PATH}/macros/common.cmake)
# load dependencies
include(${CMAKE_MODULE_PATH}/dependencies/common.cmake)
# setup compile definitions
include(${CMAKE_MODULE_PATH}/compile_definitions/common.cmake)
# target definitions
include(${CMAKE_MODULE_PATH}/targets/common.cmake)
# packaging
include(${CMAKE_MODULE_PATH}/packaging/common.cmake)
================================================
FILE: CMakePresets.json
================================================
{
"version": 6,
"cmakeMinimumRequired": {
"major": 3,
"minor": 20,
"patch": 0
},
"configurePresets": [
{
"name": "dev-win",
"displayName": "Windows Dev (Ninja + MSYS2)",
"description": "Local Windows development build. Run inside MSYS2 UCRT64 shell.",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"BUILD_DOCS": "OFF",
"SUNSHINE_ASSETS_DIR": "assets",
"FETCH_DRIVER_DEPS": "OFF"
}
}
],
"buildPresets": [
{
"name": "dev",
"displayName": "Dev Build",
"configurePreset": "dev-win"
}
]
}
================================================
FILE: DOCKER_README.md
================================================
# Docker
## Important note
Starting with v0.18.0, tag names have changed. You may no longer use `latest`, `master`, `vX.X.X`.
## Build your own containers
This image provides a method for you to easily use the latest Sunshine release in your own docker projects. It is not
intended to use as a standalone container at this point, and should be considered experimental.
```dockerfile
ARG SUNSHINE_VERSION=latest
ARG SUNSHINE_OS=ubuntu-22.04
FROM lizardbyte/sunshine:${SUNSHINE_VERSION}-${SUNSHINE_OS}
# install Steam, Wayland, etc.
ENTRYPOINT steam && sunshine
```
### SUNSHINE_VERSION
- `latest`, `master`, `vX.X.X`
- commit hash
### SUNSHINE_OS
Sunshine images are available with the following tag suffixes, based on their respective base images.
- `archlinux`
- `debian-bookworm`
- `fedora-39`
- `fedora-40`
- `ubuntu-22.04`
- `ubuntu-24.04`
### Tags
You must combine the `SUNSHINE_VERSION` and `SUNSHINE_OS` to determine the tag to pull. The format should be
`<SUNSHINE_VERSION>-<SUNSHINE_OS>`. For example, `latest-ubuntu-24.04`.
See all our available tags on [docker hub](https://hub.docker.com/r/lizardbyte/sunshine/tags) or
[ghcr](https://github.com/LizardByte/Sunshine/pkgs/container/sunshine/versions) for more info.
## Where used
This is a list of docker projects using Sunshine. Something missing? Let us know about it!
- [Games on Whales](https://games-on-whales.github.io)
## Port and Volume mappings
Examples are below of the required mappings. The configuration file will be saved to `/config` in the container.
### Using docker run
Create and run the container (substitute your `<values>`):
```bash
docker run -d \
--device /dev/dri/ \
--name=<image_name> \
--restart=unless-stopped \
--ipc=host \
-e PUID=<uid> \
-e PGID=<gid> \
-e TZ=<timezone> \
-v <path to data>:/config \
-p 47984-47990:47984-47990/tcp \
-p 48010:48010 \
-p 47998-48000:47998-48000/udp \
<image>
```
### Using docker-compose
Create a `docker-compose.yml` file with the following contents (substitute your `<values>`):
```yaml
version: '3'
services:
<image_name>:
image: <image>
container_name: sunshine
restart: unless-stopped
volumes:
- <path to data>:/config
environment:
- PUID=<uid>
- PGID=<gid>
- TZ=<timezone>
ipc: host
ports:
- "47984-47990:47984-47990/tcp"
- "48010:48010"
- "47998-48000:47998-48000/udp"
```
### Using podman run
Create and run the container (substitute your `<values>`):
```bash
podman run -d \
--device /dev/dri/ \
--name=<image_name> \
--restart=unless-stopped \
--userns=keep-id \
-e PUID=<uid> \
-e PGID=<gid> \
-e TZ=<timezone> \
-v <path to data>:/config \
-p 47984-47990:47984-47990/tcp \
-p 48010:48010 \
-p 47998-48000:47998-48000/udp \
<image>
```
### Parameters
You must substitute the `<values>` with your own settings.
Parameters are split into two halves separated by a colon. The left side represents the host and the right side the
container.
**Example:** `-p external:internal` - This shows the port mapping from internal to external of the container.
Therefore `-p 47990:47990` would expose port `47990` from inside the container to be accessible from the host's IP on
port `47990` (e.g. `http://<host_ip>:47990`). The internal port must be `47990`, but the external port may be changed
(e.g. `-p 8080:47990`). All the ports listed in the `docker run` and `docker-compose` examples are required.
| Parameter | Function | Example Value | Required |
|-----------------------------|----------------------|--------------------|----------|
| `-p <port>:47990` | Web UI Port | `47990` | True |
| `-v <path to data>:/config` | Volume mapping | `/home/sunshine` | True |
| `-e PUID=<uid>` | User ID | `1001` | False |
| `-e PGID=<gid>` | Group ID | `1001` | False |
| `-e TZ=<timezone>` | Lookup [TZ value][1] | `America/New_York` | False |
For additional configuration, it is recommended to reference the *Games on Whales*
[sunshine config](https://github.com/games-on-whales/gow/blob/2e442292d79b9d996f886b8a03d22b6eb6bddf7b/compose/streamers/sunshine.yml).
[1]: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
#### User / Group Identifiers:
When using data volumes (-v flags) permissions issues can arise between the host OS and the container. To avoid this
issue you can specify the user PUID and group PGID. Ensure the data volume directory on the host is owned by the same
user you specify.
In this instance `PUID=1001` and `PGID=1001`. To find yours use id user as below:
```bash
$ id dockeruser
uid=1001(dockeruser) gid=1001(dockergroup) groups=1001(dockergroup)
```
If you want to change the PUID or PGID after the image has been built, it will require rebuilding the image.
## Supported Architectures
Specifying `lizardbyte/sunshine:latest-<SUNSHINE_OS>` or `ghcr.io/lizardbyte/sunshine:latest-<SUNSHINE_OS>` should
retrieve the correct image for your architecture.
The architectures supported by these images are shown in the table below.
| tag suffix | amd64/x86_64 | arm64/aarch64 |
|-----------------|--------------|---------------|
| archlinux | ✅ | ❌ |
| debian-bookworm | ✅ | ✅ |
| fedora-39 | ✅ | ❌ |
| fedora-40 | ✅ | ❌ |
| ubuntu-22.04 | ✅ | ✅ |
| ubuntu-24.04 | ✅ | ✅ |
<div class="section_buttons">
| Previous | Next |
|:-------------------------------|-----------------------------------------------------:|
| [Changelog](docs/changelog.md) | [Third-Party Packages](docs/third_party_packages.md) |
</div>
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
================================================
FILE: NOTICE
================================================
©2018 Valve Corporation. Steam and the Steam logo are trademarks and/or
registered trademarks of Valve Corporation in the U.S. and/or other countries. All
rights reserved.
================================================
FILE: README.de.md
================================================
# Sunshine Foundation Edition
## 🌐 Mehrsprachige Unterstützung / Multi-language Support
<div align="center">
[](README.en.md)
[](README.md)
[](README.fr.md)
[](README.de.md)
[](README.ja.md)
</div>
---
Ein Fork basierend auf LizardByte/Sunshine, bietet vollständige Dokumentationsunterstützung [Read the Docs](https://docs.qq.com/aio/DSGdQc3htbFJjSFdO?p=YTpMj5JNNdB5hEKJhhqlSB).
**Sunshine-Foundation** ist ein selbst gehosteter Game-Stream-Host für Moonlight. Diese Fork-Version hat erhebliche Verbesserungen gegenüber dem ursprünglichen Sunshine vorgenommen und konzentriert sich darauf, das Spiel-Streaming-Erlebnis für verschiedene Streaming-Endgeräte und Windows-Hosts zu verbessern:
### 🌟 Kernfunktionen
- **Vollständige HDR-Pipeline-Unterstützung** - Dualformat HDR10 (PQ) + HLG Kodierung mit adaptiven Metadaten für eine breitere Geräteabdeckung
- **Virtuelle Anzeige** - Integriertes virtuelles Display-Management, ermöglicht das Erstellen und Verwalten virtueller Displays ohne zusätzliche Software
- **Entferntes Mikrofon** - Unterstützt das Empfangen von Client-Mikrofonen und bietet hochwertige Sprachdurchleitung
- **Erweiterte Systemsteuerung** - Intuitive Web-Oberfläche zur Konfiguration mit Echtzeit-Überwachung und Verwaltung
- **Niedrige Latenzübertragung** - Optimierte Encoder-Verarbeitung unter Nutzung der neuesten Hardware-Fähigkeiten
- **Intelligente Paarung** - Intelligentes Management von Profilen für gepaarte Geräte
### 🎬 Vollständige HDR-Pipeline-Architektur
**Dual-Format HDR-Kodierung: HDR10 (PQ) + HLG Parallelunterstützung**
Herkömmliche Streaming-Lösungen unterstützen nur HDR10 (PQ) mit absoluter Luminanzzuordnung, was erfordert, dass das Client-Display die EOTF-Parameter und Spitzenhelligkeit der Quelle genau reproduziert. Wenn die Fähigkeiten des Empfangsgeräts unzureichend sind oder die Helligkeitsparameter nicht übereinstimmen, treten Tone-Mapping-Artefakte wie abgeschnittene Schatten und überbelichtete Lichter auf.
Foundation Sunshine führt HLG-Unterstützung (Hybrid Log-Gamma, ITU-R BT.2100) auf der Kodierungsebene ein. Dieser Standard verwendet eine relative Luminanzzuordnung mit folgenden technischen Vorteilen:
- **Szenenreferenzierte Luminanzanpassung**: HLG verwendet eine relative Luminanzkurve, die es dem Display ermöglicht, automatisch Tone Mapping basierend auf seiner eigenen Spitzenhelligkeit durchzuführen — die Erhaltung von Schattendetails auf Geräten mit niedriger Helligkeit ist PQ deutlich überlegen
- **Sanfter Highlight-Roll-Off**: Die hybride Log-Gamma-Transferfunktion von HLG bietet einen graduellen Roll-Off in Highlight-Bereichen und vermeidet die Banding-Artefakte, die durch hartes Clipping bei PQ verursacht werden
- **Native SDR-Abwärtskompatibilität**: HLG-Signale können von SDR-Displays direkt als Standard-BT.709-Inhalt dekodiert werden, ohne zusätzliches Tone Mapping
**Einzelbild-Luminanzanalyse und adaptive Metadatengenerierung**
Die Kodierungspipeline integriert ein Echtzeit-Luminanzanalysemodul auf der GPU-Seite, das über Compute Shader für jedes Einzelbild folgende Operationen ausführt:
- **MaxFALL / MaxCLL Einzelbild-Berechnung**: Echtzeit-Berechnung des maximalen Inhaltslichtpegels (MaxCLL) und des maximalen durchschnittlichen Bildlichtpegels (MaxFALL) auf Einzelbildebene, dynamisch in HEVC/AV1 SEI/OBU-Metadaten injiziert
- **Robuste Ausreißerfilterung**: Perzentilbasierte Abschneidestrategie zur Eliminierung extremer Luminanzpixel (z.B. Spiegelreflexionen), um zu verhindern, dass isolierte Leuchtpunkte die globale Luminanzreferenz anheben und zu einer allgemeinen Bildverdunkelung führen
- **Interframe-Exponentialglättung**: EMA-Filterung (Exponentieller gleitender Durchschnitt) auf Luminanzstatistiken über aufeinanderfolgende Frames, zur Beseitigung von Helligkeitsflimmern durch abrupte Metadatenänderungen bei Szenenwechseln
**Vollständige HDR-Metadaten-Durchleitung**
Unterstützt die vollständige Durchleitung von statischen HDR10-Metadaten (Mastering Display Info + Content Light Level), dynamischen HDR Vivid-Metadaten und HLG-Transfercharakteristik-Kennungen. Dies stellt sicher, dass die von NVENC / AMF / QSV-Encodern ausgegebenen Bitstreams vollständige Farbvolumen- und Luminanzinformationen gemäß der CTA-861-Spezifikation enthalten, sodass Client-Decoder die HDR-Absicht der Quelle präzise reproduzieren können.
### 🖥️ Integriertes virtuelles Display (Erfordert Win10 22H2 oder neuer)
- Dynamische Erstellung und Entfernung virtueller Displays
- Unterstützung für benutzerdefinierte Auflösungen und Bildwiederholraten
- Verwaltung von Mehrfachanzeigekonfigurationen
- Echtzeit-Konfigurationsänderungen ohne Neustart
## Empfohlene Moonlight-Clients
Für das beste Streaming-Erlebnis wird die Verwendung der folgenden optimierten Moonlight-Clients empfohlen (aktiviert Set-Boni):
### 🖥️ Windows(X86_64, Arm64), MacOS, Linux Clients
[](https://github.com/qiin2333/moonlight-qt)
### 📱 Android Client
[](https://github.com/qiin2333/moonlight-android/releases/tag/shortcut)
[](https://github.com/WACrown/moonlight-android)
### 📱 iOS Client
[](https://github.com/The-Fried-Fish/VoidLink)
### 🛠️ Weitere Ressourcen
[awesome-sunshine](https://github.com/LizardByte/awesome-sunshine)
## Systemanforderungen
> [!WARNING]
> Diese Tabellen werden kontinuierlich aktualisiert. Bitte kaufen Sie Hardware nicht nur basierend auf diesen Informationen.
<table>
<caption id="minimum_requirements">Mindestanforderungen</caption>
<tr>
<th>Komponente</th>
<th>Anforderung</th>
</tr>
<tr>
<td rowspan="3">GPU</td>
<td>AMD: VCE 1.0 oder höher, siehe: <a href="https://github.com/obsproject/obs-amd-encoder/wiki/Hardware-Support">obs-amd Hardware-Unterstützung</a></td>
</tr>
<tr>
<td>Intel: VAAPI-kompatibel, siehe: <a href="https://www.intel.com/content/www/us/en/developer/articles/technical/linuxmedia-vaapi.html">VAAPI Hardware-Unterstützung</a></td>
</tr>
<tr>
<td>Nvidia: Grafikkarte mit NVENC-Unterstützung, siehe: <a href="https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new">NVENC-Unterstützungsmatrix</a></td>
</tr>
<tr>
<td rowspan="2">CPU</td>
<td>AMD: Ryzen 3 oder höher</td>
</tr>
<tr>
<td>Intel: Core i3 oder höher</td>
</tr>
<tr>
<td>RAM</td>
<td>4GB oder mehr</td>
</tr>
<tr>
<td rowspan="5">Betriebssystem</td>
<td>Windows: 10 22H2+ (Windows Server unterstützt keine virtuellen Gamepads)</td>
</tr>
<tr>
<td>macOS: 12+</td>
</tr>
<tr>
<td>Linux/Debian: 12+ (bookworm)</td>
</tr>
<tr>
<td>Linux/Fedora: 39+</td>
</tr>
<tr>
<td>Linux/Ubuntu: 22.04+ (jammy)</td>
</tr>
<tr>
<td rowspan="2">Netzwerk</td>
<td>Host: 5GHz, 802.11ac</td>
</tr>
<tr>
<td>Client: 5GHz, 802.11ac</td>
</tr>
</table>
<table>
<caption id="4k_suggestions">Empfohlene Konfiguration für 4K</caption>
<tr>
<th>Komponente</th>
<th>Anforderung</th>
</tr>
<tr>
<td rowspan="3">GPU</td>
<td>AMD: Video Coding Engine 3.1 oder höher</td>
</tr>
<tr>
<td>Intel: HD Graphics 510 oder höher</td>
</tr>
<tr>
<td>Nvidia: GeForce GTX 1080 oder höhere Modelle mit mehreren Encodern</td>
</tr>
<tr>
<td rowspan="2">CPU</td>
<td>AMD: Ryzen 5 oder höher</td>
</tr>
<tr>
<td>Intel: Core i5 oder höher</td>
</tr>
<tr>
<td rowspan="2">Netzwerk</td>
<td>Host: CAT5e Ethernet oder besser</td>
</tr>
<tr>
<td>Client: CAT5e Ethernet oder besser</td>
</tr>
</table>
## Technischer Support
Lösungsweg bei Problemen:
1. Konsultieren Sie die [Nutzungsdokumentation](https://docs.qq.com/aio/DSGdQc3htbFJjSFdO?p=YTpMj5JNNdB5hEKJhhqlSB) [LizardByte-Dokumentation](https://docs.lizardbyte.dev/projects/sunshine/latest/)
2. Aktivieren Sie den detaillierten Log-Level in den Einstellungen, um relevante Informationen zu finden
3. [Treten Sie der QQ-Gruppe bei, um Hilfe zu erhalten](https://qm.qq.com/cgi-bin/qm/qr?k=5qnkzSaLIrIaU4FvumftZH_6Hg7fUuLD&jump_from=webapi)
4. [Benutze zwei Buchstaben!](https://uuyc.163.com/)
**Problemrückmeldung-Labels:**
- `hdr-support` - Probleme im Zusammenhang mit HDR
- `virtual-display` - Probleme mit virtuellen Displays
- `config-help` - Probleme im Zusammenhang mit der Konfiguration
## 📚 Entwicklerdokumentation
- **[Build-Anleitung](docs/building.md)** - Anleitung zum Kompilieren und Erstellen des Projekts
- **[Konfigurationshandbuch](docs/configuration.md)** - Erläuterung der Laufzeit-Konfigurationsoptionen
- **[WebUI-Entwicklung](docs/WEBUI_DEVELOPMENT.md)** - Vollständige Anleitung zur Entwicklung der Vue 3 + Vite Web-Oberfläche
## Community beitreten
Wir begrüßen die Teilnahme an Diskussionen und Code-Beiträgen!
[](https://qm.qq.com/cgi-bin/qm/qr?k=WC2PSZ3Q6Hk6j8U_DG9S7522GPtItk0m&jump_from=webapi&authKey=zVDLFrS83s/0Xg3hMbkMeAqI7xoHXaM3sxZIF/u9JW7qO/D8xd0npytVBC2lOS+z)
## Star-Verlauf
[](https://www.star-history.com/#qiin2333/Sunshine-Foundation&Date)
---
**Sunshine Foundation Edition - Macht Game-Streaming eleganter**
================================================
FILE: README.en.md
================================================
# Sunshine Foundation Edition
## 🌐 Multi-language Support
<div align="center">
[](README.en.md)
[](README.md)
[](README.fr.md)
[](README.de.md)
[](README.ja.md)
</div>
---
A fork based on LizardByte/Sunshine, providing comprehensive documentation support [Read the Docs](https://docs.qq.com/aio/DSGdQc3htbFJjSFdO?p=YTpMj5JNNdB5hEKJhhqlSB).
**Sunshine-Foundation** is a self-hosted game stream host for Moonlight. This forked version introduces significant improvements over the original Sunshine, focusing on enhancing the game streaming experience for various streaming terminal devices connected to a Windows host:
### 🌟 Core Features
- **Full HDR Pipeline Support** - Dual-format HDR10 (PQ) + HLG encoding with adaptive metadata, covering a wider range of endpoint devices
- **Virtual Display** - Built-in virtual display management, allowing creation and management of virtual displays without additional software
- **Remote Microphone** - Supports receiving client microphones, providing high-quality voice passthrough
- **Advanced Control Panel** - Intuitive web control interface with real-time monitoring and configuration management
- **Low-Latency Transmission** - Optimized encoding processing leveraging the latest hardware capabilities
- **Smart Pairing** - Intelligent management of pairing devices with corresponding profiles
### 🎬 Full HDR Pipeline Architecture
**Dual-Format HDR Encoding: HDR10 (PQ) + HLG Parallel Support**
Conventional streaming solutions only support HDR10 (PQ) absolute luminance mapping, which requires the client display to precisely match the source EOTF parameters and peak brightness. When the receiving device has insufficient capabilities or mismatched brightness parameters, tone mapping artifacts such as crushed blacks and clipped highlights occur.
Foundation Sunshine introduces HLG (Hybrid Log-Gamma, ITU-R BT.2100) support at the encoding layer. This standard employs relative luminance mapping with the following technical advantages:
- **Scene-Referred Luminance Adaptation**: HLG uses a relative luminance curve, allowing the display to automatically perform tone mapping based on its own peak brightness — shadow detail retention on low-brightness devices is significantly superior to PQ
- **Smooth Highlight Roll-Off**: HLG's hybrid log-gamma transfer function provides gradual roll-off in highlight regions, avoiding the banding artifacts caused by PQ's hard clipping
- **Native SDR Backward Compatibility**: HLG signals can be directly decoded by SDR displays as standard BT.709 content without additional tone mapping
**Per-Frame Luminance Analysis and Adaptive Metadata Generation**
The encoding pipeline integrates a real-time luminance analysis module on the GPU side, executing the following via Compute Shaders on each frame:
- **Per-Frame MaxFALL / MaxCLL Computation**: Real-time calculation of frame-level Maximum Content Light Level (MaxCLL) and Maximum Frame-Average Light Level (MaxFALL), dynamically injected into HEVC/AV1 SEI/OBU metadata
- **Robust Outlier Filtering**: Percentile-based truncation strategy to discard extreme luminance pixels (e.g., specular highlights), preventing isolated bright spots from inflating the global luminance reference and causing overall image dimming
- **Inter-Frame Exponential Smoothing**: EMA (Exponential Moving Average) filtering applied to luminance statistics across consecutive frames, eliminating brightness flicker caused by abrupt metadata changes during scene transitions
**Complete HDR Metadata Passthrough**
Supports full passthrough of HDR10 static metadata (Mastering Display Info + Content Light Level), HDR Vivid dynamic metadata, and HLG transfer characteristic identifiers, ensuring that bitstreams output by NVENC / AMF / QSV encoders carry complete color volume and luminance information compliant with the CTA-861 specification, enabling client decoders to accurately reproduce the source HDR intent.
### 🖥️ Virtual Display Integration (Requires Windows 10 22H2 or newer)
- Dynamic virtual display creation and destruction
- Custom resolution and refresh rate support
- Multi-display configuration management
- Real-time configuration changes without restarting
## Recommended Moonlight Clients
For the best streaming experience (activating set bonuses), it is recommended to use the following optimized Moonlight clients:
### 🖥️ Windows (X86_64, Arm64), macOS, Linux Clients
[](https://github.com/qiin2333/moonlight-qt)
### 📱 Android Clients
[](https://github.com/qiin2333/moonlight-android/releases/tag/shortcut)
[](https://github.com/WACrown/moonlight-android)
### 📱 iOS Client
[](https://github.com/The-Fried-Fish/VoidLink)
### 🛠️ Additional Resources
[awesome-sunshine](https://github.com/LizardByte/awesome-sunshine)
## System Requirements
> [!WARNING]
> These tables are continuously updated. Please do not purchase hardware based solely on this information.
<table>
<caption id="minimum_requirements">Minimum Requirements</caption>
<tr>
<th>Component</th>
<th>Requirement</th>
</tr>
<tr>
<td rowspan="3">GPU</td>
<td>AMD: VCE 1.0 or later, see: <a href="https://github.com/obsproject/obs-amd-encoder/wiki/Hardware-Support">obs-amd hardware support</a></td>
</tr>
<tr>
<td>Intel: VAAPI compatible, see: <a href="https://www.intel.com/content/www/us/en/developer/articles/technical/linuxmedia-vaapi.html">VAAPI hardware support</a></td>
</tr>
<tr>
<td>Nvidia: Graphics card with NVENC support, see: <a href="https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new">NVENC support matrix</a></td>
</tr>
<tr>
<td rowspan="2">CPU</td>
<td>AMD: Ryzen 3 or higher</td>
</tr>
<tr>
<td>Intel: Core i3 or higher</td>
</tr>
<tr>
<td>RAM</td>
<td>4GB or more</td>
</tr>
<tr>
<td rowspan="5">Operating System</td>
<td>Windows: 10 22H2+ (Windows Server does not support virtual gamepads)</td>
</tr>
<tr>
<td>macOS: 12+</td>
</tr>
<tr>
<td>Linux/Debian: 12+ (bookworm)</td>
</tr>
<tr>
<td>Linux/Fedora: 39+</td>
</tr>
<tr>
<td>Linux/Ubuntu: 22.04+ (jammy)</td>
</tr>
<tr>
<td rowspan="2">Network</td>
<td>Host: 5GHz, 802.11ac</td>
</tr>
<tr>
<td>Client: 5GHz, 802.11ac</td>
</tr>
</table>
<table>
<caption id="4k_suggestions">4K Recommended Configuration</caption>
<tr>
<th>Component</th>
<th>Requirement</th>
</tr>
<tr>
<td rowspan="3">GPU</td>
<td>AMD: Video Coding Engine 3.1 or later</td>
</tr>
<tr>
<td>Intel: HD Graphics 510 or higher</td>
</tr>
<tr>
<td>Nvidia: GeForce GTX 1080 or higher models with multiple encoders</td>
</tr>
<tr>
<td rowspan="2">CPU</td>
<td>AMD: Ryzen 5 or higher</td>
</tr>
<tr>
<td>Intel: Core i5 or higher</td>
</tr>
<tr>
<td rowspan="2">Network</td>
<td>Host: CAT5e Ethernet or better</td>
</tr>
<tr>
<td>Client: CAT5e Ethernet or better</td>
</tr>
</table>
## Technical Support
Troubleshooting path when encountering issues:
1. Check the [Usage Documentation](https://docs.qq.com/aio/DSGdQc3htbFJjSFdO?p=YTpMj5JNNdB5hEKJhhqlSB) [LizardByte Documentation](https://docs.lizardbyte.dev/projects/sunshine/latest/)
2. Enable detailed log level in settings to find relevant information
3. [Join the QQ group for help](https://qm.qq.com/cgi-bin/qm/qr?k=5qnkzSaLIrIaU4FvumftZH_6Hg7fUuLD&jump_from=webapi)
4. [Use two letters!](https://uuyc.163.com/)
**Issue Feedback Labels:**
- `hdr-support` - HDR-related issues
- `virtual-display` - Virtual display issues
- `config-help` - Configuration-related issues
## 📚 Development Documentation
- **[Building Instructions](docs/building.md)** - Project compilation and building instructions
- **[Configuration Guide](docs/configuration.md)** - Runtime configuration options explanation
- **[WebUI Development](docs/WEBUI_DEVELOPMENT.md)** - Complete guide for Vue 3 + Vite web interface development
## Join the Community
We welcome everyone to participate in discussions and contribute code!
[](https://qm.qq.com/cgi-bin/qm/qr?k=WC2PSZ3Q6Hk6j8U_DG9S7522GPtItk0m&jump_from=webapi&authKey=zVDLFrS83s/0Xg3hMbkMeAqI7xoHXaM3sxZIF/u9JW7qO/D8xd0npytVBC2lOS+z)
## Star History
[](https://www.star-history.com/#qiin2333/Sunshine-Foundation&Date)
---
**Sunshine Foundation Edition - Making Game Streaming More Elegant**
```
================================================
FILE: README.fr.md
================================================
# Sunshine Foundation
## 🌐 Support multilingue / Multi-language Support
<div align="center">
[](README.en.md)
[](README.md)
[](README.fr.md)
[](README.de.md)
[](README.ja.md)
</div>
---
Fork basé sur LizardByte/Sunshine, offrant une documentation complète [Lire la documentation](https://docs.qq.com/aio/DSGdQc3htbFJjSFdO?p=YTpMj5JNNdB5hEKJhhqlSB).
**Sunshine-Foundation** est un hôte de streaming de jeu auto-hébergé pour Moonlight. Cette version forkée apporte des améliorations significatives par rapport à Sunshine original, en se concentrant sur l'amélioration de l'expérience de streaming de jeu entre divers appareils terminaux et l'hôte Windows :
### 🌟 Fonctionnalités principales
- **Support HDR Full Pipeline** - Double encodage HDR10 (PQ) + HLG avec métadonnées adaptatives, couvrant un plus large éventail d'appareils
- **Écran virtuel** - Gestion intégrée des écrans virtuels, permettant de créer et gérer des écrans virtuels sans logiciel supplémentaire
- **Microphone distant** - Prise en charge de la réception du microphone client, offrant une fonction de transmission vocale de haute qualité
- **Panneau de contrôle avancé** - Interface de contrôle Web intuitive avec surveillance en temps réel et gestion de configuration
- **Transmission à faible latence** - Traitement de codage optimisé exploitant les dernières capacités matérielles
- **Appairage intelligent** - Gestion intelligente des profils correspondants aux appareils appairés
### 🎬 Architecture complète du pipeline HDR
**Double format d'encodage HDR : HDR10 (PQ) + HLG en parallèle**
Les solutions de streaming conventionnelles ne prennent en charge que le HDR10 (PQ) avec mappage de luminance absolue, ce qui exige que l'écran client reproduise précisément les paramètres EOTF et la luminosité maximale de la source. Lorsque les capacités de l'appareil récepteur sont insuffisantes ou que les paramètres de luminosité ne correspondent pas, des artefacts de tone mapping apparaissent, tels que la perte de détails dans les ombres et l'écrêtage des hautes lumières.
Foundation Sunshine introduit la prise en charge du HLG (Hybrid Log-Gamma, ITU-R BT.2100) au niveau de l'encodage. Ce standard utilise un mappage de luminance relatif avec les avantages techniques suivants :
- **Adaptation de luminance référencée à la scène** : Le HLG utilise une courbe de luminance relative, permettant à l'écran d'effectuer automatiquement le tone mapping en fonction de sa propre luminosité maximale — la préservation des détails d'ombre sur les appareils à faible luminosité est significativement supérieure au PQ
- **Roll-off progressif des hautes lumières** : La fonction de transfert log-gamma hybride du HLG fournit un roll-off graduel dans les zones de haute luminosité, évitant les artefacts de banding causés par l'écrêtage dur du PQ
- **Compatibilité ascendante native SDR** : Les signaux HLG peuvent être directement décodés par les écrans SDR comme du contenu standard BT.709 sans traitement de tone mapping supplémentaire
**Analyse de luminance image par image et génération adaptative de métadonnées**
Le pipeline d'encodage intègre un module d'analyse de luminance en temps réel côté GPU, exécutant via des Compute Shaders sur chaque image :
- **Calcul MaxFALL / MaxCLL par image** : Calcul en temps réel du niveau de lumière maximal du contenu (MaxCLL) et du niveau de lumière moyen maximal par image (MaxFALL), injectés dynamiquement dans les métadonnées HEVC/AV1 SEI/OBU
- **Filtrage robuste des valeurs aberrantes** : Stratégie de troncature par percentile pour éliminer les pixels de luminance extrême (ex. réflexions spéculaires), empêchant les points lumineux isolés d'élever la référence de luminance globale et de provoquer un assombrissement global de l'image
- **Lissage exponentiel inter-images** : Filtrage EMA (Moyenne Mobile Exponentielle) appliqué aux statistiques de luminance sur les images consécutives, éliminant le scintillement de luminosité causé par les changements brusques de métadonnées lors des transitions de scène
**Transmission complète des métadonnées HDR**
Prise en charge de la transmission complète des métadonnées statiques HDR10 (Mastering Display Info + Content Light Level), des métadonnées dynamiques HDR Vivid et des identifiants de caractéristiques de transfert HLG, garantissant que les flux de bits produits par les encodeurs NVENC / AMF / QSV transportent des informations complètes de volume colorimétrique et de luminance conformes à la spécification CTA-861, permettant aux décodeurs clients de reproduire fidèlement l'intention HDR de la source.
### 🖥️ Intégration d'écran virtuel (nécessite Windows 10 22H2 ou plus récent)
- Création et destruction dynamique d'écrans virtuels
- Prise en charge des résolutions et taux de rafraîchissement personnalisés
- Gestion de configuration multi-écrans
- Modifications de configuration en temps réel sans redémarrage
## Clients Moonlight recommandés
Il est recommandé d'utiliser les clients Moonlight suivants optimisés pour une expérience de streaming optimale (activation des propriétés du set) :
### 🖥️ Clients Windows(X86_64, Arm64), MacOS, Linux
[](https://github.com/qiin2333/moonlight-qt)
### 📱 Client Android
[](https://github.com/qiin2333/moonlight-android/releases/tag/shortcut)
[](https://github.com/WACrown/moonlight-android)
### 📱 Client iOS
[](https://github.com/The-Fried-Fish/VoidLink)
### 🛠️ Autres ressources
[awesome-sunshine](https://github.com/LizardByte/awesome-sunshine)
## Configuration système requise
> [!WARNING]
> Ces tableaux sont continuellement mis à jour. Veuillez ne pas acheter de matériel uniquement sur la base de ces informations.
<table>
<caption id="minimum_requirements">Configuration minimale requise</caption>
<tr>
<th>Composant</th>
<th>Exigence</th>
</tr>
<tr>
<td rowspan="3">GPU</td>
<td>AMD : VCE 1.0 ou version ultérieure, voir : <a href="https://github.com/obsproject/obs-amd-encoder/wiki/Hardware-Support">obs-amd support matériel</a></td>
</tr>
<tr>
<td>Intel : Compatible VAAPI, voir : <a href="https://www.intel.com/content/www/us/en/developer/articles/technical/linuxmedia-vaapi.html">Support matériel VAAPI</a></td>
</tr>
<tr>
<td>Nvidia : Carte graphique supportant NVENC, voir : <a href="https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new">Matrice de support nvenc</a></td>
</tr>
<tr>
<td rowspan="2">CPU</td>
<td>AMD : Ryzen 3 ou supérieur</td>
</tr>
<tr>
<td>Intel : Core i3 ou supérieur</td>
</tr>
<tr>
<td>RAM</td>
<td>4GB ou plus</td>
</tr>
<tr>
<td rowspan="5">Système d'exploitation</td>
<td>Windows : 10 22H2+ (Windows Server ne prend pas en charge les manettes de jeu virtuelles)</td>
</tr>
<tr>
<td>macOS : 12+</td>
</tr>
<tr>
<td>Linux/Debian : 12+ (bookworm)</td>
</tr>
<tr>
<td>Linux/Fedora : 39+</td>
</tr>
<tr>
<td>Linux/Ubuntu : 22.04+ (jammy)</td>
</tr>
<tr>
<td rowspan="2">Réseau</td>
<td>Hôte : 5GHz, 802.11ac</td>
</tr>
<tr>
<td>Client : 5GHz, 802.11ac</td>
</tr>
</table>
<table>
<caption id="4k_suggestions">Configuration recommandée pour la 4K</caption>
<tr>
<th>Composant</th>
<th>Exigence</th>
</tr>
<tr>
<td rowspan="3">GPU</td>
<td>AMD : Video Coding Engine 3.1 ou supérieur</td>
</tr>
<tr>
<td>Intel : HD Graphics 510 ou supérieur</td>
</tr>
<tr>
<td>Nvidia : GeForce GTX 1080 ou modèles supérieurs avec encodeurs multiples</td>
</tr>
<tr>
<td rowspan="2">CPU</td>
<td>AMD : Ryzen 5 ou supérieur</td>
</tr>
<tr>
<td>Intel : Core i5 ou supérieur</td>
</tr>
<tr>
<td rowspan="2">Réseau</td>
<td>Hôte : Ethernet CAT5e ou supérieur</td>
</tr>
<tr>
<td>Client : Ethernet CAT5e ou supérieur</td>
</tr>
</table>
## Support technique
Procédure de résolution des problèmes :
1. Consultez la [documentation d'utilisation](https://docs.qq.com/aio/DSGdQc3htbFJjSFdO?p=YTpMj5JNNdB5hEKJhhqlSB) [Documentation LizardByte](https://docs.lizardbyte.dev/projects/sunshine/latest/)
2. Activez le niveau de journalisation détaillé dans les paramètres pour trouver des informations pertinentes
3. [Rejoignez le groupe QQ pour obtenir de l'aide](https://qm.qq.com/cgi-bin/qm/qr?k=5qnkzSaLIrIaU4FvumftZH_6Hg7fUuLD&jump_from=webapi)
4. [Utilisez deux lettres !](https://uuyc.163.com/)
**Étiquettes de signalement des problèmes :**
- `hdr-support` - Problèmes liés au HDR
- `virtual-display` - Problèmes d'écran virtuel
- `config-help` - Problèmes de configuration
## 📚 Documentation de développement
- **[Instructions de compilation](docs/building.md)** - Instructions pour compiler et construire le projet
- **[Guide de configuration](docs/configuration.md)** - Description des options de configuration d'exécution
- **[Développement WebUI](docs/WEBUI_DEVELOPMENT.md)** - Guide complet du développement de l'interface Web Vue 3 + Vite
## Rejoignez la communauté
Nous accueillons favorablement les discussions et les contributions de code !
[](https://qm.qq.com/cgi-bin/qm/qr?k=WC2PSZ3Q6Hk6j8U_DG9S7522GPtItk0m&jump_from=webapi&authKey=zVDLFrS83s/0Xg3hMbkMeAqI7xoHXaM3sxZIF/u9JW7qO/D8xd0npytVBC2lOS+z)
## Historique des stars
[](https://www.star-history.com/#qiin2333/Sunshine-Foundation&Date)
---
**Sunshine Foundation - Rendre le streaming de jeux plus élégant**
```
================================================
FILE: README.ja.md
================================================
# Sunshine 基地版
## 🌐 多言語サポート / Multi-language Support
<div align="center">
[](README.en.md)
[](README.md)
[](README.fr.md)
[](README.de.md)
[](README.ja.md)
</div>
---
LizardByte/Sunshineをベースにしたフォークで、完全なドキュメントサポートを提供します [Read the Docs](https://docs.qq.com/aio/DSGdQc3htbFJjSFdO?p=YTpMj5JNNdB5hEKJhhqlSB)。
**Sunshine-Foundation** はMoonlight用のセルフホスト型ゲームストリームホストです。このフォークバージョンはオリジナルのSunshineに基づき、様々なストリーミング端末とWindowsホスト間のゲームストリーミング体験を向上させることに重点を置いた大幅な改良が加えられています:
### 🌟 コア機能
- **HDR フルパイプラインサポート** - HDR10 (PQ) + HLG デュアルフォーマットエンコーディングとアダプティブメタデータにより、幅広い端末デバイスをカバー
- **仮想ディスプレイ** - 内蔵の仮想ディスプレイ管理により、追加ソフトウェアなしで仮想ディスプレイの作成と管理が可能
- **リモートマイク** - クライアントマイクの受信をサポートし、高音質の音声パススルー機能を提供
- **高度なコントロールパネル** - 直感的なWebコントロールインターフェースで、リアルタイム監視と設定管理を提供
- **低遅延伝送** - 最新のハードウェア能力を活用した最適化されたエンコード処理
- **インテリジェントペアリング** - ペアリングデバイスの対応プロファイルをインテリジェントに管理
### 🎬 HDR フルパイプライン技術アーキテクチャ
**デュアルフォーマット HDR エンコーディング:HDR10 (PQ) + HLG 並列サポート**
従来のストリーミングソリューションは HDR10 (PQ) の絶対輝度マッピングのみをサポートしており、クライアントディスプレイがソース側の EOTF パラメータとピーク輝度を正確に再現することが求められます。受信デバイスの能力が不十分な場合やパラメータが一致しない場合、暗部ディテールの消失やハイライトクリッピングなどのトーンマッピングアーティファクトが発生します。
Foundation Sunshine はエンコーディング層に HLG(Hybrid Log-Gamma、ITU-R BT.2100)サポートを追加しました。この規格は相対輝度マッピングを採用し、以下の技術的優位性を備えています:
- **シーン参照型輝度適応**:HLG は相対輝度カーブに基づいており、ディスプレイ側が自身のピーク輝度に基づいて自動的にトーンマッピングを実行 — 低輝度デバイスでの暗部ディテール保持は PQ を大幅に上回る
- **ハイライト領域のスムーズなロールオフ**:HLG のハイブリッド対数ガンマ伝達関数は高輝度領域で漸進的なロールオフを提供し、PQ のハードクリッピングによるバンディングアーティファクトを回避
- **ネイティブ SDR 後方互換性**:HLG 信号は SDR ディスプレイで標準 BT.709 コンテンツとして直接デコード可能。追加のトーンマッピング処理は不要
**フレームごとの輝度分析とアダプティブメタデータ生成**
エンコーディングパイプラインは GPU 側にリアルタイム輝度分析モジュールを統合し、Compute Shader を介して各フレームに対して以下を実行します:
- **MaxFALL / MaxCLL フレーム単位計算**:フレームレベルの最大コンテンツ輝度(MaxCLL)とフレーム平均輝度(MaxFALL)をリアルタイムで計算し、HEVC/AV1 SEI/OBU メタデータに動的に注入
- **ロバストな外れ値フィルタリング**:パーセンタイルベースの切断戦略により極端な輝度ピクセル(例:鏡面反射ハイライト)を除去。孤立した高輝度点がグローバル輝度参照を引き上げ、画面全体が暗くなることを防止
- **フレーム間指数平滑化**:連続フレームの輝度統計値に EMA(指数移動平均)フィルタリングを適用し、シーン遷移時のメタデータ急変による輝度フリッカーを解消
**完全な HDR メタデータパススルー**
HDR10 静的メタデータ(Mastering Display Info + Content Light Level)、HDR Vivid ダイナミックメタデータ、および HLG 伝送特性識別子の完全なパススルーをサポートし、NVENC / AMF / QSV エンコーダが出力するビットストリームが CTA-861 仕様に準拠した完全な色域・輝度情報を含むことを保証します。これにより、クライアントデコーダがソース側の HDR インテントを正確に再現できます。
### 🖥️ 仮想ディスプレイ統合 (win10 22H2 以降のシステムが必要)
- 動的な仮想ディスプレイの作成と破棄
- カスタム解像度とリフレッシュレートのサポート
- マルチディスプレイ設定管理
- 再起動不要のリアルタイム設定変更
## 推奨されるMoonlightクライアント
最適なストリーミング体験を得るために、以下の最適化されたMoonlightクライアントの使用を推奨します(セット効果を発動):
### 🖥️ Windows(X86_64, Arm64), MacOS, Linux クライアント
[](https://github.com/qiin2333/moonlight-qt)
### 📱 Androidクライアント
[](https://github.com/qiin2333/moonlight-android/releases/tag/shortcut)
[](https://github.com/WACrown/moonlight-android)
### 📱 iOSクライアント
[](https://github.com/The-Fried-Fish/VoidLink)
### 🛠️ その他のリソース
[awesome-sunshine](https://github.com/LizardByte/awesome-sunshine)
## システム要件
> [!WARNING]
> これらの表は継続的に更新中です。この情報のみに基づいてハードウェアを購入しないでください。
<table>
<caption id="minimum_requirements">最小システム要件</caption>
<tr>
<th>コンポーネント</th>
<th>要件</th>
</tr>
<tr>
<td rowspan="3">GPU</td>
<td>AMD: VCE 1.0以降、参照: <a href="https://github.com/obsproject/obs-amd-encoder/wiki/Hardware-Support">obs-amdハードウェアサポート</a></td>
</tr>
<tr>
<td>Intel: VAAPI互換、参照: <a href="https://www.intel.com/content/www/us/en/developer/articles/technical/linuxmedia-vaapi.html">VAAPIハードウェアサポート</a></td>
</tr>
<tr>
<td>Nvidia: NVENC対応グラフィックカード、参照: <a href="https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new">nvencサポートマトリックス</a></td>
</tr>
<tr>
<td rowspan="2">CPU</td>
<td>AMD: Ryzen 3以降</td>
</tr>
<tr>
<td>Intel: Core i3以降</td>
</tr>
<tr>
<td>RAM</td>
<td>4GB以上</td>
</tr>
<tr>
<td rowspan="5">オペレーティングシステム</td>
<td>Windows: 10 22H2+ (Windows Serverは仮想ゲームパッドをサポートしません)</td>
</tr>
<tr>
<td>macOS: 12+</td>
</tr>
<tr>
<td>Linux/Debian: 12+ (bookworm)</td>
</tr>
<tr>
<td>Linux/Fedora: 39+</td>
</tr>
<tr>
<td>Linux/Ubuntu: 22.04+ (jammy)</td>
</tr>
<tr>
<td rowspan="2">ネットワーク</td>
<td>ホスト: 5GHz, 802.11ac</td>
</tr>
<tr>
<td>クライアント: 5GHz, 802.11ac</td>
</tr>
</table>
<table>
<caption id="4k_suggestions">4K推奨構成</caption>
<tr>
<th>コンポーネント</th>
<th>要件</th>
</tr>
<tr>
<td rowspan="3">GPU</td>
<td>AMD: Video Coding Engine 3.1以降</td>
</tr>
<tr>
<td>Intel: HD Graphics 510以降</td>
</tr>
<tr>
<td>Nvidia: GeForce GTX 1080以降のマルチエンコーダ対応モデル</td>
</tr>
<tr>
<td rowspan="2">CPU</td>
<td>AMD: Ryzen 5以降</td>
</tr>
<tr>
<td>Intel: Core i5以降</td>
</tr>
<tr>
<td rowspan="2">ネットワーク</td>
<td>ホスト: CAT5eイーサネット以上</td>
</tr>
<tr>
<td>クライアント: CAT5eイーサネット以上</td>
</tr>
</table>
## テクニカルサポート
問題が発生した場合の解決手順:
1. [使用ドキュメント](https://docs.qq.com/aio/DSGdQc3htbFJjSFdO?p=YTpMj5JNNdB5hEKJhhqlSB) [LizardByteドキュメント](https://docs.lizardbyte.dev/projects/sunshine/latest/)を確認
2. 設定で詳細なログレベルを有効にして関連情報を見つける
3. [QQグループに参加してヘルプを入手](https://qm.qq.com/cgi-bin/qm/qr?k=5qnkzSaLIrIaU4FvumftZH_6Hg7fUuLD&jump_from=webapi)
4. [二文字を使おう!](https://uuyc.163.com/)
**問題フィードバックタグ:**
- `hdr-support` - HDR関連の問題
- `virtual-display` - 仮想ディスプレイの問題
- `config-help` - 設定関連の問題
## 📚 開発ドキュメント
- **[ビルド手順](docs/building.md)** - プロジェクトのコンパイルとビルド手順
- **[設定ガイド](docs/configuration.md)** - 実行時設定オプションの説明
- **[WebUI開発](docs/WEBUI_DEVELOPMENT.md)** - Vue 3 + Vite Webインターフェース開発完全ガイド
## コミュニティに参加
ディスカッションとコード貢献を歓迎します!
[](https://qm.qq.com/cgi-bin/qm/qr?k=WC2PSZ3Q6Hk6j8U_DG9S7522GPtItk0m&jump_from=webapi&authKey=zVDLFrS83s/0Xg3hMbkMeAqI7xoHXaM3sxZIF/u9JW7qO/D8xd0npytVBC2lOS+z)
## Star History
[](https://www.star-history.com/#qiin2333/Sunshine-Foundation&Date)
---
**Sunshine基地版 - ゲームストリーミングをよりエレガントに**
```
================================================
FILE: README.md
================================================
<div align="center">
<img src="docs/poster.webp" width="800" alt="Foundation Sunshine">
<br>
[](README.en.md)
[](README.md)
[](README.fr.md)
[](README.de.md)
[](README.ja.md)
基于 [LizardByte/Sunshine](https://github.com/LizardByte/Sunshine) 的增强分支,专注于 Windows 游戏串流体验
[使用文档](https://docs.qq.com/aio/DSGdQc3htbFJjSFdO?p=YTpMj5JNNdB5hEKJhhqlSB) · [LizardByte 文档](https://docs.lizardbyte.dev/projects/sunshine/latest/) · [QQ 交流群](https://qm.qq.com/cgi-bin/qm/qr?k=5qnkzSaLIrIaU4FvumftZH_6Hg7fUuLD&jump_from=webapi)
</div>
---
### ░▒▓ 核心特性
- **HDR 全链路** — 双格式编码 (PQ + HLG)・逐帧 GPU 亮度分析・HDR10+ / HDR Vivid 动态元数据・完整静态元数据透传
- **虚拟显示器** — 深度集成 [ZakoVDD](https://github.com/qiin2333/zako-vdd)・5 种屏幕模式・Named Pipe 通信・多客户端 GUID 会话
- **音频增强** — 7.1.4 环绕声 (12ch)・Opus DRED 丢包恢复・持续音频流・远程麦克风・虚拟扬声器位深匹配
- **编码优化** — NVENC SDK 13.0・AMF QVBR/HQVBR・编码器结果缓存 (260x)・自适应下采样・Vulkan 编码器
- **控制面板** — Tauri 2 + Vue 3 + Vite・深色模式・QR 配对・实时监控
- **智能配对** — 客户端独立配置・自动匹配设备能力・虚拟鼠标驱动 (vmouse)
### ░▒▓ 技术细节
<details>
<summary><b>HDR 全链路技术方案</b></summary>
#### 双格式 HDR 编码:HDR10 (PQ) + HLG 并行支持
传统串流方案仅支持 HDR10 (PQ) 绝对亮度映射,当终端设备能力不足或亮度参数不匹配时,会出现暗部细节丢失、高光截断等问题。
因此在编码层加入了 HLG(Hybrid Log-Gamma, ITU-R BT.2100)支持,采用相对亮度映射:
- **场景参考式亮度适配**:HLG 基于相对亮度曲线,显示端根据自身峰值亮度自动进行色调映射,低亮度设备上暗部细节保留显著优于 PQ
- **高光区域平滑滚降**:HLG 的对数-伽马混合传输函数在高亮区域提供渐进式滚降,避免 PQ 硬截断导致的高光色阶断裂
- **天然 SDR 向后兼容**:HLG 信号可直接被 SDR 显示器解码为标准 BT.709 画面,无需额外的色调映射处理
**逐帧亮度分析与自适应元数据生成**
在 GPU 端集成了实时亮度分析模块,通过 Compute Shader 对每帧画面执行:
- **MaxFALL / MaxCLL 逐帧计算**:实时统计帧级最大内容亮度(MaxCLL)和帧平均亮度(MaxFALL),动态注入 HEVC/AV1 SEI/OBU 元数据
- **异常值鲁棒过滤**:采用百分位截断策略剔除极端亮度像素(如高光镜面反射),防止孤立高亮点拉高全局亮度参考导致整体画面偏暗
- **帧间指数平滑**:对连续帧的亮度统计值应用 EMA(指数移动平均)滤波,消除场景切换时元数据突变引发的亮度闪烁
**完整 HDR 元数据透传**
HDR10 静态元数据(Mastering Display Info + Content Light Level)完整透传,NVENC / AMF / QSV 编码输出的码流携带符合 CTA-861 规范的完整色彩容积与亮度信息。
**HDR10+ / HDR Vivid 动态元数据注入**
在 NVENC 编码管线中,基于逐帧亮度分析结果,自动生成并注入以下动态元数据 SEI:
- **HDR10+ (ST 2094-40)**:携带场景级 MaxSCL / distribution percentiles / knee point 等色调映射参考,支持 Samsung/Panasonic 等 HDR10+ 认证电视精确色调映射
- **HDR Vivid (CUVA T/UWA 005.3)**:ITU-T T.35 注册的中国超高清视频联盟(CUVA)标准,PQ 模式下提供绝对亮度色调映射、HLG 模式下提供场景参考相对亮度色调映射,覆盖国产终端生态
</details>
<details>
<summary><b>虚拟显示器集成</b> (需 Windows 10 22H2+)</summary>
深度集成 [ZakoVDD](https://github.com/qiin2333/zako-vdd) 虚拟显示器驱动:
- 自定义分辨率和刷新率支持,10-bit HDR 色深
- **5 种屏幕组合模式**:仅虚拟屏、仅物理屏、混合模式、镜像模式、扩展模式
- Named Pipe 实时通信,串流开始/结束时自动创建/销毁虚拟显示器
- 每个客户端独立绑定 VDD 会话(GUID),支持多客户端快速切换
- 无需重启的实时配置更改
</details>
<details>
<summary><b>音频增强</b></summary>
- **7.1.4 环绕声 (12声道)**:Dolby Atmos 等沉浸式音频布局的完整声道映射
- **Opus DRED 深度冗余**:基于神经网络的丢包恢复,100ms 冗余窗口在网络抖动时平滑补偿
- **持续音频流**:无中断的音频流,无声时自动填充静音数据,避免音频设备反复初始化
- **虚拟扬声器自动匹配**:自动检测并匹配 16bit/24bit 等位深格式的虚拟音频设备
</details>
<details>
<summary><b>捕获与编码优化</b></summary>
**捕获管线**
- **Gamma-Aware 着色器**:根据 DXGI ColorSpace 自动选择 sRGB / 线性 Gamma 颜色转换
- **高质量下采样**:双三次 (Bicubic) 插值,支持 fast / balanced / high_quality 三档
- **动态分辨率检测**:实时感知显示器分辨率与旋转变化,编码器自适应调整
- **GPU 亮度分析**:Compute Shader 两阶段规约、P95/P99 截断、帧间 EMA 时域平滑
**NVENC**
- **SDK 13.0**:精细化码率控制与 Look-ahead
- **HDR 元数据 API**:NVENC SDK 12.2+ 原生 Mastering Display / Content Light Level 写入
- **HDR10+ / HDR Vivid SEI**:逐帧自动生成 ST 2094-40 和 CUVA T.35 动态元数据
- **SPS 码流规范**:H.264/HEVC SPS bitstream restrictions 完整写入
**AMF (AMD)**
- **QVBR / HQVBR / HQCBR**:高级码率控制,支持质量等级 UI 调节
- **AV1 低延迟**:AV1 编码器无延迟影响的优化选项
**通用**
- **编码器结果缓存**:探测结果持久化,后续连接 26s → <100ms (260x 加速)
- **自适应下采样**:支持双线性 / 双三次 / 高质量三档分辨率缩放,适配 4K 主机→1080p 串流场景
- **Vulkan 编码器**:实验性 Vulkan 视频编码支持
- **无锁证书链**:`shared_mutex` 替代 mutex,消除 TLS 队列开销
</details>
<br>
---
### ░▒▓ 推荐客户端
搭配以下优化版 Moonlight 客户端可获得最佳体验(激活套装属性)
- **PC** — [Moonlight-PC](https://github.com/qiin2333/moonlight-qt)(Windows · macOS · Linux)
- **Android** — [威力加强版](https://github.com/qiin2333/moonlight-vplus) · [王冠版](https://github.com/WACrown/moonlight-android)
- **iOS** — [VoidLink](https://github.com/The-Fried-Fish/VoidLink-previously-moonlight-zwm)
- **鸿蒙** — [Moonlight V+](https://appgallery.huawei.com/app/detail?id=com.alkaidlab.sdream)
更多资源:[awesome-sunshine](https://github.com/LizardByte/awesome-sunshine)
<br>
<details>
<summary><b>░▒▓ 系统要求</b></summary>
| 组件 | 最低要求 | 4K 推荐 |
|------|----------|---------|
| **GPU** | AMD VCE 1.0+ / Intel VAAPI / NVIDIA NVENC | AMD VCE 3.1+ / Intel HD 510+ / GTX 1080+ |
| **CPU** | Ryzen 3 / Core i3 | Ryzen 5 / Core i5 |
| **RAM** | 4 GB | 8 GB |
| **系统** | Windows 10 22H2+ | Windows 10 22H2+ |
| **网络** | 5GHz 802.11ac | CAT5e 以太网 |
GPU 兼容性:[NVENC](https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new) · [AMD VCE](https://github.com/obsproject/obs-amd-encoder/wiki/Hardware-Support) · [Intel VAAPI](https://www.intel.com/content/www/us/en/developer/articles/technical/linuxmedia-vaapi.html)
</details>
---
### ░▒▓ 文档与支持
[](https://docs.qq.com/aio/DSGdQc3htbFJjSFdO?p=YTpMj5JNNdB5hEKJhhqlSB) [](https://docs.lizardbyte.dev/projects/sunshine/latest/) [](https://qm.qq.com/cgi-bin/qm/qr?k=5qnkzSaLIrIaU4FvumftZH_6Hg7fUuLD&jump_from=webapi)
想帮杂鱼写代码? → [](docs/building.md) [](docs/configuration.md) [](docs/WEBUI_DEVELOPMENT.md)
<br>
<div align="center">
「 ░▒▓ 」
<a href="https://github.com/qiin2333/foundation-sunshine/graphs/contributors">
<img src="https://contrib.rocks/image?repo=qiin2333/foundation-sunshine&max=100" />
</a>
<br>
[](https://qm.qq.com/cgi-bin/qm/qr?k=WC2PSZ3Q6Hk6j8U_DG9S7522GPtItk0m&jump_from=webapi&authKey=zVDLFrS83s/0Xg3hMbkMeAqI7xoHXaM3sxZIF/u9JW7qO/D8xd0npytVBC2lOS+z)
[](https://www.star-history.com/#qiin2333/Sunshine-Foundation&Date)
</div>
================================================
FILE: README.md.backup
================================================
# Sunshine 基地版
基于LizardByte/Sunshine的分支,提供完整的文档支持 [Read the Docs](https://docs.qq.com/aio/DSGdQc3htbFJjSFdO?p=YTpMj5JNNdB5hEKJhhqlSB)。
**Sunshine-Foundation** is a self-hosted game stream host for Moonlight,本分支版本在原始Sunshine基础上进行了重大改进,专注于提高各种串流终端设备与windows主机接入的游戏串流体验:
### 🌟 核心特性
- **HDR友好支持** - 经过优化的HDR处理管线,提供真正的HDR游戏流媒体体验
- **集成虚拟显示器** - 内置虚拟显示器管理,无需额外软件即可创建和管理虚拟显示器
- **远程麦克风** - 支持接收客户端麦克风,提供高音质的语音直通功能
- **高级控制面板** - 直观的Web控制界面,提供实时监控和配置管理
- **低延迟传输** - 结合最新硬件能力优化的编码处理
- **智能配对** - 智能管理配对设备的对应配置文件
### 🖥️ 虚拟显示器集成 (需win10 22H2 及更新的系统)
- 动态虚拟显示器创建和销毁
- 自定义分辨率和刷新率支持
- 多显示器配置管理
- 无需重启的实时配置更改
## 推荐的Moonlight客户端
建议使用以下经过优化的Moonlight客户端获得最佳的串流体验(激活套装属性):
### 🖥️ Windows(X86_64, Arm64), MacOS, Linux 客户端
[](https://github.com/qiin2333/moonlight-qt)
### 📱 Android客户端
[](https://github.com/qiin2333/moonlight-android/releases/tag/shortcut)
[](https://github.com/WACrown/moonlight-android)
### 📱 iOS客户端
[](https://github.com/TrueZhuangJia/moonlight-ios-NativeMultiTouchPassthrough)
### 🛠️ 其他资源
[awesome-sunshine](https://github.com/LizardByte/awesome-sunshine)
## 系统要求
> [!WARNING]
> 这些表格正在持续更新中。请不要仅基于此信息购买硬件。
<table>
<caption id="minimum_requirements">最低配置要求</caption>
<tr>
<th>组件</th>
<th>要求</th>
</tr>
<tr>
<td rowspan="3">GPU</td>
<td>AMD: VCE 1.0或更高版本,参见: <a href="https://github.com/obsproject/obs-amd-encoder/wiki/Hardware-Support">obs-amd硬件支持</a></td>
</tr>
<tr>
<td>Intel: VAAPI兼容,参见: <a href="https://www.intel.com/content/www/us/en/developer/articles/technical/linuxmedia-vaapi.html">VAAPI硬件支持</a></td>
</tr>
<tr>
<td>Nvidia: 支持NVENC的显卡,参见: <a href="https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new">nvenc支持矩阵</a></td>
</tr>
<tr>
<td rowspan="2">CPU</td>
<td>AMD: Ryzen 3或更高</td>
</tr>
<tr>
<td>Intel: Core i3或更高</td>
</tr>
<tr>
<td>RAM</td>
<td>4GB或更多</td>
</tr>
<tr>
<td rowspan="5">操作系统</td>
<td>Windows: 10 22H2+ (Windows Server不支持虚拟游戏手柄)</td>
</tr>
<tr>
<td>macOS: 12+</td>
</tr>
<tr>
<td>Linux/Debian: 12+ (bookworm)</td>
</tr>
<tr>
<td>Linux/Fedora: 39+</td>
</tr>
<tr>
<td>Linux/Ubuntu: 22.04+ (jammy)</td>
</tr>
<tr>
<td rowspan="2">网络</td>
<td>主机: 5GHz, 802.11ac</td>
</tr>
<tr>
<td>客户端: 5GHz, 802.11ac</td>
</tr>
</table>
<table>
<caption id="4k_suggestions">4K推荐配置</caption>
<tr>
<th>组件</th>
<th>要求</th>
</tr>
<tr>
<td rowspan="3">GPU</td>
<td>AMD: Video Coding Engine 3.1或更高</td>
</tr>
<tr>
<td>Intel: HD Graphics 510或更高</td>
</tr>
<tr>
<td>Nvidia: GeForce GTX 1080或更高的具有多编码器的型号</td>
</tr>
<tr>
<td rowspan="2">CPU</td>
<td>AMD: Ryzen 5或更高</td>
</tr>
<tr>
<td>Intel: Core i5或更高</td>
</tr>
<tr>
<td rowspan="2">网络</td>
<td>主机: CAT5e以太网或更好</td>
</tr>
<tr>
<td>客户端: CAT5e以太网或更好</td>
</tr>
</table>
## 技术支持
遇到问题时的解决路径:
1. 查看 [使用文档](https://docs.qq.com/aio/DSGdQc3htbFJjSFdO?p=YTpMj5JNNdB5hEKJhhqlSB) [LizardByte文档](https://docs.lizardbyte.dev/projects/sunshine/latest/)
2. 在设置中打开详细的日志等级找到相关信息
3. [加入QQ交流群获取帮助](https://qm.qq.com/cgi-bin/qm/qr?k=5qnkzSaLIrIaU4FvumftZH_6Hg7fUuLD&jump_from=webapi)
4. [使用两个字母!](https://uuyc.163.com/)
**问题反馈标签:**
- `hdr-support` - HDR相关问题
- `virtual-display` - 虚拟显示器问题
- `config-help` - 配置相关问题
## 加入社区
我们欢迎大家参与讨论和贡献代码!
[](https://qm.qq.com/cgi-bin/qm/qr?k=WC2PSZ3Q6Hk6j8U_DG9S7522GPtItk0m&jump_from=webapi&authKey=zVDLFrS83s/0Xg3hMbkMeAqI7xoHXaM3sxZIF/u9JW7qO/D8xd0npytVBC2lOS+z)
## Star History
[](https://www.star-history.com/#qiin2333/Sunshine-Foundation&Date)
---
**Sunshine基地版 - 让游戏串流更简单**
================================================
FILE: cmake/FindLIBCAP.cmake
================================================
# - Try to find Libcap
# Once done this will define
#
# LIBCAP_FOUND - system has Libcap
# LIBCAP_INCLUDE_DIRS - the Libcap include directory
# LIBCAP_LIBRARIES - the libraries needed to use Libcap
# LIBCAP_DEFINITIONS - Compiler switches required for using Libcap
# Use pkg-config to get the directories and then use these values
# in the find_path() and find_library() calls
find_package(PkgConfig)
pkg_check_modules(PC_LIBCAP libcap)
set(LIBCAP_DEFINITIONS ${PC_LIBCAP_CFLAGS})
find_path(LIBCAP_INCLUDE_DIRS sys/capability.h PATHS ${PC_LIBCAP_INCLUDEDIR} ${PC_LIBCAP_INCLUDE_DIRS})
find_library(LIBCAP_LIBRARIES NAMES libcap.so PATHS ${PC_LIBCAP_LIBDIR} ${PC_LIBCAP_LIBRARY_DIRS})
mark_as_advanced(LIBCAP_INCLUDE_DIRS LIBCAP_LIBRARIES)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LIBCAP REQUIRED_VARS LIBCAP_LIBRARIES LIBCAP_INCLUDE_DIRS)
================================================
FILE: cmake/FindLIBDRM.cmake
================================================
# - Try to find Libdrm
# Once done this will define
#
# LIBDRM_FOUND - system has Libdrm
# LIBDRM_INCLUDE_DIRS - the Libdrm include directory
# LIBDRM_LIBRARIES - the libraries needed to use Libdrm
# LIBDRM_DEFINITIONS - Compiler switches required for using Libdrm
# Use pkg-config to get the directories and then use these values
# in the find_path() and find_library() calls
find_package(PkgConfig)
pkg_check_modules(PC_LIBDRM libdrm)
set(LIBDRM_DEFINITIONS ${PC_LIBDRM_CFLAGS})
find_path(LIBDRM_INCLUDE_DIRS drm.h PATHS ${PC_LIBDRM_INCLUDEDIR} ${PC_LIBDRM_INCLUDE_DIRS} PATH_SUFFIXES libdrm)
find_library(LIBDRM_LIBRARIES NAMES libdrm.so PATHS ${PC_LIBDRM_LIBDIR} ${PC_LIBDRM_LIBRARY_DIRS})
mark_as_advanced(LIBDRM_INCLUDE_DIRS LIBDRM_LIBRARIES)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LIBDRM REQUIRED_VARS LIBDRM_LIBRARIES LIBDRM_INCLUDE_DIRS)
================================================
FILE: cmake/FindLibva.cmake
================================================
# - Try to find Libva
# This module defines the following variables:
#
# * LIBVA_FOUND - The component was found
# * LIBVA_INCLUDE_DIRS - The component include directory
# * LIBVA_LIBRARIES - The component library Libva
# * LIBVA_DRM_LIBRARIES - The component library Libva DRM
# Use pkg-config to get the directories and then use these values in the
# find_path() and find_library() calls
# cmake-format: on
find_package(PkgConfig QUIET)
if(PKG_CONFIG_FOUND)
pkg_check_modules(_LIBVA libva)
pkg_check_modules(_LIBVA_DRM libva-drm)
endif()
find_path(
LIBVA_INCLUDE_DIR
NAMES va/va.h va/va_drm.h
HINTS ${_LIBVA_INCLUDE_DIRS}
PATHS /usr/include /usr/local/include /opt/local/include)
find_library(
LIBVA_LIB
NAMES ${_LIBVA_LIBRARIES} libva
HINTS ${_LIBVA_LIBRARY_DIRS}
PATHS /usr/lib /usr/local/lib /opt/local/lib)
find_library(
LIBVA_DRM_LIB
NAMES ${_LIBVA_DRM_LIBRARIES} libva-drm
HINTS ${_LIBVA_DRM_LIBRARY_DIRS}
PATHS /usr/lib /usr/local/lib /opt/local/lib)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Libva REQUIRED_VARS LIBVA_INCLUDE_DIR LIBVA_LIB LIBVA_DRM_LIB)
mark_as_advanced(LIBVA_INCLUDE_DIR LIBVA_LIB LIBVA_DRM_LIB)
if(LIBVA_FOUND)
set(LIBVA_INCLUDE_DIRS ${LIBVA_INCLUDE_DIR})
set(LIBVA_LIBRARIES ${LIBVA_LIB})
set(LIBVA_DRM_LIBRARIES ${LIBVA_DRM_LIB})
if(NOT TARGET Libva::va)
if(IS_ABSOLUTE "${LIBVA_LIBRARIES}")
add_library(Libva::va UNKNOWN IMPORTED)
set_target_properties(Libva::va PROPERTIES IMPORTED_LOCATION "${LIBVA_LIBRARIES}")
else()
add_library(Libva::va INTERFACE IMPORTED)
set_target_properties(Libva::va PROPERTIES IMPORTED_LIBNAME "${LIBVA_LIBRARIES}")
endif()
set_target_properties(Libva::va PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LIBVA_INCLUDE_DIRS}")
endif()
if(NOT TARGET Libva::drm)
if(IS_ABSOLUTE "${LIBVA_DRM_LIBRARIES}")
add_library(Libva::drm UNKNOWN IMPORTED)
set_target_properties(Libva::drm PROPERTIES IMPORTED_LOCATION "${LIBVA_DRM_LIBRARIES}")
else()
add_library(Libva::drm INTERFACE IMPORTED)
set_target_properties(Libva::drm PROPERTIES IMPORTED_LIBNAME "${LIBVA_DRM_LIBRARIES}")
endif()
set_target_properties(Libva::drm PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LIBVA_INCLUDE_DIRS}")
endif()
endif()
================================================
FILE: cmake/FindSystemd.cmake
================================================
# - Try to find Systemd
# Once done this will define
#
# SYSTEMD_FOUND - system has systemd
# SYSTEMD_USER_UNIT_INSTALL_DIR - the systemd system unit install directory
# SYSTEMD_SYSTEM_UNIT_INSTALL_DIR - the systemd user unit install directory
IF (NOT WIN32)
find_package(PkgConfig QUIET)
if(PKG_CONFIG_FOUND)
pkg_check_modules(SYSTEMD "systemd")
endif()
if (SYSTEMD_FOUND)
execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE}
--variable=systemduserunitdir systemd
OUTPUT_VARIABLE SYSTEMD_USER_UNIT_INSTALL_DIR)
string(REGEX REPLACE "[ \t\n]+" "" SYSTEMD_USER_UNIT_INSTALL_DIR
"${SYSTEMD_USER_UNIT_INSTALL_DIR}")
execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE}
--variable=systemdsystemunitdir systemd
OUTPUT_VARIABLE SYSTEMD_SYSTEM_UNIT_INSTALL_DIR)
string(REGEX REPLACE "[ \t\n]+" "" SYSTEMD_SYSTEM_UNIT_INSTALL_DIR
"${SYSTEMD_SYSTEM_UNIT_INSTALL_DIR}")
mark_as_advanced(SYSTEMD_USER_UNIT_INSTALL_DIR SYSTEMD_SYSTEM_UNIT_INSTALL_DIR)
endif ()
ENDIF ()
================================================
FILE: cmake/FindUdev.cmake
================================================
# - Try to find Udev
# Once done this will define
#
# UDEV_FOUND - system has udev
# UDEV_RULES_INSTALL_DIR - the udev rules install directory
IF (NOT WIN32)
find_package(PkgConfig QUIET)
if(PKG_CONFIG_FOUND)
pkg_check_modules(UDEV "udev")
endif()
if (UDEV_FOUND)
execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE}
--variable=udevdir udev
OUTPUT_VARIABLE UDEV_RULES_INSTALL_DIR)
string(REGEX REPLACE "[ \t\n]+" "" UDEV_RULES_INSTALL_DIR
"${UDEV_RULES_INSTALL_DIR}")
set(UDEV_RULES_INSTALL_DIR "${UDEV_RULES_INSTALL_DIR}/rules.d")
mark_as_advanced(UDEV_RULES_INSTALL_DIR)
endif ()
ENDIF ()
================================================
FILE: cmake/FindWayland.cmake
================================================
# Try to find Wayland on a Unix system
#
# This will define:
#
# WAYLAND_FOUND - True if Wayland is found
# WAYLAND_LIBRARIES - Link these to use Wayland
# WAYLAND_INCLUDE_DIRS - Include directory for Wayland
# WAYLAND_DEFINITIONS - Compiler flags for using Wayland
#
# In addition the following more fine grained variables will be defined:
#
# Wayland_Client_FOUND WAYLAND_CLIENT_INCLUDE_DIRS WAYLAND_CLIENT_LIBRARIES
# Wayland_Server_FOUND WAYLAND_SERVER_INCLUDE_DIRS WAYLAND_SERVER_LIBRARIES
# Wayland_EGL_FOUND WAYLAND_EGL_INCLUDE_DIRS WAYLAND_EGL_LIBRARIES
# Wayland_Cursor_FOUND WAYLAND_CURSOR_INCLUDE_DIRS WAYLAND_CURSOR_LIBRARIES
#
# Copyright (c) 2013 Martin Gräßlin <mgraesslin@kde.org>
# 2020 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
IF (NOT WIN32)
# Use pkg-config to get the directories and then use these values
# in the find_path() and find_library() calls
find_package(PkgConfig)
PKG_CHECK_MODULES(PKG_WAYLAND QUIET wayland-client wayland-server wayland-egl wayland-cursor)
set(WAYLAND_DEFINITIONS ${PKG_WAYLAND_CFLAGS})
find_path(WAYLAND_CLIENT_INCLUDE_DIRS NAMES wayland-client.h HINTS ${PKG_WAYLAND_INCLUDE_DIRS})
find_library(WAYLAND_CLIENT_LIBRARIES NAMES wayland-client HINTS ${PKG_WAYLAND_LIBRARY_DIRS})
if(WAYLAND_CLIENT_INCLUDE_DIRS AND WAYLAND_CLIENT_LIBRARIES)
set(Wayland_Client_FOUND TRUE) # cmake-lint: disable=C0103
else()
set(Wayland_Client_FOUND FALSE) # cmake-lint: disable=C0103
endif()
mark_as_advanced(WAYLAND_CLIENT_INCLUDE_DIRS WAYLAND_CLIENT_LIBRARIES)
find_path(WAYLAND_CURSOR_INCLUDE_DIRS NAMES wayland-cursor.h HINTS ${PKG_WAYLAND_INCLUDE_DIRS})
find_library(WAYLAND_CURSOR_LIBRARIES NAMES wayland-cursor HINTS ${PKG_WAYLAND_LIBRARY_DIRS})
if(WAYLAND_CURSOR_INCLUDE_DIRS AND WAYLAND_CURSOR_LIBRARIES)
set(Wayland_Cursor_FOUND TRUE) # cmake-lint: disable=C0103
else()
set(Wayland_Cursor_FOUND FALSE) # cmake-lint: disable=C0103
endif()
mark_as_advanced(WAYLAND_CURSOR_INCLUDE_DIRS WAYLAND_CURSOR_LIBRARIES)
find_path(WAYLAND_EGL_INCLUDE_DIRS NAMES wayland-egl.h HINTS ${PKG_WAYLAND_INCLUDE_DIRS})
find_library(WAYLAND_EGL_LIBRARIES NAMES wayland-egl HINTS ${PKG_WAYLAND_LIBRARY_DIRS})
if(WAYLAND_EGL_INCLUDE_DIRS AND WAYLAND_EGL_LIBRARIES)
set(Wayland_EGL_FOUND TRUE) # cmake-lint: disable=C0103
else()
set(Wayland_EGL_FOUND FALSE) # cmake-lint: disable=C0103
endif()
mark_as_advanced(WAYLAND_EGL_INCLUDE_DIRS WAYLAND_EGL_LIBRARIES)
find_path(WAYLAND_SERVER_INCLUDE_DIRS NAMES wayland-server.h HINTS ${PKG_WAYLAND_INCLUDE_DIRS})
find_library(WAYLAND_SERVER_LIBRARIES NAMES wayland-server HINTS ${PKG_WAYLAND_LIBRARY_DIRS})
if(WAYLAND_SERVER_INCLUDE_DIRS AND WAYLAND_SERVER_LIBRARIES)
set(Wayland_Server_FOUND TRUE) # cmake-lint: disable=C0103
else()
set(Wayland_Server_FOUND FALSE) # cmake-lint: disable=C0103
endif()
mark_as_advanced(WAYLAND_SERVER_INCLUDE_DIRS WAYLAND_SERVER_LIBRARIES)
set(WAYLAND_INCLUDE_DIRS ${WAYLAND_CLIENT_INCLUDE_DIRS} ${WAYLAND_SERVER_INCLUDE_DIRS}
${WAYLAND_EGL_INCLUDE_DIRS} ${WAYLAND_CURSOR_INCLUDE_DIRS})
set(WAYLAND_LIBRARIES ${WAYLAND_CLIENT_LIBRARIES} ${WAYLAND_SERVER_LIBRARIES}
${WAYLAND_EGL_LIBRARIES} ${WAYLAND_CURSOR_LIBRARIES})
mark_as_advanced(WAYLAND_INCLUDE_DIRS WAYLAND_LIBRARIES)
list(REMOVE_DUPLICATES WAYLAND_INCLUDE_DIRS)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Wayland REQUIRED_VARS WAYLAND_LIBRARIES WAYLAND_INCLUDE_DIRS HANDLE_COMPONENTS)
ENDIF ()
================================================
FILE: cmake/compile_definitions/common.cmake
================================================
# common compile definitions
# this file will also load platform specific definitions
list(APPEND SUNSHINE_COMPILE_OPTIONS -Wall -Wno-sign-compare)
# Wall - enable all warnings
# Werror - treat warnings as errors
# Wno-maybe-uninitialized/Wno-uninitialized - disable warnings for maybe uninitialized variables
# Wno-sign-compare - disable warnings for signed/unsigned comparisons
# Wno-restrict - disable warnings for memory overlap
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
# GCC specific compile options
# GCC 12 and higher will complain about maybe-uninitialized
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 12)
list(APPEND SUNSHINE_COMPILE_OPTIONS -Wno-maybe-uninitialized)
# Disable the bogus warning that may prevent compilation (only for GCC 12).
# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105651.
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13)
list(APPEND SUNSHINE_COMPILE_OPTIONS -Wno-restrict)
endif()
endif()
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
# Clang specific compile options
# Clang doesn't actually complain about this this, so disabling for now
# list(APPEND SUNSHINE_COMPILE_OPTIONS -Wno-uninitialized)
endif()
if(BUILD_WERROR)
list(APPEND SUNSHINE_COMPILE_OPTIONS -Werror)
endif()
# setup assets directory
if(NOT SUNSHINE_ASSETS_DIR)
set(SUNSHINE_ASSETS_DIR "assets")
endif()
# platform specific compile definitions
if(WIN32)
include(${CMAKE_MODULE_PATH}/compile_definitions/windows.cmake)
elseif(UNIX)
include(${CMAKE_MODULE_PATH}/compile_definitions/unix.cmake)
if(APPLE)
include(${CMAKE_MODULE_PATH}/compile_definitions/macos.cmake)
else()
include(${CMAKE_MODULE_PATH}/compile_definitions/linux.cmake)
endif()
endif()
configure_file("${CMAKE_SOURCE_DIR}/src/version.h.in" version.h @ONLY)
include_directories("${CMAKE_CURRENT_BINARY_DIR}") # required for importing version.h
set(SUNSHINE_TARGET_FILES
"${CMAKE_SOURCE_DIR}/third-party/moonlight-common-c/src/Input.h"
"${CMAKE_SOURCE_DIR}/third-party/moonlight-common-c/src/Rtsp.h"
"${CMAKE_SOURCE_DIR}/third-party/moonlight-common-c/src/RtspParser.c"
"${CMAKE_SOURCE_DIR}/third-party/moonlight-common-c/src/Video.h"
"${CMAKE_SOURCE_DIR}/third-party/tray/src/tray.h"
"${CMAKE_SOURCE_DIR}/src/display_device/display_device.h"
"${CMAKE_SOURCE_DIR}/src/display_device/parsed_config.cpp"
"${CMAKE_SOURCE_DIR}/src/display_device/parsed_config.h"
"${CMAKE_SOURCE_DIR}/src/display_device/session.cpp"
"${CMAKE_SOURCE_DIR}/src/display_device/session.h"
"${CMAKE_SOURCE_DIR}/src/display_device/settings.cpp"
"${CMAKE_SOURCE_DIR}/src/display_device/settings.h"
"${CMAKE_SOURCE_DIR}/src/display_device/to_string.cpp"
"${CMAKE_SOURCE_DIR}/src/display_device/to_string.h"
"${CMAKE_SOURCE_DIR}/src/display_device/vdd_utils.cpp"
"${CMAKE_SOURCE_DIR}/src/display_device/vdd_utils.h"
"${CMAKE_SOURCE_DIR}/src/upnp.cpp"
"${CMAKE_SOURCE_DIR}/src/upnp.h"
"${CMAKE_SOURCE_DIR}/src/cbs.cpp"
"${CMAKE_SOURCE_DIR}/src/utility.h"
"${CMAKE_SOURCE_DIR}/src/uuid.h"
"${CMAKE_SOURCE_DIR}/src/config.h"
"${CMAKE_SOURCE_DIR}/src/config.cpp"
"${CMAKE_SOURCE_DIR}/src/entry_handler.cpp"
"${CMAKE_SOURCE_DIR}/src/entry_handler.h"
"${CMAKE_SOURCE_DIR}/src/file_handler.cpp"
"${CMAKE_SOURCE_DIR}/src/file_handler.h"
"${CMAKE_SOURCE_DIR}/src/globals.cpp"
"${CMAKE_SOURCE_DIR}/src/globals.h"
"${CMAKE_SOURCE_DIR}/src/logging.cpp"
"${CMAKE_SOURCE_DIR}/src/logging.h"
"${CMAKE_SOURCE_DIR}/src/main.cpp"
"${CMAKE_SOURCE_DIR}/src/main.h"
"${CMAKE_SOURCE_DIR}/src/crypto.cpp"
"${CMAKE_SOURCE_DIR}/src/crypto.h"
"${CMAKE_SOURCE_DIR}/src/webhook_format.cpp"
"${CMAKE_SOURCE_DIR}/src/webhook_format.h"
"${CMAKE_SOURCE_DIR}/src/webhook_httpsclient.cpp"
"${CMAKE_SOURCE_DIR}/src/webhook_httpsclient.h"
"${CMAKE_SOURCE_DIR}/src/webhook.cpp"
"${CMAKE_SOURCE_DIR}/src/webhook.h"
"${CMAKE_SOURCE_DIR}/src/nvhttp.cpp"
"${CMAKE_SOURCE_DIR}/src/nvhttp.h"
"${CMAKE_SOURCE_DIR}/src/abr.cpp"
"${CMAKE_SOURCE_DIR}/src/abr.h"
"${CMAKE_SOURCE_DIR}/src/httpcommon.cpp"
"${CMAKE_SOURCE_DIR}/src/httpcommon.h"
"${CMAKE_SOURCE_DIR}/src/confighttp.cpp"
"${CMAKE_SOURCE_DIR}/src/confighttp.h"
"${CMAKE_SOURCE_DIR}/src/rtsp.cpp"
"${CMAKE_SOURCE_DIR}/src/rtsp.h"
"${CMAKE_SOURCE_DIR}/src/stream.cpp"
"${CMAKE_SOURCE_DIR}/src/stream.h"
"${CMAKE_SOURCE_DIR}/src/video.cpp"
"${CMAKE_SOURCE_DIR}/src/video.h"
"${CMAKE_SOURCE_DIR}/src/video_colorspace.cpp"
"${CMAKE_SOURCE_DIR}/src/video_colorspace.h"
"${CMAKE_SOURCE_DIR}/src/input.cpp"
"${CMAKE_SOURCE_DIR}/src/input.h"
"${CMAKE_SOURCE_DIR}/src/audio.cpp"
"${CMAKE_SOURCE_DIR}/src/audio.h"
"${CMAKE_SOURCE_DIR}/src/platform/common.h"
"${CMAKE_SOURCE_DIR}/src/process.cpp"
"${CMAKE_SOURCE_DIR}/src/process.h"
"${CMAKE_SOURCE_DIR}/src/network.cpp"
"${CMAKE_SOURCE_DIR}/src/network.h"
"${CMAKE_SOURCE_DIR}/src/move_by_copy.h"
"${CMAKE_SOURCE_DIR}/src/system_tray.cpp"
"${CMAKE_SOURCE_DIR}/src/system_tray.h"
"${CMAKE_SOURCE_DIR}/src/system_tray_i18n.cpp"
"${CMAKE_SOURCE_DIR}/src/system_tray_i18n.h"
"${CMAKE_SOURCE_DIR}/src/task_pool.h"
"${CMAKE_SOURCE_DIR}/src/thread_pool.h"
"${CMAKE_SOURCE_DIR}/src/thread_safe.h"
"${CMAKE_SOURCE_DIR}/src/sync.h"
"${CMAKE_SOURCE_DIR}/src/round_robin.h"
"${CMAKE_SOURCE_DIR}/src/stat_trackers.h"
"${CMAKE_SOURCE_DIR}/src/stat_trackers.cpp"
"${CMAKE_SOURCE_DIR}/src/rswrapper.h"
"${CMAKE_SOURCE_DIR}/src/rswrapper.c"
${PLATFORM_TARGET_FILES})
if(NOT SUNSHINE_ASSETS_DIR_DEF)
set(SUNSHINE_ASSETS_DIR_DEF "${SUNSHINE_ASSETS_DIR}")
endif()
list(APPEND SUNSHINE_DEFINITIONS SUNSHINE_ASSETS_DIR="${SUNSHINE_ASSETS_DIR_DEF}")
list(APPEND SUNSHINE_DEFINITIONS SUNSHINE_TRAY=${SUNSHINE_TRAY})
# Publisher metadata - escape spaces for proper compilation
string(REPLACE " " "_" SUNSHINE_PUBLISHER_NAME_SAFE "${SUNSHINE_PUBLISHER_NAME}")
list(APPEND SUNSHINE_DEFINITIONS SUNSHINE_PUBLISHER_NAME="${SUNSHINE_PUBLISHER_NAME_SAFE}")
list(APPEND SUNSHINE_DEFINITIONS SUNSHINE_PUBLISHER_WEBSITE="${SUNSHINE_PUBLISHER_WEBSITE}")
list(APPEND SUNSHINE_DEFINITIONS SUNSHINE_PUBLISHER_ISSUE_URL="${SUNSHINE_PUBLISHER_ISSUE_URL}")
include_directories("${CMAKE_SOURCE_DIR}")
include_directories(
SYSTEM
"${CMAKE_SOURCE_DIR}/third-party"
"${CMAKE_SOURCE_DIR}/third-party/moonlight-common-c/enet/include"
"${CMAKE_SOURCE_DIR}/third-party/nanors"
"${CMAKE_SOURCE_DIR}/third-party/nanors/deps/obl"
${FFMPEG_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS} # has to be the last, or we get runtime error on macOS ffmpeg encoder
)
list(APPEND SUNSHINE_EXTERNAL_LIBRARIES
${MINIUPNP_LIBRARIES}
${CMAKE_THREAD_LIBS_INIT}
enet
nlohmann_json::nlohmann_json
opus
${FFMPEG_LIBRARIES}
${Boost_LIBRARIES}
${OPENSSL_LIBRARIES}
${PLATFORM_LIBRARIES})
================================================
FILE: cmake/compile_definitions/linux.cmake
================================================
# linux specific compile definitions
add_compile_definitions(SUNSHINE_PLATFORM="linux")
# AppImage
if(${SUNSHINE_BUILD_APPIMAGE})
# use relative assets path for AppImage
string(REPLACE "${CMAKE_INSTALL_PREFIX}" ".${CMAKE_INSTALL_PREFIX}" SUNSHINE_ASSETS_DIR_DEF ${SUNSHINE_ASSETS_DIR})
endif()
# cuda
set(CUDA_FOUND OFF)
if(${SUNSHINE_ENABLE_CUDA})
include(CheckLanguage)
check_language(CUDA)
if(CMAKE_CUDA_COMPILER)
set(CUDA_FOUND ON)
enable_language(CUDA)
message(STATUS "CUDA Compiler Version: ${CMAKE_CUDA_COMPILER_VERSION}")
set(CMAKE_CUDA_ARCHITECTURES "")
# https://tech.amikelive.com/node-930/cuda-compatibility-of-nvidia-display-gpu-drivers/
if(CMAKE_CUDA_COMPILER_VERSION VERSION_LESS 6.5)
list(APPEND CMAKE_CUDA_ARCHITECTURES 10)
elseif(CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 6.5)
list(APPEND CMAKE_CUDA_ARCHITECTURES 50 52)
endif()
if(CMAKE_CUDA_COMPILER_VERSION VERSION_LESS 7.0)
list(APPEND CMAKE_CUDA_ARCHITECTURES 11)
elseif(CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER 7.6)
list(APPEND CMAKE_CUDA_ARCHITECTURES 60 61 62)
endif()
# https://docs.nvidia.com/cuda/archive/9.2/cuda-compiler-driver-nvcc/index.html
if(CMAKE_CUDA_COMPILER_VERSION VERSION_LESS 9.0)
list(APPEND CMAKE_CUDA_ARCHITECTURES 20)
elseif(CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 9.0)
list(APPEND CMAKE_CUDA_ARCHITECTURES 70)
endif()
# https://docs.nvidia.com/cuda/archive/10.0/cuda-compiler-driver-nvcc/index.html
if(CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 10.0)
list(APPEND CMAKE_CUDA_ARCHITECTURES 72 75)
endif()
# https://docs.nvidia.com/cuda/archive/11.0/cuda-compiler-driver-nvcc/index.html
if(CMAKE_CUDA_COMPILER_VERSION VERSION_LESS 11.0)
list(APPEND CMAKE_CUDA_ARCHITECTURES 30
gitextract_wjclcvr9/ ├── .clang-format ├── .codeql-prebuild-cpp-Linux.sh ├── .codeql-prebuild-cpp-Windows.sh ├── .codeql-prebuild-cpp-macOS.sh ├── .coderabbit.yaml ├── .dockerignore ├── .flake8 ├── .gitattributes ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report_en.yml │ │ ├── bug_report_zh.yml │ │ ├── config.yml │ │ ├── feature_request_en.yml │ │ └── feature_request_zh.yml │ ├── RELEASE_TEMPLATE.md │ └── workflows/ │ ├── main.yml │ ├── sign-and-repackage.yml │ ├── test-signpath.yml │ ├── translate-simple.yml │ └── update-driver-versions.yml ├── .gitignore ├── .gitmodules ├── .prettierrc.json ├── .readthedocs.yaml ├── .rstcheck.cfg ├── CMakeLists.txt ├── CMakePresets.json ├── DOCKER_README.md ├── LICENSE ├── NOTICE ├── README.de.md ├── README.en.md ├── README.fr.md ├── README.ja.md ├── README.md ├── README.md.backup ├── cmake/ │ ├── FindLIBCAP.cmake │ ├── FindLIBDRM.cmake │ ├── FindLibva.cmake │ ├── FindSystemd.cmake │ ├── FindUdev.cmake │ ├── FindWayland.cmake │ ├── compile_definitions/ │ │ ├── common.cmake │ │ ├── linux.cmake │ │ ├── macos.cmake │ │ ├── unix.cmake │ │ └── windows.cmake │ ├── dependencies/ │ │ ├── Boost_Sunshine.cmake │ │ ├── common.cmake │ │ ├── libevdev_Sunshine.cmake │ │ ├── linux.cmake │ │ ├── macos.cmake │ │ ├── nlohmann_json.cmake │ │ ├── unix.cmake │ │ └── windows.cmake │ ├── macros/ │ │ ├── common.cmake │ │ ├── linux.cmake │ │ ├── macos.cmake │ │ ├── unix.cmake │ │ └── windows.cmake │ ├── packaging/ │ │ ├── ChineseSimplified.isl │ │ ├── FetchDriverDeps.cmake │ │ ├── FetchGUI.cmake │ │ ├── common.cmake │ │ ├── linux.cmake │ │ ├── macos.cmake │ │ ├── sunshine.iss.in │ │ ├── unix.cmake │ │ ├── windows.cmake │ │ ├── windows_innosetup.cmake │ │ ├── windows_nsis.cmake │ │ └── windows_wix.cmake │ ├── prep/ │ │ ├── build_version.cmake │ │ ├── constants.cmake │ │ ├── init.cmake │ │ ├── options.cmake │ │ └── special_package_configuration.cmake │ └── targets/ │ ├── common.cmake │ ├── linux.cmake │ ├── macos.cmake │ ├── unix.cmake │ └── windows.cmake ├── codecov.yml ├── crowdin.yml ├── docker/ │ ├── archlinux.dockerfile │ ├── clion-toolchain.dockerfile │ ├── debian-bookworm.dockerfile │ ├── fedora-39.dockerfile │ ├── fedora-40.dockerfile │ ├── ubuntu-22.04.dockerfile │ └── ubuntu-24.04.dockerfile ├── docs/ │ ├── Doxyfile │ ├── Doxyfile-1.10.0-default │ ├── WEBUI_DEVELOPMENT.md │ ├── WGC_vs_DDAPI_Smoothness_Fun_Guide.md │ ├── app_examples.md │ ├── building.md │ ├── changelog.md │ ├── configuration.md │ ├── contributing.md │ ├── gamestream_migration.md │ ├── getting_started.md │ ├── guides.md │ ├── legal.md │ ├── performance_tuning.md │ ├── run_command_dev_guide.md │ ├── source/ │ │ ├── about/ │ │ │ └── advanced_usage.rst │ │ └── source_code/ │ │ └── src/ │ │ ├── display_device/ │ │ │ ├── display_device.rst │ │ │ ├── parsed_config.rst │ │ │ ├── session.rst │ │ │ ├── settings.rst │ │ │ └── to_string.rst │ │ └── platform/ │ │ └── windows/ │ │ └── display_device/ │ │ ├── settings_data.rst │ │ ├── settings_topology.rst │ │ └── windows_utils.rst │ ├── third_party_packages.md │ ├── troubleshooting.md │ └── webhook_format.md ├── gh-pages-template/ │ └── index.html ├── package.json ├── scripts/ │ ├── README_I18N.md │ ├── _locale.py │ ├── format-i18n.js │ ├── generate-checksums.ps1 │ ├── icons/ │ │ └── convert_and_pack.sh │ ├── linux_build.sh │ ├── requirements.txt │ ├── reverse-sync-i18n.js │ ├── update_clang_format.py │ ├── validate-i18n.js │ └── vmouse_smoke.ps1 ├── src/ │ ├── abr.cpp │ ├── abr.h │ ├── amf/ │ │ ├── amf_config.h │ │ ├── amf_d3d11.cpp │ │ ├── amf_d3d11.h │ │ ├── amf_encoded_frame.h │ │ └── amf_encoder.h │ ├── assets/ │ │ └── abr_prompt.md │ ├── audio.cpp │ ├── audio.h │ ├── cbs.cpp │ ├── cbs.h │ ├── config.cpp │ ├── config.h │ ├── confighttp.cpp │ ├── confighttp.h │ ├── crypto.cpp │ ├── crypto.h │ ├── display_device/ │ │ ├── display_device.h │ │ ├── parsed_config.cpp │ │ ├── parsed_config.h │ │ ├── session.cpp │ │ ├── session.h │ │ ├── settings.cpp │ │ ├── settings.h │ │ ├── to_string.cpp │ │ ├── to_string.h │ │ ├── vdd_utils.cpp │ │ └── vdd_utils.h │ ├── entry_handler.cpp │ ├── entry_handler.h │ ├── file_handler.cpp │ ├── file_handler.h │ ├── globals.cpp │ ├── globals.h │ ├── httpcommon.cpp │ ├── httpcommon.h │ ├── input.cpp │ ├── input.h │ ├── logging.cpp │ ├── logging.h │ ├── main.cpp │ ├── main.h │ ├── move_by_copy.h │ ├── network.cpp │ ├── network.h │ ├── nvenc/ │ │ ├── common_impl/ │ │ │ ├── nvenc_base.cpp │ │ │ ├── nvenc_base.h │ │ │ ├── nvenc_utils.cpp │ │ │ └── nvenc_utils.h │ │ ├── nvenc_config.h │ │ ├── nvenc_encoded_frame.h │ │ ├── nvenc_encoder.h │ │ └── win/ │ │ ├── impl/ │ │ │ ├── nvenc_d3d11_base.cpp │ │ │ ├── nvenc_d3d11_base.h │ │ │ ├── nvenc_d3d11_native.cpp │ │ │ ├── nvenc_d3d11_native.h │ │ │ ├── nvenc_d3d11_on_cuda.cpp │ │ │ ├── nvenc_d3d11_on_cuda.h │ │ │ ├── nvenc_dynamic_factory_1100.cpp │ │ │ ├── nvenc_dynamic_factory_1100.h │ │ │ ├── nvenc_dynamic_factory_1200.cpp │ │ │ ├── nvenc_dynamic_factory_1200.h │ │ │ ├── nvenc_dynamic_factory_1202.cpp │ │ │ ├── nvenc_dynamic_factory_1202.h │ │ │ ├── nvenc_dynamic_factory_blueprint.h │ │ │ └── nvenc_shared_dll.h │ │ ├── nvenc_d3d11.h │ │ ├── nvenc_dynamic_factory.cpp │ │ └── nvenc_dynamic_factory.h │ ├── nvhttp.cpp │ ├── nvhttp.h │ ├── platform/ │ │ ├── common.h │ │ ├── linux/ │ │ │ ├── audio.cpp │ │ │ ├── cuda.cpp │ │ │ ├── cuda.cu │ │ │ ├── cuda.h │ │ │ ├── display_device.cpp │ │ │ ├── graphics.cpp │ │ │ ├── graphics.h │ │ │ ├── input/ │ │ │ │ ├── inputtino.cpp │ │ │ │ ├── inputtino_common.h │ │ │ │ ├── inputtino_gamepad.cpp │ │ │ │ ├── inputtino_gamepad.h │ │ │ │ ├── inputtino_keyboard.cpp │ │ │ │ ├── inputtino_keyboard.h │ │ │ │ ├── inputtino_mouse.cpp │ │ │ │ ├── inputtino_mouse.h │ │ │ │ ├── inputtino_pen.cpp │ │ │ │ ├── inputtino_pen.h │ │ │ │ ├── inputtino_touch.cpp │ │ │ │ ├── inputtino_touch.h │ │ │ │ └── legacy_input.cpp │ │ │ ├── kmsgrab.cpp │ │ │ ├── misc.cpp │ │ │ ├── misc.h │ │ │ ├── publish.cpp │ │ │ ├── vaapi.cpp │ │ │ ├── vaapi.h │ │ │ ├── wayland.cpp │ │ │ ├── wayland.h │ │ │ ├── wlgrab.cpp │ │ │ ├── x11grab.cpp │ │ │ └── x11grab.h │ │ ├── macos/ │ │ │ ├── av_audio.h │ │ │ ├── av_audio.m │ │ │ ├── av_img_t.h │ │ │ ├── av_video.h │ │ │ ├── av_video.m │ │ │ ├── display.mm │ │ │ ├── display_device.cpp │ │ │ ├── input.cpp │ │ │ ├── microphone.mm │ │ │ ├── misc.h │ │ │ ├── misc.mm │ │ │ ├── nv12_zero_device.cpp │ │ │ ├── nv12_zero_device.h │ │ │ └── publish.cpp │ │ ├── run_command.h │ │ └── windows/ │ │ ├── PolicyConfig.h │ │ ├── audio.cpp │ │ ├── display.h │ │ ├── display_amd.cpp │ │ ├── display_base.cpp │ │ ├── display_device/ │ │ │ ├── device_hdr_states.cpp │ │ │ ├── device_modes.cpp │ │ │ ├── device_topology.cpp │ │ │ ├── general_functions.cpp │ │ │ ├── session_listener.cpp │ │ │ ├── session_listener.h │ │ │ ├── settings.cpp │ │ │ ├── settings_topology.cpp │ │ │ ├── settings_topology.h │ │ │ ├── windows_utils.cpp │ │ │ └── windows_utils.h │ │ ├── display_ram.cpp │ │ ├── display_vram.cpp │ │ ├── display_wgc.cpp │ │ ├── dsu_server.cpp │ │ ├── dsu_server.h │ │ ├── ftime_compat.cpp │ │ ├── input.cpp │ │ ├── keylayout.h │ │ ├── mic_write.cpp │ │ ├── mic_write.h │ │ ├── misc.cpp │ │ ├── misc.h │ │ ├── nvprefs/ │ │ │ ├── driver_settings.cpp │ │ │ ├── driver_settings.h │ │ │ ├── nvapi_opensource_wrapper.cpp │ │ │ ├── nvprefs_common.cpp │ │ │ ├── nvprefs_common.h │ │ │ ├── nvprefs_interface.cpp │ │ │ ├── nvprefs_interface.h │ │ │ ├── undo_data.cpp │ │ │ ├── undo_data.h │ │ │ ├── undo_file.cpp │ │ │ └── undo_file.h │ │ ├── publish.cpp │ │ ├── virtual_mouse.cpp │ │ ├── virtual_mouse.h │ │ ├── win_dark_mode.cpp │ │ ├── win_dark_mode.h │ │ └── windows.rc.in │ ├── process.cpp │ ├── process.h │ ├── round_robin.h │ ├── rswrapper.c │ ├── rswrapper.h │ ├── rtsp.cpp │ ├── rtsp.h │ ├── stat_trackers.cpp │ ├── stat_trackers.h │ ├── stb_image.h │ ├── stb_image_write.h │ ├── stream.cpp │ ├── stream.h │ ├── sync.h │ ├── system_tray.cpp │ ├── system_tray.h │ ├── system_tray_i18n.cpp │ ├── system_tray_i18n.h │ ├── task_pool.h │ ├── thread_pool.h │ ├── thread_safe.h │ ├── upnp.cpp │ ├── upnp.h │ ├── utility.h │ ├── uuid.h │ ├── version.h.in │ ├── video.cpp │ ├── video.h │ ├── video_colorspace.cpp │ ├── video_colorspace.h │ ├── webhook.cpp │ ├── webhook.h │ ├── webhook_format.cpp │ ├── webhook_format.h │ ├── webhook_httpsclient.cpp │ └── webhook_httpsclient.h ├── src_assets/ │ ├── common/ │ │ └── assets/ │ │ └── web/ │ │ ├── apps.html │ │ ├── components/ │ │ │ ├── AccordionItem.vue │ │ │ ├── AppCard.vue │ │ │ ├── AppEditor.vue │ │ │ ├── AppListItem.vue │ │ │ ├── Checkbox.vue │ │ │ ├── CheckboxField.vue │ │ │ ├── CommandTable.vue │ │ │ ├── CoverFinder.vue │ │ │ ├── FormField.vue │ │ │ ├── ImageSelector.vue │ │ │ ├── LogDiagnosisModal.vue │ │ │ ├── LogsSection.vue │ │ │ ├── ScanResultModal.vue │ │ │ ├── SetupWizard.vue │ │ │ ├── TroubleshootingCard.vue │ │ │ ├── common/ │ │ │ │ ├── ErrorLogs.vue │ │ │ │ ├── Icon.vue │ │ │ │ ├── Locale.vue │ │ │ │ ├── ResourceCard.vue │ │ │ │ ├── ThemeToggle.vue │ │ │ │ └── VersionCard.vue │ │ │ └── layout/ │ │ │ ├── Navbar.vue │ │ │ └── PlatformLayout.vue │ │ ├── composables/ │ │ │ ├── useAiDiagnosis.js │ │ │ ├── useApps.js │ │ │ ├── useBackground.js │ │ │ ├── useConfig.js │ │ │ ├── useLogout.js │ │ │ ├── useLogs.js │ │ │ ├── usePin.js │ │ │ ├── useQrPair.js │ │ │ ├── useSetupWizard.js │ │ │ ├── useTheme.js │ │ │ ├── useTroubleshooting.js │ │ │ ├── useVersion.js │ │ │ └── useWelcome.js │ │ ├── config/ │ │ │ ├── firebase.js │ │ │ └── i18n.js │ │ ├── config.html │ │ ├── configs/ │ │ │ └── tabs/ │ │ │ ├── Advanced.vue │ │ │ ├── AudioVideo.vue │ │ │ ├── ContainerEncoders.vue │ │ │ ├── Files.vue │ │ │ ├── General.vue │ │ │ ├── Inputs.vue │ │ │ ├── Network.vue │ │ │ ├── audiovideo/ │ │ │ │ ├── AdapterNameSelector.vue │ │ │ │ ├── DisplayDeviceOptions.vue │ │ │ │ ├── DisplayModesSettings.vue │ │ │ │ ├── ExperimentalFeatures.vue │ │ │ │ ├── LegacyDisplayOutputSelector.vue │ │ │ │ ├── NewDisplayOutputSelector.vue │ │ │ │ └── VirtualDisplaySettings.vue │ │ │ └── encoders/ │ │ │ ├── AmdAmfEncoder.vue │ │ │ ├── IntelQuickSyncEncoder.vue │ │ │ ├── NvidiaNvencEncoder.vue │ │ │ ├── SoftwareEncoder.vue │ │ │ └── VideotoolboxEncoder.vue │ │ ├── fonts/ │ │ │ └── fonts.css │ │ ├── index.html │ │ ├── init.js │ │ ├── password.html │ │ ├── pin.html │ │ ├── platform-i18n.js │ │ ├── public/ │ │ │ └── assets/ │ │ │ ├── css/ │ │ │ │ └── sunshine.css │ │ │ └── locale/ │ │ │ ├── bg.json │ │ │ ├── cs.json │ │ │ ├── de.json │ │ │ ├── en.json │ │ │ ├── en_GB.json │ │ │ ├── en_US.json │ │ │ ├── es.json │ │ │ ├── fr.json │ │ │ ├── it.json │ │ │ ├── ja.json │ │ │ ├── ko.json │ │ │ ├── pl.json │ │ │ ├── pt.json │ │ │ ├── pt_BR.json │ │ │ ├── ru.json │ │ │ ├── sv.json │ │ │ ├── tr.json │ │ │ ├── uk.json │ │ │ ├── zh.json │ │ │ └── zh_TW.json │ │ ├── scripts/ │ │ │ └── extract-welcome-locales.js │ │ ├── services/ │ │ │ └── appService.js │ │ ├── styles/ │ │ │ ├── apps.less │ │ │ ├── global.less │ │ │ ├── modal-glass.less │ │ │ ├── var.css │ │ │ └── welcome.less │ │ ├── sunshine_version.js │ │ ├── template_header.html │ │ ├── template_header_dev.html │ │ ├── troubleshooting.html │ │ ├── utils/ │ │ │ ├── README.md │ │ │ ├── constants.js │ │ │ ├── coverSearch.js │ │ │ ├── errorHandler.js │ │ │ ├── fileSelection.js │ │ │ ├── helpers.js │ │ │ ├── imageUtils.js │ │ │ ├── steamApi.js │ │ │ ├── theme.js │ │ │ └── validation.js │ │ ├── views/ │ │ │ ├── Apps.vue │ │ │ ├── Config.vue │ │ │ ├── Home.vue │ │ │ ├── Password.vue │ │ │ ├── Pin.vue │ │ │ ├── Troubleshooting.vue │ │ │ └── Welcome.vue │ │ └── welcome.html.template │ ├── linux/ │ │ ├── assets/ │ │ │ ├── apps.json │ │ │ └── shaders/ │ │ │ └── opengl/ │ │ │ ├── ConvertUV.frag │ │ │ ├── ConvertUV.vert │ │ │ ├── ConvertY.frag │ │ │ ├── Scene.frag │ │ │ └── Scene.vert │ │ └── misc/ │ │ ├── 60-sunshine.rules │ │ └── postinst │ ├── macos/ │ │ ├── assets/ │ │ │ ├── Info.plist │ │ │ └── apps.json │ │ └── misc/ │ │ └── uninstall_pkg.sh │ └── windows/ │ ├── assets/ │ │ ├── apps.json │ │ └── shaders/ │ │ └── directx/ │ │ ├── convert_yuv420_packed_uv_bicubic_ps.hlsl │ │ ├── convert_yuv420_packed_uv_bicubic_ps_hybrid_log_gamma.hlsl │ │ ├── convert_yuv420_packed_uv_bicubic_ps_linear.hlsl │ │ ├── convert_yuv420_packed_uv_bicubic_ps_perceptual_quantizer.hlsl │ │ ├── convert_yuv420_packed_uv_bicubic_vs.hlsl │ │ ├── convert_yuv420_packed_uv_type0_ps.hlsl │ │ ├── convert_yuv420_packed_uv_type0_ps_hybrid_log_gamma.hlsl │ │ ├── convert_yuv420_packed_uv_type0_ps_linear.hlsl │ │ ├── convert_yuv420_packed_uv_type0_ps_perceptual_quantizer.hlsl │ │ ├── convert_yuv420_packed_uv_type0_vs.hlsl │ │ ├── convert_yuv420_packed_uv_type0s_ps.hlsl │ │ ├── convert_yuv420_packed_uv_type0s_ps_hybrid_log_gamma.hlsl │ │ ├── convert_yuv420_packed_uv_type0s_ps_linear.hlsl │ │ ├── convert_yuv420_packed_uv_type0s_ps_perceptual_quantizer.hlsl │ │ ├── convert_yuv420_packed_uv_type0s_vs.hlsl │ │ ├── convert_yuv420_planar_y_bicubic_ps.hlsl │ │ ├── convert_yuv420_planar_y_bicubic_ps_hybrid_log_gamma.hlsl │ │ ├── convert_yuv420_planar_y_bicubic_ps_linear.hlsl │ │ ├── convert_yuv420_planar_y_bicubic_ps_perceptual_quantizer.hlsl │ │ ├── convert_yuv420_planar_y_ps.hlsl │ │ ├── convert_yuv420_planar_y_ps_hybrid_log_gamma.hlsl │ │ ├── convert_yuv420_planar_y_ps_linear.hlsl │ │ ├── convert_yuv420_planar_y_ps_perceptual_quantizer.hlsl │ │ ├── convert_yuv420_planar_y_vs.hlsl │ │ ├── convert_yuv444_packed_ayuv_ps.hlsl │ │ ├── convert_yuv444_packed_ayuv_ps_linear.hlsl │ │ ├── convert_yuv444_packed_vs.hlsl │ │ ├── convert_yuv444_packed_y410_ps.hlsl │ │ ├── convert_yuv444_packed_y410_ps_hybrid_log_gamma.hlsl │ │ ├── convert_yuv444_packed_y410_ps_linear.hlsl │ │ ├── convert_yuv444_packed_y410_ps_perceptual_quantizer.hlsl │ │ ├── convert_yuv444_planar_ps.hlsl │ │ ├── convert_yuv444_planar_ps_hybrid_log_gamma.hlsl │ │ ├── convert_yuv444_planar_ps_linear.hlsl │ │ ├── convert_yuv444_planar_ps_perceptual_quantizer.hlsl │ │ ├── convert_yuv444_planar_vs.hlsl │ │ ├── cursor_ps.hlsl │ │ ├── cursor_ps_normalize_white.hlsl │ │ ├── cursor_vs.hlsl │ │ ├── hdr_luminance_analysis_cs.hlsl │ │ ├── hdr_luminance_reduce_cs.hlsl │ │ ├── include/ │ │ │ ├── base_vs.hlsl │ │ │ ├── base_vs_types.hlsl │ │ │ ├── common.hlsl │ │ │ ├── convert_base.hlsl │ │ │ ├── convert_hybrid_log_gamma_base.hlsl │ │ │ ├── convert_linear_base.hlsl │ │ │ ├── convert_perceptual_quantizer_base.hlsl │ │ │ ├── convert_yuv420_packed_uv_bicubic_ps_base.hlsl │ │ │ ├── convert_yuv420_packed_uv_ps_base.hlsl │ │ │ ├── convert_yuv420_planar_y_bicubic_ps_base.hlsl │ │ │ ├── convert_yuv420_planar_y_ps_base.hlsl │ │ │ └── convert_yuv444_ps_base.hlsl │ │ ├── simple_cursor_ps.hlsl │ │ └── simple_cursor_vs.hlsl │ └── misc/ │ ├── autostart/ │ │ └── autostart-service.bat │ ├── firewall/ │ │ ├── add-firewall-rule.bat │ │ └── delete-firewall-rule.bat │ ├── gamepad/ │ │ ├── install-gamepad.bat │ │ └── uninstall-gamepad.bat │ ├── install_portable.bat │ ├── languages/ │ │ ├── de-DE.lang │ │ ├── en-US.lang │ │ ├── fr-FR.lang │ │ ├── ja-JP.lang │ │ ├── ru-RU.lang │ │ └── zh-Simple.lang │ ├── migration/ │ │ ├── IMAGE_MIGRATION.md │ │ ├── migrate-config.bat │ │ └── migrate-images.ps1 │ ├── path/ │ │ └── update-path.bat │ ├── service/ │ │ ├── install-service.bat │ │ ├── sleep.bat │ │ └── uninstall-service.bat │ ├── uninstall_portable.bat │ ├── vdd/ │ │ ├── driver/ │ │ │ └── vdd_settings.xml │ │ ├── install-vdd.bat │ │ └── uninstall-vdd.bat │ ├── vmouse/ │ │ ├── driver/ │ │ │ ├── README.md │ │ │ └── ZakoVirtualMouse.cer │ │ ├── install-vmouse.bat │ │ └── uninstall-vmouse.bat │ └── vsink/ │ ├── install-vsink.bat │ └── uninstall-vsink.bat ├── sunshine.icns ├── tests/ │ ├── CMakeLists.txt │ ├── tests_common.h │ ├── tests_environment.h │ ├── tests_events.h │ ├── tests_log_checker.h │ ├── tests_main.cpp │ ├── tools/ │ │ ├── vmouse_logging_stubs.cpp │ │ ├── vmouse_probe.cpp │ │ └── vmouse_send_diag.cpp │ └── unit/ │ ├── platform/ │ │ ├── test_common.cpp │ │ └── windows/ │ │ └── test_virtual_mouse.cpp │ ├── test_audio.cpp │ ├── test_entry_handler.cpp │ ├── test_file_handler.cpp │ ├── test_httpcommon.cpp │ ├── test_logging.cpp │ ├── test_mouse.cpp │ ├── test_network.cpp │ ├── test_rswrapper.cpp │ ├── test_stream.cpp │ ├── test_video.cpp │ ├── test_webhook.cpp │ └── test_webhook_config.cpp ├── third-party/ │ ├── .clang-format-ignore │ ├── glad/ │ │ ├── include/ │ │ │ ├── EGL/ │ │ │ │ └── eglplatform.h │ │ │ ├── KHR/ │ │ │ │ └── khrplatform.h │ │ │ └── glad/ │ │ │ ├── egl.h │ │ │ └── gl.h │ │ └── src/ │ │ ├── egl.c │ │ └── gl.c │ └── nvfbc/ │ ├── NvFBC.h │ └── helper_math.h ├── tools/ │ ├── CMakeLists.txt │ ├── audio.cpp │ ├── build-qiin-tabtip.sh │ ├── dxgi.cpp │ ├── qiin-tabtip.cpp │ ├── sunshinesvc.cpp │ └── test_args.cpp ├── translate_simple.py ├── vite-plugin-ejs-v7.js ├── vite.config.js └── vite.dev.config.js
Showing preview only (206K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3004 symbols across 252 files)
FILE: scripts/_locale.py
function x_extract (line 45) | def x_extract():
function babel_init (line 107) | def babel_init(locale_code: str):
function babel_update (line 125) | def babel_update():
function babel_compile (line 140) | def babel_compile():
FILE: scripts/format-i18n.js
function sortObjectKeys (line 30) | function sortObjectKeys(obj) {
function formatJsonFile (line 48) | function formatJsonFile(filePath) {
function formatLocales (line 71) | function formatLocales() {
FILE: scripts/reverse-sync-i18n.js
function getAllKeys (line 30) | function getAllKeys(obj, prefix = '') {
function getValue (line 46) | function getValue(obj, path) {
function setValue (line 53) | function setValue(obj, path, value) {
function reverseSyncLocales (line 68) | function reverseSyncLocales() {
FILE: scripts/update_clang_format.py
function clang_format (line 21) | def clang_format(file: str):
function main (line 26) | def main():
FILE: scripts/validate-i18n.js
function getAllKeys (line 30) | function getAllKeys(obj, prefix = '') {
function getValue (line 46) | function getValue(obj, path) {
function setValue (line 53) | function setValue(obj, path, value) {
function removeKey (line 68) | function removeKey(obj, keyPath) {
function sortObjectKeys (line 100) | function sortObjectKeys(obj) {
function getEnglishOnlyKeys (line 119) | function getEnglishOnlyKeys() {
function shouldSkipTranslationCheck (line 151) | function shouldSkipTranslationCheck(key, value) {
function findUntranslatedKeys (line 181) | function findUntranslatedKeys(baseContent, localeContent, localeFile) {
function validateLocales (line 209) | function validateLocales() {
FILE: src/abr.cpp
type abr (line 35) | namespace abr {
function network_feedback_t (line 43) | static network_feedback_t
type foreground_info_t (line 62) | struct foreground_info_t {
function foreground_info_t (line 68) | static foreground_info_t
function mode_to_string (line 119) | static std::string
function replace_placeholders (line 172) | static std::string
function build_llm_prompt (line 188) | static std::string
type llm_params_t (line 229) | struct llm_params_t {
function llm_params_t (line 235) | static const llm_params_t &
function build_llm_request (line 261) | static std::string
function action_t (line 280) | static action_t
function action_t (line 337) | static action_t
function enable (line 373) | void
function disable (line 444) | void
function is_enabled (line 451) | bool
function llm_worker (line 463) | static void
function action_t (line 489) | action_t
function capabilities_t (line 602) | capabilities_t
function cleanup (line 607) | void
FILE: src/abr.h
function namespace (line 22) | namespace abr {
FILE: src/amf/amf_config.h
function namespace (line 10) | namespace amf {
FILE: src/amf/amf_d3d11.cpp
type amf (line 22) | namespace amf {
function AMF_SURFACE_FORMAT (line 80) | AMF_SURFACE_FORMAT
function wchar_t (line 92) | const wchar_t *
function amf_encoded_frame (line 606) | amf_encoded_frame
function create_amf_d3d11 (line 943) | std::unique_ptr<amf_d3d11>
FILE: src/amf/amf_d3d11.h
function namespace (line 18) | namespace amf {
FILE: src/amf/amf_encoded_frame.h
function namespace (line 10) | namespace amf {
FILE: src/amf/amf_encoder.h
function namespace (line 14) | namespace amf {
FILE: src/audio.cpp
type audio (line 20) | namespace audio {
function encodeThread (line 102) | void encodeThread(sample_queue_t samples, config_t config, void *chann...
function capture (line 158) | void capture(safe::mail_t mail, config_t config, void *channel_data) {
function audio_ctx_ref_t (line 294) | audio_ctx_ref_t get_audio_ctx_ref() {
function has_audio_ctx_ref (line 299) | bool has_audio_ctx_ref() {
function is_audio_ctx_sink_available (line 303) | bool is_audio_ctx_sink_available(const audio_ctx_t &ctx) {
function map_stream (line 316) | int map_stream(int channels, bool quality) {
function start_audio_control (line 337) | int start_audio_control(audio_ctx_t &ctx) {
function stop_audio_control (line 364) | void stop_audio_control(audio_ctx_t &ctx) {
function apply_surround_params (line 384) | void apply_surround_params(opus_stream_config_t &stream, const stream_...
function init_mic_redirect_device (line 391) | int init_mic_redirect_device() {
function release_mic_redirect_device (line 407) | void release_mic_redirect_device() {
function write_mic_data (line 423) | int write_mic_data(const std::uint8_t *data, size_t size, uint16_t seq) {
FILE: src/audio.h
function namespace (line 14) | namespace audio {
FILE: src/cbs.cpp
type cbs (line 18) | namespace cbs {
function close (line 19) | void
class frag_t (line 26) | class frag_t: public CodedBitstreamFragment {
method frag_t (line 28) | frag_t(frag_t &&o) {
method frag_t (line 35) | frag_t() {
method frag_t (line 39) | frag_t &
function write (line 56) | util::buffer_t<std::uint8_t>
function write (line 82) | util::buffer_t<std::uint8_t>
function h264_t (line 90) | h264_t
function hevc_t (line 147) | hevc_t
function validate_sps (line 225) | bool
FILE: src/cbs.h
type AVPacket (line 9) | struct AVPacket
type AVCodecContext (line 10) | struct AVCodecContext
function namespace (line 12) | namespace cbs {
FILE: src/config.cpp
type config (line 50) | namespace config {
type nv (line 52) | namespace nv {
function twopass_from_view (line 54) | nvenc::nvenc_two_pass
function split_encode_from_view (line 63) | nvenc::nvenc_split_frame_encoding
function lookahead_level_from_view (line 76) | nvenc::nvenc_lookahead_level
function temporal_filter_level_from_view (line 88) | nvenc::nvenc_temporal_filter_level
function rate_control_mode_from_view (line 97) | nvenc::nvenc_rate_control_mode
type amd (line 108) | namespace amd {
type quality_av1_e (line 159) | enum class quality_av1_e : int {
type quality_hevc_e (line 165) | enum class quality_hevc_e : int {
type quality_h264_e (line 171) | enum class quality_h264_e : int {
type rc_av1_e (line 177) | enum class rc_av1_e : int {
type rc_hevc_e (line 187) | enum class rc_hevc_e : int {
type rc_h264_e (line 197) | enum class rc_h264_e : int {
type usage_av1_e (line 207) | enum class usage_av1_e : int {
type usage_hevc_e (line 215) | enum class usage_hevc_e : int {
type usage_h264_e (line 223) | enum class usage_h264_e : int {
type coder_e (line 231) | enum coder_e : int {
function quality_from_view (line 238) | std::optional<int>
function rc_from_view (line 250) | std::optional<int>
function usage_from_view (line 266) | std::optional<int>
function coder_from_view (line 279) | int
type qsv (line 289) | namespace qsv {
type preset_e (line 290) | enum preset_e : int {
type cavlc_e (line 300) | enum cavlc_e : int {
function preset_from_view (line 306) | std::optional<int>
function coder_from_view (line 321) | std::optional<int>
type vt (line 331) | namespace vt {
type coder_e (line 333) | enum coder_e : int {
function coder_from_view (line 339) | int
function allow_software_from_view (line 348) | int
function force_software_from_view (line 355) | int
function rt_from_view (line 362) | int
type sw (line 371) | namespace sw {
function svtav1_preset_from_view (line 372) | int
function endline (line 572) | bool
function space_tab (line 577) | bool
function whitespace (line 582) | bool
function to_string (line 587) | std::string
function It (line 604) | It
function parse_config (line 661) | std::unordered_map<std::string, std::string>
function string_f (line 687) | void
function generic_f (line 700) | void
function string_restricted_f (line 709) | void
function path_f (line 722) | void
function path_f (line 747) | void
function int_f (line 756) | void
function int_f (line 782) | void
function int_f (line 809) | void
function int_f (line 819) | void
function int_between_f (line 828) | void
function to_bool (line 840) | bool
function bool_f (line 852) | void
function double_f (line 864) | void
function double_between_f (line 883) | void
function list_string_f (line 895) | void
function list_display_mode_remapping_f (line 938) | void
function list_prep_cmd_f (line 972) | void
function list_int_f (line 999) | void
function map_int_int_f (line 1034) | void
function apply_flags (line 1054) | int
function apply_config (line 1093) | void apply_config(std::unordered_map<std::string, std::string> &&vars) {
function parse (line 1483) | int
function update_config (line 1640) | bool
function update_full_config (line 1697) | bool
FILE: src/config.h
function namespace (line 18) | namespace config {
FILE: src/confighttp.cpp
type confighttp (line 70) | namespace confighttp {
type op_e (line 84) | enum class op_e {
function print_req (line 89) | void
function send_response (line 127) | void send_response(resp_https_t response, const nlohmann::json &output...
function send_unauthorized (line 135) | void
function handleLogout (line 150) | void
function send_redirect (line 171) | void
function authenticate (line 181) | bool
function not_found (line 244) | void
function close_connection (line 258) | void
function getHtmlPage (line 265) | void
function getIndexPage (line 280) | void
function getPinPage (line 285) | void
function getAppsPage (line 290) | void
function getClientsPage (line 295) | void
function getConfigPage (line 300) | void
function getPasswordPage (line 305) | void
function getWelcomePage (line 310) | void
function getTroubleshootingPage (line 326) | void
function getStaticResource (line 334) | void
function getFaviconImage (line 344) | void
function getSunshineLogoImage (line 349) | void
function isChildPath (line 357) | bool
function getBoxArt (line 363) | void
function getNodeModules (line 455) | void
function getApps (line 489) | void
type LogCacheSnapshot (line 504) | struct LogCacheSnapshot {
function try_incremental_log_read (line 515) | static std::shared_ptr<const std::string> try_incremental_log_read(
function read_file_range (line 539) | static std::shared_ptr<const std::string>
function getLogs (line 567) | void
function saveApp (line 728) | void
function deleteApp (line 827) | void
function uploadCover (line 891) | void
function getConfig (line 969) | void
function getLocale (line 1014) | void
function split (line 1032) | std::vector<std::string>
function saveVddSettings (line 1044) | bool
function saveConfig (line 1157) | void
function restart (line 1216) | void
function boom (line 1226) | void
function resetDisplayDevicePersistence (line 1238) | void
function savePassword (line 1255) | void
function savePin (line 1325) | void
function getQrPairStatus (line 1399) | void
function generateQrPairInfo (line 1414) | void
function cancelQrPair (line 1526) | void
function unpairAll (line 1542) | void
function unpair (line 1560) | void
function renameClient (line 1598) | void
function listClients (line 1639) | void
function closeApp (line 1651) | void
function getRuntimeSessions (line 1669) | void
function changeRuntimeBitrate (line 1756) | void
function proxySteamApi (line 1924) | void
function proxySteamStore (line 1975) | void
function getAiConfigPath (line 2036) | static std::string
function loadAiConfigLocked (line 2045) | static nlohmann::json
function loadAiConfig (line 2075) | static nlohmann::json
function saveAiConfigLocked (line 2084) | static bool
function isAnthropicProvider (line 2104) | static bool
function convertToAnthropicFormat (line 2114) | static std::string
function convertFromAnthropicFormat (line 2151) | static std::string
function getAiConfig (line 2195) | void
function saveAiConfigEndpoint (line 2220) | void
function proxyAiChat (line 2270) | void
function handleAiCors (line 2328) | void
function isAiEnabled (line 2338) | bool
function prepareAiRequest (line 2350) | static bool
function AiProxyResult (line 2423) | AiProxyResult
type StreamCallbackContext (line 2460) | struct StreamCallbackContext {
function stream_func_callback (line 2464) | static size_t
function AiProxyResult (line 2472) | AiProxyResult
function calculate_file_hash (line 2528) | std::string
function extract_executable_path (line 2583) | std::string
function testMenuCmd (line 2613) | void
function start (line 2737) | void
FILE: src/confighttp.h
function namespace (line 14) | namespace confighttp {
FILE: src/crypto.cpp
type crypto (line 9) | namespace crypto {
function openssl_verify_cb (line 26) | static int
type cipher (line 126) | namespace cipher {
function init_decrypt_gcm (line 128) | static int
function init_encrypt_gcm (line 152) | static int
function init_encrypt_cbc (line 173) | static int
function init_decrypt_cbc (line 187) | static int
function aes_t (line 404) | aes_t
function sha256_t (line 421) | sha256_t
function x509_t (line 428) | x509_t
function pkey_t (line 440) | pkey_t
function pem (line 452) | std::string
function pem (line 463) | std::string
function signature (line 474) | std::string_view
function rand (line 484) | std::string
function sign (line 494) | std::vector<uint8_t>
function creds_t (line 519) | creds_t
function sign256 (line 565) | std::vector<uint8_t>
function verify (line 570) | bool
function verify256 (line 591) | bool
function md_ctx_destroy (line 596) | void
function rand_alphabet (line 601) | std::string
FILE: src/crypto.h
function namespace (line 15) | namespace crypto {
FILE: src/display_device/display_device.h
type class (line 19) | enum class
type class (line 28) | enum class
type device_info_t (line 47) | struct device_info_t {
type display_mode_t (line 88) | struct display_mode_t {
FILE: src/display_device/parsed_config.cpp
type display_device (line 21) | namespace display_device {
function parse_resolution_string (line 43) | bool
function parse_refresh_rate_string (line 104) | bool
function parse_resolution_option (line 182) | bool
function parse_refresh_rate_option (line 249) | bool
function remap_display_modes_if_needed (line 298) | bool
function parse_hdr_option (line 480) | boost::optional<bool>
function numeric_enum_fallback (line 501) | int
function make_parsed_config (line 602) | boost::optional<parsed_config_t>
FILE: src/display_device/parsed_config.h
function namespace (line 7) | namespace config {
function namespace (line 10) | namespace rtsp_stream {
function namespace (line 14) | namespace display_device {
FILE: src/display_device/session.cpp
type display_device (line 18) | namespace display_device {
class session_t::StateRetryTimer (line 20) | class session_t::StateRetryTimer {
method StateRetryTimer (line 27) | StateRetryTimer(std::mutex &mutex, std::chrono::seconds timeout = st...
method setup_timer (line 91) | void
method wake_up_thread (line 113) | void
function session_t (line 142) | session_t &
function get_client_id_from_session (line 186) | std::string
function wait_for_vdd_device (line 210) | bool
function try_recover_vdd_device (line 241) | bool
FILE: src/display_device/session.h
function namespace (line 11) | namespace display_device {
FILE: src/display_device/settings.cpp
type display_device (line 5) | namespace display_device {
FILE: src/display_device/settings.h
function namespace (line 10) | namespace display_device {
FILE: src/display_device/to_string.cpp
type display_device (line 5) | namespace display_device {
function to_string (line 7) | std::string
function to_string (line 22) | std::string
function to_string (line 37) | std::string
function to_string (line 47) | std::string
function to_string (line 57) | std::string
function to_string (line 74) | std::string
function to_string (line 81) | std::string
function to_string (line 93) | std::string
function to_string (line 100) | std::string
function to_string (line 110) | std::string
FILE: src/display_device/to_string.h
function namespace (line 6) | namespace display_device {
FILE: src/display_device/vdd_utils.cpp
type display_device (line 32) | namespace display_device {
type vdd_utils (line 33) | namespace vdd_utils {
function calculate_exponential_backoff (line 47) | std::chrono::milliseconds
type vdd_action_e (line 56) | enum class vdd_action_e {
function execute_vdd_command (line 75) | bool
function HANDLE (line 112) | HANDLE
function execute_pipe_command (line 143) | bool
function reload_driver (line 216) | bool
function generate_client_guid (line 222) | std::string
function physical_size_t (line 242) | physical_size_t
function create_vdd_monitor (line 275) | bool
function destroy_vdd_monitor (line 347) | bool
function destroy_vdd_monitor_nolog (line 373) | void
function enable_vdd (line 389) | void
function disable_vdd (line 394) | void
function disable_enable_vdd (line 399) | void
function is_display_on (line 404) | bool
function toggle_display_power (line 409) | bool
function VddSettings (line 522) | VddSettings
function ensure_vdd_extended_mode (line 569) | bool
function set_hdr_state (line 641) | bool
function apply_vdd_prep (line 679) | bool
FILE: src/display_device/vdd_utils.h
function namespace (line 15) | namespace display_device::vdd_utils {
FILE: src/entry_handler.cpp
function launch_ui (line 33) | void
function launch_ui_with_path (line 39) | void
type args (line 45) | namespace args {
function creds (line 46) | int
function help (line 57) | int
function version (line 63) | int
function restore_nvprefs_undo (line 70) | int
type lifetime (line 81) | namespace lifetime {
function exit_sunshine (line 85) | void
function debug_trap (line 100) | void
function log_publisher_data (line 115) | void
function is_gamestream_enabled (line 123) | bool
type service_ctrl (line 138) | namespace service_ctrl {
class service_controller (line 139) | class service_controller {
method service_controller (line 145) | service_controller(DWORD service_desired_access) {
method start_service (line 174) | bool
method query_service_status (line 195) | bool
function is_service_running (line 215) | bool
function start_service (line 227) | bool
function wait_for_ui_ready (line 253) | bool
FILE: src/entry_handler.h
function namespace (line 36) | namespace args {
function namespace (line 86) | namespace lifetime {
function namespace (line 128) | namespace service_ctrl {
FILE: src/file_handler.cpp
type file_handler (line 14) | namespace file_handler {
function get_parent_directory (line 15) | std::string
function make_directory (line 27) | bool
function read_file (line 37) | std::string
function write_file (line 48) | int
FILE: src/file_handler.h
function namespace (line 12) | namespace file_handler {
FILE: src/globals.h
function namespace (line 47) | namespace mail {
FILE: src/httpcommon.cpp
type http (line 37) | namespace http {
function init (line 50) | int
function save_user_creds (line 74) | int
function user_creds_exist (line 104) | bool
function reload_user_creds (line 124) | int
function create_creds (line 140) | int
function download_file (line 196) | bool download_file(const std::string &url, const std::string &file, lo...
function string_write_callback (line 255) | size_t string_write_callback(void *contents, size_t size, size_t nmemb...
function fetch_url (line 269) | bool fetch_url(const std::string &url, std::string &content, long ssl_...
function post_json (line 310) | bool post_json(const std::string &url, const std::string &body, const ...
function url_escape (line 358) | std::string url_escape(const std::string &url) {
function url_get_host (line 365) | std::string
function download_image_with_magic_check (line 483) | bool download_image_with_magic_check(const std::string &url, const std...
type ImageCheckContext (line 382) | struct ImageCheckContext {
function image_write_callback (line 395) | size_t image_write_callback(void *ptr, size_t size, size_t nmemb, void *...
type http (line 482) | namespace http {
function init (line 50) | int
function save_user_creds (line 74) | int
function user_creds_exist (line 104) | bool
function reload_user_creds (line 124) | int
function create_creds (line 140) | int
function download_file (line 196) | bool download_file(const std::string &url, const std::string &file, lo...
function string_write_callback (line 255) | size_t string_write_callback(void *contents, size_t size, size_t nmemb...
function fetch_url (line 269) | bool fetch_url(const std::string &url, std::string &content, long ssl_...
function post_json (line 310) | bool post_json(const std::string &url, const std::string &body, const ...
function url_escape (line 358) | std::string url_escape(const std::string &url) {
function url_get_host (line 365) | std::string
function download_image_with_magic_check (line 483) | bool download_image_with_magic_check(const std::string &url, const std...
FILE: src/httpcommon.h
function namespace (line 16) | namespace http {
FILE: src/input.cpp
type input (line 36) | namespace input {
type button_state_e (line 52) | enum class button_state_e {
function alloc_id (line 59) | int
function free_id (line 72) | void
function key_press_id_t (line 78) | key_press_id_t
function vk_from_kpid (line 82) | uint16_t
function flags_from_kpid (line 86) | uint8_t
function from_netfloat (line 96) | float
function from_clamped_netfloat (line 108) | float
function free_gamepad (line 120) | void
type gamepad_t (line 127) | struct gamepad_t {
method gamepad_t (line 128) | gamepad_t():
type input_t (line 152) | struct input_t {
type shortkey_e (line 153) | enum shortkey_e {
method input_t (line 160) | input_t(
function apply_shortcut (line 198) | inline int
function print (line 222) | void
function print (line 231) | void
function print (line 242) | void
function print (line 251) | void
function print (line 259) | void
function print (line 267) | void
function print (line 278) | void
function print (line 287) | void
function print (line 308) | void
function print (line 327) | void
function print (line 348) | void
function print (line 363) | void
function print (line 380) | void
function print (line 396) | void
function print (line 406) | void
function passthrough (line 458) | void
function client_to_touchport (line 475) | std::optional<std::pair<float, float>>
function multiply_polar_by_cartesian_scalar (line 509) | float
function scale_client_contact_area (line 523) | std::pair<float, float>
function passthrough (line 537) | void
function passthrough (line 575) | void
function map_keycode (line 636) | short
function update_shortcutFlags (line 649) | inline void
function is_modifier (line 685) | bool
function send_key_and_modifiers (line 703) | void
function repeat_key (line 734) | void
function passthrough (line 747) | void
function passthrough (line 810) | void
function passthrough (line 835) | void
function passthrough (line 855) | void
function passthrough (line 870) | void
function passthrough (line 911) | void
function passthrough (line 968) | void
function passthrough (line 1027) | void
function passthrough (line 1061) | void
function passthrough (line 1094) | void
function passthrough (line 1120) | void
type batch_result_e (line 1238) | enum class batch_result_e {
function batch_result_e (line 1250) | batch_result_e
function batch_result_e (line 1274) | batch_result_e
function batch_result_e (line 1292) | batch_result_e
function batch_result_e (line 1313) | batch_result_e
function batch_result_e (line 1333) | batch_result_e
function batch_result_e (line 1362) | batch_result_e
function batch_result_e (line 1397) | batch_result_e
function batch_result_e (line 1431) | batch_result_e
function batch_result_e (line 1472) | batch_result_e
function batch_result_e (line 1496) | batch_result_e
function passthrough_next_message (line 1533) | void
function passthrough (line 1634) | void
function reset (line 1643) | void
class deinit_t (line 1668) | class deinit_t: public platf::deinit_t {
function init (line 1675) | [[nodiscard]] std::unique_ptr<platf::deinit_t>
function probe_gamepads (line 1682) | bool
function alloc (line 1694) | std::shared_ptr<input_t>
FILE: src/input.h
function namespace (line 12) | namespace input {
FILE: src/logging.cpp
function init (line 187) | [[nodiscard]] std::unique_ptr<deinit_t>
function setup_av_logging (line 264) | void
function log_flush (line 298) | void
function print_help (line 311) | void
function bracket (line 332) | std::string
function bracket (line 337) | std::wstring
FILE: src/logging.h
function namespace (line 31) | namespace logging {
FILE: src/main.cpp
function on_signal_forwarder (line 38) | void
function on_signal (line 44) | void
function LRESULT (line 61) | LRESULT CALLBACK
function WINAPI (line 81) | WINAPI BOOL
function mainThreadLoop (line 97) | void
function main (line 119) | int
FILE: src/move_by_copy.h
function namespace (line 12) | namespace move_by_copy_util {
FILE: src/network.cpp
type net (line 16) | namespace net {
function net_e (line 36) | net_e
function net_e (line 48) | net_e
function to_enum_string (line 82) | std::string_view
function af_e (line 97) | af_e
function af_to_any_address_string (line 110) | std::string_view af_to_any_address_string(const af_e af) {
function get_bind_address (line 122) | std::string get_bind_address(const af_e af) {
function normalize_address (line 132) | boost::asio::ip::address
function addr_to_normalized_string (line 145) | std::string
function addr_to_url_escaped_string (line 150) | std::string
function encryption_mode_for_address (line 163) | int
function host_t (line 174) | host_t
function free_host (line 194) | void
function map_port (line 207) | std::uint16_t
function mdns_instance_name (line 225) | std::string
FILE: src/network.h
function namespace (line 16) | namespace net {
FILE: src/nvenc/common_impl/nvenc_base.cpp
function GUID (line 22) | GUID
function equal_guids (line 51) | bool
function quality_preset_string_from_guid (line 56) | auto
type nvenc (line 87) | namespace nvenc {
function nvenc_encoded_frame (line 762) | nvenc_encoded_frame
type bitwriter (line 1112) | struct bitwriter {
method write (line 1117) | void write(uint32_t value, int num_bits) {
method flush (line 1129) | void flush() {
method write (line 1217) | void write(uint32_t value, int num_bits) {
method flush (line 1229) | void flush() {
type bitwriter (line 1212) | struct bitwriter {
method write (line 1117) | void write(uint32_t value, int num_bits) {
method flush (line 1129) | void flush() {
method write (line 1217) | void write(uint32_t value, int num_bits) {
method flush (line 1229) | void flush() {
FILE: src/nvenc/common_impl/nvenc_base.h
function namespace (line 18) | namespace NVENC_NAMESPACE {
FILE: src/nvenc/common_impl/nvenc_utils.cpp
type nvenc (line 12) | namespace nvenc {
function DXGI_FORMAT (line 16) | DXGI_FORMAT
function NV_ENC_BUFFER_FORMAT (line 37) | NV_ENC_BUFFER_FORMAT
function nvenc_colorspace_t (line 57) | nvenc_colorspace_t
FILE: src/nvenc/common_impl/nvenc_utils.h
function namespace (line 18) | namespace nvenc {
FILE: src/nvenc/nvenc_config.h
type nvenc_hdr_metadata (line 16) | struct nvenc_hdr_metadata {
type class (line 36) | enum class
type class (line 42) | enum class
type class (line 51) | enum class
type class (line 59) | enum class
function nvenc_rate_control_mode (line 64) | enum class nvenc_rate_control_mode {
FILE: src/nvenc/nvenc_encoded_frame.h
function namespace (line 10) | namespace nvenc {
FILE: src/nvenc/nvenc_encoder.h
function namespace (line 17) | namespace nvenc {
FILE: src/nvenc/win/impl/nvenc_d3d11_base.cpp
type nvenc (line 10) | namespace nvenc {
FILE: src/nvenc/win/impl/nvenc_d3d11_base.h
function namespace (line 15) | namespace NVENC_NAMESPACE {
FILE: src/nvenc/win/impl/nvenc_d3d11_native.cpp
type nvenc (line 12) | namespace nvenc {
function ID3D11Texture2D (line 25) | ID3D11Texture2D *
FILE: src/nvenc/win/impl/nvenc_d3d11_native.h
function namespace (line 12) | namespace nvenc {
FILE: src/nvenc/win/impl/nvenc_d3d11_on_cuda.cpp
type nvenc (line 12) | namespace nvenc {
function ID3D11Texture2D (line 49) | ID3D11Texture2D *
FILE: src/nvenc/win/impl/nvenc_d3d11_on_cuda.h
type autopop_context (line 48) | struct autopop_context {
FILE: src/nvenc/win/impl/nvenc_dynamic_factory_1100.cpp
type nvenc_1100 (line 2) | namespace nvenc_1100 {
type NV_ENC_VUI_VIDEO_FORMAT (line 3) | enum NV_ENC_VUI_VIDEO_FORMAT {
type NV_ENC_VUI_COLOR_PRIMARIES (line 11) | enum NV_ENC_VUI_COLOR_PRIMARIES {
type NV_ENC_VUI_TRANSFER_CHARACTERISTIC (line 27) | enum NV_ENC_VUI_TRANSFER_CHARACTERISTIC {
type NV_ENC_VUI_MATRIX_COEFFS (line 48) | enum NV_ENC_VUI_MATRIX_COEFFS {
FILE: src/nvenc/win/impl/nvenc_dynamic_factory_blueprint.h
function namespace (line 17) | namespace nvenc {
function namespace (line 46) | namespace NVENC_NAMESPACE {
function namespace (line 59) | namespace nvenc {
FILE: src/nvenc/win/impl/nvenc_shared_dll.h
function namespace (line 12) | namespace nvenc {
FILE: src/nvenc/win/nvenc_d3d11.h
function namespace (line 11) | namespace nvenc {
FILE: src/nvenc/win/nvenc_dynamic_factory.cpp
function load_dll (line 39) | std::tuple<shared_dll, uint32_t>
type nvenc (line 65) | namespace nvenc {
type NvencVersionTests (line 96) | struct NvencVersionTests: testing::TestWithParam<decltype(factory_priori...
method SetUpTestSuite (line 97) | static void
method TearDownTestSuite (line 119) | static void
function TEST_P (line 131) | TEST_P(NvencVersionTests, CreateAndEncode) {
FILE: src/nvenc/win/nvenc_dynamic_factory.h
function namespace (line 11) | namespace nvenc {
FILE: src/nvhttp.cpp
type nvhttp (line 61) | namespace nvhttp {
type named_cert_t (line 76) | struct named_cert_t {
type client_t (line 82) | struct client_t {
type pair_rate_limiter_t (line 103) | struct pair_rate_limiter_t {
method check_and_record (line 107) | bool
method cleanup (line 128) | void
class SunshineHTTPSServer (line 150) | class SunshineHTTPSServer: public SimpleWeb::ServerBase<SunshineHTTPS> {
method SunshineHTTPSServer (line 152) | SunshineHTTPSServer(const std::string &certification_file, const std...
method after_bind (line 168) | void
method accept (line 180) | void
type conf_intern_t (line 254) | struct conf_intern_t {
function get_client_cert_uuid_from_request (line 266) | std::string
type op_e (line 293) | enum class op_e {
function get_arg (line 298) | std::string
function save_state (line 311) | void
function load_state (line 350) | void
function add_authorized_client (line 419) | void
function make_launch_session (line 433) | std::shared_ptr<rtsp_stream::launch_session_t>
function remove_session (line 530) | void
function fail_pair (line 535) | void
function getservercert (line 543) | void
function clientchallenge (line 570) | void
function serverchallengeresp (line 615) | void
function clientpairingsecret (line 645) | void
type tunnel (line 702) | struct tunnel
type tunnel<SunshineHTTPS> (line 705) | struct tunnel<SunshineHTTPS> {
type tunnel<SimpleWeb::HTTP> (line 710) | struct tunnel<SimpleWeb::HTTP> {
function print_req (line 715) | void
function print_request_ip (line 757) | void
function print_request_warning_ip (line 763) | void
function not_found (line 769) | void
function pair (line 796) | void
function pin (line 915) | bool
function serverinfo (line 965) | void
function get_all_clients (line 1064) | nlohmann::json
function get_pair_name (line 1078) | std::string
function set_preset_pin (line 1083) | bool
function consume_preset_pin (line 1099) | std::string
function clear_preset_pin (line 1116) | void
function get_qr_pair_status (line 1124) | std::string
function applist (line 1138) | void
function changeBitrate (line 1179) | void
function changeDynamicParam (line 1250) | void
function getSessionsInfo (line 1404) | void
type resolved_client_t (line 1483) | struct resolved_client_t {
function resolved_client_t (line 1489) | static resolved_client_t
function getAbrCapabilities (line 1507) | void
function configureAbr (line 1537) | void
function abrFeedback (line 1662) | void
function launch (line 1728) | void
function resume (line 1867) | void
function cancel (line 1981) | void
function sleep (line 2009) | void
function execSuperCmd (line 2045) | void
function appasset (line 2065) | void
function get_displays (line 2084) | void
function rotate_display (line 2159) | void
function setup (line 2263) | void
function start (line 2269) | void
function erase_all_clients (line 2492) | void
function unpair_client (line 2503) | int
function rename_client (line 2522) | bool
FILE: src/nvhttp.h
function namespace (line 23) | namespace nvhttp {
FILE: src/platform/common.h
type sockaddr (line 34) | struct sockaddr
type AVFrame (line 35) | struct AVFrame
type AVBufferRef (line 36) | struct AVBufferRef
type AVHWFramesContext (line 37) | struct AVHWFramesContext
type AVCodecContext (line 38) | struct AVCodecContext
type AVDictionary (line 39) | struct AVDictionary
function namespace (line 44) | namespace boost {
function namespace (line 52) | namespace video {
function namespace (line 56) | namespace nvenc {
function namespace (line 60) | namespace amf {
function namespace (line 64) | namespace platf {
type speaker_e (line 190) | enum speaker_e {
type class (line 245) | enum class
function pix_fmt_e (line 255) | enum class pix_fmt_e {
type encode_device_t (line 447) | struct encode_device_t {
function encode_device_t (line 463) | struct avcodec_encode_device_t: encode_device_t {
function encode_device_t (line 510) | struct nvenc_encode_device_t: encode_device_t {
function encode_device_t (line 517) | struct amf_encode_device_t: encode_device_t {
function capture_e (line 524) | enum class capture_e : int {
type send_info_t (line 858) | struct send_info_t {
function qos_data_type_e (line 873) | enum class qos_data_type_e : int {
FILE: src/platform/linux/audio.cpp
type platf (line 22) | namespace platf {
function to_string (line 40) | std::string
type mic_attr_t (line 58) | struct mic_attr_t: public mic_t {
method capture_e (line 61) | capture_e
function microphone (line 77) | std::unique_ptr<mic_t>
type pa (line 111) | namespace pa {
type add_const_helper (line 113) | struct add_const_helper
type add_const_helper<true, T> (line 116) | struct add_const_helper<true, T> {
type add_const_helper<false, T> (line 121) | struct add_const_helper<false, T> {
function pa_free (line 129) | void
function cb (line 143) | void
function cb (line 156) | void
function cb_i (line 168) | void
function ctx_state_cb (line 175) | void
function success_cb (line 182) | void
class server_t (line 190) | class server_t: public audio_control_t {
type ctx_event_e (line 191) | enum ctx_event_e : int {
method init (line 214) | int
method load_null (line 271) | int
method unload_null (line 288) | int
method sink_info (line 310) | std::optional<sink_t>
method get_default_sink_name (line 432) | std::string
method get_monitor_name (line 455) | std::string
method microphone (line 487) | std::unique_ptr<mic_t>
method is_sink_available (line 507) | bool
method set_sink (line 513) | int
function audio_control (line 563) | std::unique_ptr<audio_control_t>
FILE: src/platform/linux/cuda.cpp
type cuda (line 38) | namespace cuda {
function pass_error (line 42) | void
function cff (line 47) | void
function check (line 56) | inline static int
function freeStream (line 72) | void
function unregisterResource (line 77) | void
class img_t (line 84) | class img_t: public platf::img_t {
function init (line 89) | int
class cuda_t (line 103) | class cuda_t: public platf::avcodec_encode_device_t {
method init (line 105) | int
method set_frame (line 120) | int
method apply_colorspace (line 159) | void
method cudaTextureObject_t (line 188) | cudaTextureObject_t
class cuda_ram_t (line 204) | class cuda_ram_t: public cuda_t {
method convert (line 206) | int
method set_frame (line 211) | int
class cuda_vram_t (line 230) | class cuda_vram_t: public cuda_t {
method convert (line 232) | int
function file_t (line 243) | file_t
class gl_cuda_vram_t (line 285) | class gl_cuda_vram_t: public platf::avcodec_encode_device_t {
method init (line 295) | int
method set_frame (line 343) | int
method convert (line 393) | int
method apply_colorspace (line 448) | void
function make_avcodec_encode_device (line 477) | std::unique_ptr<platf::avcodec_encode_device_t>
function make_avcodec_gl_encode_device (line 507) | std::unique_ptr<platf::avcodec_encode_device_t>
type nvfbc (line 522) | namespace nvfbc {
function NVFBC_BOOL (line 526) | static constexpr inline NVFBC_BOOL
function init (line 532) | int
class ctx_t (line 569) | class ctx_t {
method ctx_t (line 571) | ctx_t(NVFBC_SESSION_HANDLE handle) {
class handle_t (line 591) | class handle_t {
type flag_e (line 592) | enum flag_e {
method handle_t (line 599) | handle_t() = default;
method handle_t (line 600) | handle_t(handle_t &&other):
method handle_t (line 605) | handle_t &
method make (line 613) | static std::optional<handle_t>
method status (line 641) | std::optional<NVFBC_GET_STATUS_PARAMS>
method capture (line 655) | int
method stop (line 676) | int
method reset (line 695) | int
class display_t (line 724) | class display_t: public platf::display_t {
method init (line 726) | int
method capture (line 791) | platf::capture_e
method reinit (line 852) | platf::capture_e
method snapshot (line 922) | platf::capture_e
method make_avcodec_encode_device (line 963) | std::unique_ptr<platf::avcodec_encode_device_t>
method alloc_img (line 968) | std::shared_ptr<platf::img_t>
method dummy_img (line 988) | int
type platf (line 1003) | namespace platf {
function nvfbc_display (line 1004) | std::shared_ptr<display_t>
function nvfbc_display_names (line 1020) | std::vector<std::string>
FILE: src/platform/linux/cuda.h
function namespace (line 17) | namespace platf {
function namespace (line 22) | namespace cuda {
type cudaArray (line 46) | struct cudaArray
type CUstream_st (line 49) | struct CUstream_st
type cudaTextureObject_t (line 50) | typedef unsigned long long cudaTextureObject_t;
type struct (line 52) | typedef __location__(device_builtin) struct
function namespace (line 56) | namespace cuda {
FILE: src/platform/linux/display_device.cpp
type display_device (line 4) | namespace display_device {
function device_info_map_t (line 6) | device_info_map_t
function get_display_name (line 12) | std::string
function device_display_mode_map_t (line 18) | device_display_mode_map_t
function set_display_modes (line 24) | bool
function is_primary_device (line 30) | bool
function set_as_primary_device (line 36) | bool
function hdr_state_map_t (line 42) | hdr_state_map_t
function set_hdr_states (line 48) | bool
function active_topology_t (line 54) | active_topology_t
function is_topology_valid (line 60) | bool
function is_topology_the_same (line 66) | bool
function set_topology (line 72) | bool
type settings_t::audio_data_t (line 78) | struct settings_t::audio_data_t {
type settings_t::persistent_data_t (line 82) | struct settings_t::persistent_data_t {
FILE: src/platform/linux/graphics.cpp
type gl (line 30) | namespace gl {
function drain_errors (line 33) | void
function tex_t (line 47) | tex_t
function frame_buf_t (line 73) | frame_buf_t
function GLuint (line 126) | GLuint
function buffer_t (line 131) | buffer_t
function GLuint (line 145) | GLuint
function GLuint (line 274) | GLuint
type gbm (line 281) | namespace gbm {
function init (line 285) | int
type egl (line 313) | namespace egl {
function fail (line 337) | bool
function display_t (line 345) | display_t
function make_ctx (line 411) | std::optional<ctx_t>
type plane_attr_t (line 460) | struct plane_attr_t {
function plane_attr_t (line 468) | inline plane_attr_t
function surface_descriptor_to_egl_attribs (line 514) | std::vector<EGLAttrib>
function import_source (line 552) | std::optional<rgb_t>
function rgb_t (line 583) | rgb_t
function import_target (line 608) | std::optional<nv12_t>
function create_target (line 664) | std::optional<nv12_t>
function free_frame (line 1021) | void
FILE: src/platform/linux/graphics.h
type _XDisplay (line 28) | struct _XDisplay
type AVFrame (line 30) | struct AVFrame
function namespace (line 36) | namespace gl {
function class (line 55) | class frame_buf_t: public util::buffer_t<GLuint> {
function class (line 107) | class shader_t {
function class (line 128) | class buffer_t {
function namespace (line 188) | namespace gbm {
function namespace (line 203) | namespace egl {
FILE: src/platform/linux/input/inputtino.cpp
type platf (line 21) | namespace platf {
function input_t (line 23) | input_t
function allocate_client_input_context (line 28) | std::unique_ptr<client_input_t>
function freeInput (line 33) | void
function set_mouse_mode (line 39) | void
function move_mouse (line 44) | void
function abs_mouse (line 50) | void
function button_mouse (line 56) | void
function scroll (line 62) | void
function hscroll (line 68) | void
function keyboard_update (line 74) | void
function unicode (line 80) | void
function touch_update (line 86) | void
function pen_update (line 92) | void
function alloc_gamepad (line 98) | int
function free_gamepad (line 104) | void
function gamepad_update (line 110) | void
function gamepad_touch (line 116) | void
function gamepad_motion (line 122) | void
function gamepad_battery (line 128) | void
function get_capabilities (line 134) | platform_caps::caps_t
function get_mouse_loc (line 148) | util::point_t
FILE: src/platform/linux/input/inputtino_common.h
function namespace (line 18) | namespace platf {
function client_input_t (line 64) | struct client_input_raw_t: public client_input_t {
function deg2rad (line 97) | inline float
FILE: src/platform/linux/input/inputtino_gamepad.cpp
type platf::gamepad (line 20) | namespace platf::gamepad {
type GamepadStatus (line 22) | enum GamepadStatus {
function create_xbox_one (line 29) | auto create_xbox_one() {
function create_switch (line 37) | auto create_switch() {
function create_ds5 (line 45) | auto create_ds5() {
function alloc (line 49) | int alloc(input_raw_t *raw, const gamepad_id_t &id, const gamepad_arri...
function free (line 175) | void free(input_raw_t *raw, int nr) {
function update (line 181) | void update(input_raw_t *raw, int nr, const gamepad_state_t &gamepad_s...
function touch (line 196) | void touch(input_raw_t *raw, const gamepad_touch_t &touch) {
function motion (line 211) | void motion(input_raw_t *raw, const gamepad_motion_t &motion) {
function battery (line 229) | void battery(input_raw_t *raw, const gamepad_battery_t &battery) {
FILE: src/platform/linux/input/inputtino_gamepad.h
function namespace (line 17) | namespace platf::gamepad {
FILE: src/platform/linux/input/inputtino_keyboard.cpp
type platf::keyboard (line 19) | namespace platf::keyboard {
function to_hex (line 28) | std::string
function update (line 73) | void
function unicode (line 85) | void
FILE: src/platform/linux/input/inputtino_keyboard.h
function namespace (line 15) | namespace platf::keyboard {
FILE: src/platform/linux/input/inputtino_mouse.cpp
type platf::mouse (line 19) | namespace platf::mouse {
function move (line 21) | void
function move_abs (line 28) | void
function button (line 35) | void
function scroll (line 68) | void
function hscroll (line 75) | void
function get_location (line 82) | util::point_t
FILE: src/platform/linux/input/inputtino_mouse.h
function namespace (line 17) | namespace platf::mouse {
FILE: src/platform/linux/input/inputtino_pen.cpp
type platf::pen (line 19) | namespace platf::pen {
function update (line 20) | void
FILE: src/platform/linux/input/inputtino_pen.h
function namespace (line 17) | namespace platf::pen {
FILE: src/platform/linux/input/inputtino_touch.cpp
type platf::touch (line 19) | namespace platf::touch {
function update (line 20) | void
FILE: src/platform/linux/input/inputtino_touch.h
function namespace (line 17) | namespace platf::touch {
FILE: src/platform/linux/input/legacy_input.cpp
type platf (line 49) | namespace platf {
type x11 (line 53) | namespace x11 {
type tst (line 63) | namespace tst {
function init (line 69) | static int
function init (line 99) | static int
type keycode_t (line 146) | struct keycode_t {
function init_keycodes (line 161) | static constexpr std::array<keycode_t, 0xE3>
function print (line 343) | static inline void
function print (line 353) | static inline void
function print (line 361) | static inline void
function print (line 369) | static inline void
class effect_t (line 459) | class effect_t {
method effect_t (line 463) | effect_t(std::uint8_t gamepadnr, uinput_t::pointer dev, feedback_que...
class data_t (line 466) | class data_t {
method data_t (line 470) | data_t(const ff_effect &effect):
method magnitude (line 516) | std::uint32_t
method rumble (line 523) | std::pair<std::uint32_t, std::uint32_t>
method activate (line 559) | void
method deactivate (line 564) | void
method rumble (line 584) | std::pair<std::uint32_t, std::uint32_t>
method upload (line 598) | void
method activate (line 615) | void
method deactivate (line 624) | void
method erase (line 633) | void
type rumble_ctx_t (line 655) | struct rumble_ctx_t {
function startRumble (line 663) | int
function stopRumble (line 670) | void
type input_raw_t (line 681) | struct input_raw_t {
method clear_mouse_rel (line 683) | void
method clear_keyboard (line 694) | void
method clear_mouse_abs (line 705) | void
method clear_gamepad (line 716) | void
method create_mouse_abs (line 739) | int
method create_mouse_rel (line 753) | int
method create_keyboard (line 767) | int
method alloc_gamepad (line 781) | int
method clear (line 818) | void
function rumbleIterate (line 867) | inline void
function broadcastRumble (line 1003) | void
function x_abs_mouse (line 1081) | static void
function get_mouse_loc (line 1093) | util::point_t
function abs_mouse (line 1133) | void
function x_move_mouse (line 1163) | static void
function set_mouse_mode (line 1184) | void
function move_mouse (line 1189) | void
function x_button_mouse (line 1222) | static void
function button_mouse (line 1263) | void
function x_scroll (line 1348) | static void
function scroll (line 1373) | void
function hscroll (line 1405) | void
function keycode_t (line 1429) | static keycode_t
function x_keyboard (line 1448) | static void
function keyboard_update (line 1481) | void
function keyboard_ev (line 1502) | void
function to_hex (line 1515) | std::string
function unicode (line 1539) | void
function alloc_gamepad (line 1578) | int
function free_gamepad (line 1583) | void
function gamepad_update (line 1588) | void
type client_input_raw_t (line 1660) | struct client_input_raw_t: public client_input_t {
method client_input_raw_t (line 1661) | client_input_raw_t(input_t &input) {
function allocate_client_input_context (line 1684) | std::unique_ptr<client_input_t>
function slot_index_by_pointer_id (line 1695) | int
function allocate_slot_index_for_pointer_id (line 1711) | int
function touch_update (line 1735) | void
function pen_update (line 1920) | void
function gamepad_touch (line 2065) | void
function gamepad_motion (line 2075) | void
function gamepad_battery (line 2085) | void
function evdev_t (line 2096) | evdev_t
function evdev_t (line 2123) | evdev_t
function evdev_t (line 2172) | evdev_t
function evdev_t (line 2225) | evdev_t
function evdev_t (line 2330) | evdev_t
function evdev_t (line 2427) | evdev_t
function input_t (line 2502) | input_t
function freeInput (line 2546) | void
function get_capabilities (line 2565) | platform_caps::caps_t
FILE: src/platform/linux/kmsgrab.cpp
type platf (line 33) | namespace platf {
type kms (line 35) | namespace kms {
class cap_sys_admin (line 37) | class cap_sys_admin {
method cap_sys_admin (line 39) | cap_sys_admin() {
class wrapper_fb (line 59) | class wrapper_fb {
method wrapper_fb (line 61) | wrapper_fb(drmModeFB *fb):
method wrapper_fb (line 72) | wrapper_fb(drmModeFB2 *fb2):
function plane_type (line 119) | std::string_view
type connector_t (line 133) | struct connector_t {
type monitor_t (line 149) | struct monitor_t {
type card_descriptor_t (line 160) | struct card_descriptor_t {
function from_view (line 168) | static std::uint32_t
class plane_it_t (line 225) | class plane_it_t: public round_robin_util::it_wrap_t<plane_t::elemen...
method plane_it_t (line 227) | plane_it_t(int fd, std::uint32_t *plane_p, std::uint32_t *end):
method plane_it_t (line 232) | plane_it_t(int fd, std::uint32_t *end):
method load_next_valid_plane (line 235) | void
method inc (line 251) | void
method eq (line 257) | bool
method get (line 262) | plane_t::pointer
type cursor_t (line 274) | struct cursor_t {
class card_t (line 288) | class card_t {
method init (line 292) | int
method fb_t (line 349) | fb_t
method crtc_t (line 366) | crtc_t
method encoder_t (line 371) | encoder_t
method res_t (line 376) | res_t
method is_nvidia (line 381) | bool
method is_cursor (line 387) | bool
method prop_value_by_name (line 404) | std::optional<std::uint64_t>
method get_panel_orientation (line 414) | std::uint32_t
method get_crtc_index_by_id (line 426) | int
method connector_interal_t (line 437) | connector_interal_t
method monitors (line 442) | std::vector<connector_t>
method file_t (line 477) | file_t
method props (line 489) | std::vector<std::pair<prop_t, std::uint64_t>>
method plane_props (line 506) | std::vector<std::pair<prop_t, std::uint64_t>>
method crtc_props (line 511) | std::vector<std::pair<prop_t, std::uint64_t>>
method connector_props (line 516) | std::vector<std::pair<prop_t, std::uint64_t>>
method plane_t (line 521) | plane_t
method count (line 526) | std::uint32_t
method plane_it_t (line 531) | plane_it_t
method plane_it_t (line 536) | plane_it_t
function map_crtc_to_monitor (line 546) | std::map<std::uint32_t, monitor_t>
type kms_img_t (line 561) | struct kms_img_t: public img_t {
function print (line 568) | void
class display_t (line 601) | class display_t: public platf::display_t {
method display_t (line 603) | display_t(mem_type_e mem_type):
method init (line 606) | int
method is_hdr (line 802) | bool
method get_hdr_metadata (line 849) | bool
method update_cursor (line 879) | void
method capture_e (line 1071) | inline capture_e
class display_ram_t (line 1155) | class display_ram_t: public display_t {
method display_ram_t (line 1157) | display_ram_t(mem_type_e mem_type):
method init (line 1160) | int
method capture_e (line 1192) | capture_e
method make_avcodec_encode_device (line 1238) | std::unique_ptr<avcodec_encode_device_t>
method blend_cursor (line 1255) | void
method capture_e (line 1305) | capture_e
method alloc_img (line 1348) | std::shared_ptr<img_t>
method dummy_img (line 1360) | int
class display_vram_t (line 1370) | class display_vram_t: public display_t {
method display_vram_t (line 1372) | display_vram_t(mem_type_e mem_type):
method make_avcodec_encode_device (line 1375) | std::unique_ptr<avcodec_encode_device_t>
method alloc_img (line 1393) | std::shared_ptr<img_t>
method dummy_img (line 1409) | int
method capture_e (line 1415) | capture_e
method capture_e (line 1461) | capture_e
method init (line 1505) | int
function kms_display (line 1533) | std::shared_ptr<display_t>
function correlate_to_wayland (line 1564) | void
function kms_display_names (line 1619) | std::vector<std::string>
FILE: src/platform/linux/misc.cpp
type dyn (line 49) | namespace dyn {
function load (line 74) | int
type platf (line 92) | namespace platf {
function ifaddr_t (line 95) | ifaddr_t
function appdata (line 109) | fs::path
function from_sockaddr (line 189) | std::string
function from_sockaddr_ex (line 206) | std::pair<std::uint16_t, std::string>
function get_mac_address (line 226) | std::string
function run_command (line 244) | bp::child
function open_url (line 270) | void
function open_url_in_browser (line 292) | void
function adjust_thread_priority (line 298) | void
function streaming_will_start (line 303) | void
function streaming_will_stop (line 308) | void
function enter_away_mode (line 313) | void
function exit_away_mode (line 320) | void
function is_away_mode_active (line 325) | bool
function system_sleep (line 330) | bool
function system_hibernate (line 341) | bool
function restart_on_exit (line 351) | void
function restart (line 374) | void
function set_env (line 381) | int
function unset_env (line 386) | int
function request_process_group_exit (line 391) | bool
function process_group_running (line 403) | bool
function to_sockaddr (line 408) | struct sockaddr_in
function to_sockaddr (line 421) | struct sockaddr_in6
function send_batch (line 435) | bool
function send (line 645) | bool
class qos_t (line 752) | class qos_t: public deinit_t {
method qos_t (line 754) | qos_t(int sockfd, std::vector<std::tuple<int, int, int>> options):
function enable_socket_qos (line 783) | std::unique_ptr<deinit_t>
function get_host_name (line 850) | std::string
type source (line 861) | namespace source {
type source_e (line 862) | enum source_e : std::size_t {
function verify_nvfbc (line 887) | bool
function verify_wl (line 899) | bool
function verify_kms (line 911) | bool
function verify_x11 (line 923) | bool
function display_names (line 929) | std::vector<std::string>
function needs_encoder_reenumeration (line 951) | bool
function display (line 957) | std::shared_ptr<display_t>
function init (line 987) | std::unique_ptr<deinit_t>
class linux_high_precision_timer (line 1055) | class linux_high_precision_timer: public high_precision_timer {
method sleep_for (line 1057) | void
function create_high_precision_timer (line 1067) | std::unique_ptr<high_precision_timer>
FILE: src/platform/linux/misc.h
function window_system_e (line 18) | enum class window_system_e {
FILE: src/platform/linux/publish.cpp
type avahi (line 17) | namespace avahi {
type err_e (line 22) | enum err_e {
type proto (line 87) | enum proto {
type ServerState (line 93) | enum ServerState {
type ClientState (line 101) | enum ClientState {
type EntryGroupState (line 109) | enum EntryGroupState {
type ClientFlags (line 117) | enum ClientFlags {
type PublishFlags (line 125) | enum PublishFlags {
type EntryGroup (line 140) | struct EntryGroup
type Poll (line 141) | struct Poll
type SimplePoll (line 142) | struct SimplePoll
type Client (line 143) | struct Client
function init_common (line 202) | int
function init_client (line 236) | int
type platf::publish (line 275) | namespace platf::publish {
function free (line 278) | void
function entry_group_callback (line 298) | void
function create_services (line 322) | void
function client_callback (line 378) | void
class deinit_t (line 397) | class deinit_t: public ::platf::deinit_t {
method deinit_t (line 401) | deinit_t(std::thread poll_thread):
function start (line 415) | [[nodiscard]] std::unique_ptr<::platf::deinit_t>
FILE: src/platform/linux/vaapi.cpp
function VAStatus (line 16) | VAStatus
function VAStatus (line 26) | VAStatus
type AVBufferRef (line 48) | struct AVBufferRef
type va (line 50) | namespace va {
type DRMPRIMESurfaceDescriptor (line 60) | struct DRMPRIMESurfaceDescriptor {
class va_t (line 106) | class va_t: public platf::avcodec_encode_device_t {
method init (line 108) | int
method VAEntrypoint (line 149) | VAEntrypoint select_va_entrypoint(VAProfile profile) {
method is_va_profile_supported (line 179) | bool is_va_profile_supported(VAProfile profile) {
method VAProfile (line 197) | VAProfile get_va_profile(AVCodecContext *ctx) {
method init_codec_options (line 229) | void init_codec_options(AVCodecContext *ctx, AVDictionary **options)...
method set_frame (line 248) | int
method apply_colorspace (line 325) | void
class va_ram_t (line 347) | class va_ram_t: public va_t {
method convert (line 349) | int
class va_vram_t (line 358) | class va_vram_t: public va_t {
method convert (line 360) | int
method init (line 388) | int
type VAAPIDevicePriv (line 414) | struct VAAPIDevicePriv {
type AVVAAPIDeviceContext (line 427) | struct AVVAAPIDeviceContext {
function __log (line 442) | static void
function vaapi_hwdevice_ctx_free (line 447) | static void
function vaapi_init_avcodec_hardware_input_buffer (line 457) | int
function query (line 513) | static bool
function validate (line 535) | bool
function make_avcodec_encode_device (line 571) | std::unique_ptr<platf::avcodec_encode_device_t>
function make_avcodec_encode_device (line 592) | std::unique_ptr<platf::avcodec_encode_device_t>
function make_avcodec_encode_device (line 607) | std::unique_ptr<platf::avcodec_encode_device_t>
FILE: src/platform/linux/vaapi.h
function namespace (line 10) | namespace egl {
function namespace (line 13) | namespace va {
FILE: src/platform/linux/wayland.cpp
type wl (line 27) | namespace wl {
function classCall (line 31) | static auto
type pollfd (line 78) | struct pollfd
function wl_registry (line 97) | wl_registry *
function monitors (line 299) | std::vector<std::unique_ptr<monitor_t>>
function validate (line 326) | static bool
function init (line 333) | int
FILE: src/platform/linux/wayland.h
function namespace (line 22) | namespace wl {
type wl_output (line 237) | struct wl_output
type zxdg_output_manager_v1 (line 238) | struct zxdg_output_manager_v1
function namespace (line 240) | namespace wl {
function init (line 267) | inline int
FILE: src/platform/linux/wlgrab.cpp
type wl (line 17) | namespace wl {
type img_t (line 21) | struct img_t: public platf::img_t {
class wlr_t (line 28) | class wlr_t: public platf::display_t {
method init (line 30) | int
method dummy_img (line 85) | int
method snapshot (line 90) | inline platf::capture_e
class wlr_ram_t (line 126) | class wlr_ram_t: public wlr_t {
method capture (line 128) | platf::capture_e
method snapshot (line 174) | platf::capture_e
method init (line 207) | int
method make_avcodec_encode_device (line 228) | std::unique_ptr<platf::avcodec_encode_device_t>
method alloc_img (line 245) | std::shared_ptr<platf::img_t>
class wlr_vram_t (line 261) | class wlr_vram_t: public wlr_t {
method capture (line 263) | platf::capture_e
method snapshot (line 309) | platf::capture_e
method alloc_img (line 335) | std::shared_ptr<platf::img_t>
method make_avcodec_encode_device (line 351) | std::unique_ptr<platf::avcodec_encode_device_t>
method dummy_img (line 368) | int
type platf (line 379) | namespace platf {
function wl_display (line 380) | std::shared_ptr<display_t>
function wl_display_names (line 404) | std::vector<std::string>
FILE: src/platform/linux/x11grab.cpp
type platf (line 34) | namespace platf {
type x11 (line 40) | namespace x11 {
type rr (line 65) | namespace rr {
function init (line 73) | static int
type fix (line 105) | namespace fix {
function init (line 108) | static int
function init (line 135) | static int
function xdisplay_t (line 913) | xdisplay_t
function freeDisplay (line 918) | void
function freeCursorCtx (line 923) | void
type xcb (line 167) | namespace xcb {
function init_shm (line 203) | int
function init (line 232) | int
class shm_id_t (line 282) | class shm_id_t {
method shm_id_t (line 284) | shm_id_t():
method shm_id_t (line 286) | shm_id_t(int id):
method shm_id_t (line 288) | shm_id_t(shm_id_t &&other) noexcept:
class shm_data_t (line 302) | class shm_data_t {
method shm_data_t (line 304) | shm_data_t():
method shm_data_t (line 306) | shm_data_t(void *data):
method shm_data_t (line 309) | shm_data_t(shm_data_t &&other) noexcept:
type x11_img_t (line 323) | struct x11_img_t: public img_t {
type shm_img_t (line 327) | struct shm_img_t: public img_t {
function blend_cursor (line 334) | static void
type x11_attr_t (line 385) | struct x11_attr_t: public display_t {
method x11_attr_t (line 400) | x11_attr_t(mem_type_e mem_type):
method init (line 405) | int
method refresh (line 475) | void
method capture_e (line 480) | capture_e
method capture_e (line 526) | capture_e
method alloc_img (line 558) | std::shared_ptr<img_t>
method make_avcodec_encode_device (line 563) | std::unique_ptr<avcodec_encode_device_t>
method dummy_img (line 580) | int
type shm_attr_t (line 596) | struct shm_attr_t: public x11_attr_t {
method delayed_refresh (line 608) | void
method shm_attr_t (line 615) | shm_attr_t(mem_type_e mem_type):
method capture_e (line 625) | capture_e
method capture_e (line 671) | capture_e
method alloc_img (line 703) | std::shared_ptr<img_t>
method dummy_img (line 715) | int
method init (line 720) | int
method frame_size (line 760) | std::uint32_t
function x11_display (line 766) | std::shared_ptr<display_t>
function x11_display_names (line 801) | std::vector<std::string>
function freeImage (line 839) | void
function freeX (line 843) | void
function load_xcb (line 848) | int
function load_x11 (line 856) | int
type x11 (line 866) | namespace x11 {
type rr (line 65) | namespace rr {
function init (line 73) | static int
type fix (line 105) | namespace fix {
function init (line 108) | static int
function init (line 135) | static int
function xdisplay_t (line 913) | xdisplay_t
function freeDisplay (line 918) | void
function freeCursorCtx (line 923) | void
FILE: src/platform/linux/x11grab.h
type _XDisplay (line 13) | struct _XDisplay
function namespace (line 15) | namespace egl {
function namespace (line 19) | namespace platf::x11 {
FILE: src/platform/macos/av_audio.h
function interface (line 13) | interface AVAudio: NSObject <AVCaptureAudioDataOutputSampleBufferDelegat...
FILE: src/platform/macos/av_img_t.h
function namespace (line 12) | namespace platf {
function img_t (line 49) | struct av_img_t: img_t {
type temp_retain_av_img_t (line 54) | struct temp_retain_av_img_t {
FILE: src/platform/macos/av_video.h
type CaptureSession (line 10) | struct CaptureSession {
FILE: src/platform/macos/display_device.cpp
type display_device (line 4) | namespace display_device {
function device_info_map_t (line 6) | device_info_map_t
function get_display_name (line 12) | std::string
function device_display_mode_map_t (line 18) | device_display_mode_map_t
function set_display_modes (line 24) | bool
function is_primary_device (line 30) | bool
function set_as_primary_device (line 36) | bool
function hdr_state_map_t (line 42) | hdr_state_map_t
function set_hdr_states (line 48) | bool
function active_topology_t (line 54) | active_topology_t
function is_topology_valid (line 60) | bool
function is_topology_the_same (line 66) | bool
function set_topology (line 72) | bool
type settings_t::audio_data_t (line 78) | struct settings_t::audio_data_t {
type settings_t::persistent_data_t (line 82) | struct settings_t::persistent_data_t {
FILE: src/platform/macos/input.cpp
type platf (line 26) | namespace platf {
type macos_input_t (line 29) | struct macos_input_t {
type KeyCodeMap (line 46) | struct KeyCodeMap {
function keysym (line 229) | int
function keyboard_update (line 245) | void
function unicode (line 295) | void
function alloc_gamepad (line 300) | int
function free_gamepad (line 306) | void
function gamepad_update (line 311) | void
function get_mouse_loc (line 317) | util::point_t
function post_mouse (line 330) | void
function CGEventType (line 367) | inline CGEventType
function set_mouse_mode (line 383) | void
function move_mouse (line 388) | void
function abs_mouse (line 399) | void
function button_mouse (line 418) | void
function scroll (line 459) | void
function hscroll (line 469) | void
function allocate_client_input_context (line 479) | std::unique_ptr<client_input_t>
function touch_update (line 491) | void
function pen_update (line 502) | void
function gamepad_touch (line 512) | void
function gamepad_motion (line 522) | void
function gamepad_battery (line 532) | void
function input_t (line 537) | input_t
function freeInput (line 585) | void
function get_capabilities (line 609) | platform_caps::caps_t
FILE: src/platform/macos/misc.h
function namespace (line 11) | namespace dyn {
FILE: src/platform/macos/nv12_zero_device.cpp
type platf (line 16) | namespace platf {
function free_frame (line 18) | void
function free_buffer (line 23) | void
FILE: src/platform/macos/nv12_zero_device.h
type AVFrame (line 9) | struct AVFrame
function namespace (line 11) | namespace platf {
FILE: src/platform/macos/publish.cpp
type platf::publish (line 15) | namespace platf::publish {
type ServiceRefDeleter (line 18) | struct ServiceRefDeleter {
class deinit_t (line 29) | class deinit_t: public ::platf::deinit_t, std::unique_ptr<DNSServiceRe...
method deinit_t (line 38) | deinit_t(DNSServiceRef serviceRef):
method deinit_t (line 66) | deinit_t(const deinit_t &) = delete;
method deinit_t (line 67) | deinit_t &
function registrationCallback (line 78) | void
function start (line 101) | [[nodiscard]] std::unique_ptr<::platf::deinit_t>
FILE: src/platform/run_command.h
function namespace (line 15) | namespace platf {
FILE: src/platform/windows/PolicyConfig.h
function interface (line 41) | interface IPolicyConfig: public IUnknown {
FILE: src/platform/windows/audio.cpp
type sample_format_e (line 65) | enum class sample_format_e {
function WAVEFORMATEXTENSIBLE (line 74) | constexpr WAVEFORMATEXTENSIBLE
function virtual_sink_waveformats_t (line 137) | virtual_sink_waveformats_t
function waveformat_to_pretty_string (line 189) | std::string
type platf::audio (line 231) | namespace platf::audio {
function co_task_free (line 234) | void
class co_init_t (line 250) | class co_init_t: public deinit_t {
method co_init_t (line 252) | co_init_t() {
class prop_var_t (line 261) | class prop_var_t {
method prop_var_t (line 263) | prop_var_t() {
type format_t (line 274) | struct format_t {
function audio_client_t (line 308) | audio_client_t
function device_t (line 366) | device_t
class audio_notification_t (line 384) | class audio_notification_t: public ::IMMNotificationClient {
method audio_notification_t (line 386) | audio_notification_t() {
method AddRef (line 391) | AddRef() {
method Release (line 396) | Release() {
method QueryInterface (line 401) | QueryInterface(REFIID riid, VOID **ppvInterface) {
method OnDefaultDeviceChanged (line 420) | OnDefaultDeviceChanged(EDataFlow flow, ERole role, LPCWSTR pwstrDevi...
method OnDeviceAdded (line 428) | OnDeviceAdded(LPCWSTR pwstrDeviceId) {
method OnDeviceRemoved (line 433) | OnDeviceRemoved(LPCWSTR pwstrDeviceId) {
method OnDeviceStateChanged (line 438) | OnDeviceStateChanged(
method OnPropertyValueChanged (line 445) | OnPropertyValueChanged(
method check_default_render_device_changed (line 455) | bool
class mic_wasapi_t (line 464) | class mic_wasapi_t: public mic_t {
method capture_e (line 466) | capture_e
method init (line 488) | int
method capture_e (line 609) | capture_e
class audio_control_t (line 725) | class audio_control_t: public ::platf::audio_control_t {
method sink_info (line 727) | std::optional<sink_t>
method is_sink_available (line 776) | bool
method extract_virtual_sink_info (line 789) | std::optional<std::pair<std::wstring, std::reference_wrapper<const f...
method microphone (line 810) | std::unique_ptr<mic_t>
method set_format (line 838) | std::optional<std::wstring>
method set_sink (line 900) | int
type match_field_e (line 932) | enum class match_field_e {
method match_steam_speakers (line 942) | audio_control_t::match_fields_list_t
method match_all_fields (line 949) | audio_control_t::match_fields_list_t
method find_device_id (line 964) | std::optional<matched_field_t>
method reset_default_device (line 1039) | void
method install_steam_audio_drivers (line 1101) | bool
method init (line 1170) | int
method init_mic_redirect_device (line 1207) | int
method release_mic_redirect_device (line 1227) | void
method write_mic_data (line 1237) | int
type platf (line 1252) | namespace platf {
type dxgi (line 1255) | namespace dxgi {
function audio_control (line 1260) | std::unique_ptr<audio_control_t>
function init (line 1278) | std::unique_ptr<deinit_t>
FILE: src/platform/windows/display.h
function namespace (line 26) | namespace platf::dxgi {
function FreeLibraryHelper (line 39) | inline
function namespace (line 79) | namespace video {
type cursor_t (line 89) | struct cursor_t {
function class (line 97) | class gpu_cursor_t {
function class (line 173) | class display_base_t: public display_t {
function class (line 304) | class display_ram_t: public display_base_t {
function class (line 354) | class duplication_t {
function window_capture_width (line 444) | int window_capture_width { 0 }
function window_capture_height (line 445) | int window_capture_height { 0 }
function class (line 469) | class display_wgc_ram_t: public display_ram_t {
function class (line 486) | class display_wgc_vram_t: public display_vram_t {
function class (line 500) | class amd_capture_t {
function class (line 529) | class display_amd_vram_t: public display_vram_t {
FILE: src/platform/windows/display_amd.cpp
type platf (line 21) | namespace platf {
type platf::dxgi (line 25) | namespace platf::dxgi {
function capture_e (line 48) | capture_e
function capture_e (line 63) | capture_e
FILE: src/platform/windows/display_base.cpp
type _D3DKMT_GPU_PREFERENCE_QUERY_STATE (line 20) | enum _D3DKMT_GPU_PREFERENCE_QUERY_STATE: DWORD {
type platf (line 39) | namespace platf {
function display (line 1087) | std::shared_ptr<display_t>
function display_names (line 1153) | std::vector<std::string>
function adapter_names (line 1244) | std::vector<std::string>
function needs_encoder_reenumeration (line 1273) | bool
type platf::dxgi (line 42) | namespace platf::dxgi {
function capture_e (line 130) | capture_e
function capture_e (line 167) | capture_e
function capture_e (line 176) | capture_e
function capture_e (line 210) | capture_e
function test_dxgi_duplication (line 451) | bool
function NTSTATUS (line 521) | NTSTATUS
type platf (line 1082) | namespace platf {
function display (line 1087) | std::shared_ptr<display_t>
function display_names (line 1153) | std::vector<std::string>
function adapter_names (line 1244) | std::vector<std::string>
function needs_encoder_reenumeration (line 1273) | bool
FILE: src/platform/windows/display_device/device_hdr_states.cpp
type display_device (line 6) | namespace display_device {
function do_set_states (line 13) | bool
function hdr_state_map_t (line 54) | hdr_state_map_t
function set_hdr_states (line 81) | bool
FILE: src/platform/windows/display_device/device_modes.cpp
type display_device (line 5) | namespace display_device {
function fuzzy_compare_refresh_rates (line 21) | bool
function fuzzy_compare_modes (line 46) | bool
function get_all_duplicated_devices (line 64) | std::unordered_set<std::string>
function do_set_modes (line 124) | bool
function do_set_modes_with_explicit_target (line 212) | bool
function device_display_mode_map_t (line 306) | device_display_mode_map_t
function set_display_modes (line 349) | bool
FILE: src/platform/windows/display_device/device_topology.cpp
type display_device (line 19) | namespace display_device {
type path_data_t (line 28) | struct path_data_t {
function compareAdapterIds (line 52) | bool
function to_string (line 67) | std::string
function path_data_map_t (line 89) | path_data_map_t
function make_new_paths_for_topology (line 156) | std::vector<DISPLAYCONFIG_PATH_INFO>
function do_set_topology (line 259) | bool
function device_info_map_t (line 301) | device_info_map_t
function find_device_by_friendlyname (line 342) | std::string
function active_topology_t (line 361) | active_topology_t
function is_topology_valid (line 401) | bool
function is_topology_the_same (line 431) | bool
function set_topology (line 451) | bool
function apply_hdr_profile (line 514) | bool
FILE: src/platform/windows/display_device/general_functions.cpp
type display_device (line 9) | namespace display_device {
function get_display_name (line 11) | std::string
function get_display_friendly_name (line 67) | std::string
function is_primary_device (line 98) | bool
function set_as_primary_device (line 126) | bool
FILE: src/platform/windows/display_device/session_listener.cpp
type display_device (line 8) | namespace display_device {
function LRESULT (line 31) | LRESULT CALLBACK
FILE: src/platform/windows/display_device/session_listener.h
function namespace (line 17) | namespace display_device {
FILE: src/platform/windows/display_device/settings.cpp
type display_device (line 18) | namespace display_device {
type settings_t::persistent_data_t (line 20) | struct settings_t::persistent_data_t {
method contains_modifications (line 38) | [[nodiscard]] bool
type settings_t::audio_data_t (line 50) | struct settings_t::audio_data_t {
function get_current_primary_display (line 71) | std::string
function determine_new_primary_display (line 96) | std::string
function handle_primary_display_configuration (line 122) | boost::optional<std::string>
function device_display_mode_map_t (line 158) | device_display_mode_map_t
function filter_stale_devices (line 193) | void
function filter_vdd_devices (line 213) | void
function handle_display_mode_configuration (line 239) | boost::optional<device_display_mode_map_t>
function blank_hdr_states (line 301) | bool
function wait_for_display_stability (line 355) | bool
function hdr_state_map_t (line 409) | hdr_state_map_t
function handle_hdr_state_configuration (line 454) | boost::optional<hdr_state_map_t>
function try_revert_settings (line 509) | bool
function save_settings (line 713) | bool
function load_settings (line 747) | std::unique_ptr<settings_t::persistent_data_t>
function remove_file (line 771) | void
FILE: src/platform/windows/display_device/settings_topology.cpp
type display_device (line 10) | namespace display_device {
function active_topology_t (line 20) | active_topology_t
function get_duplicate_devices (line 93) | std::vector<std::string>
function is_device_found_in_active_topology (line 125) | bool
function active_topology_t (line 146) | active_topology_t
function remove_vdd_from_topology (line 208) | std::unordered_set<std::string>
function find_one_of_the_available_devices (line 273) | std::string
function get_device_ids_from_topology (line 294) | std::unordered_set<std::string>
function get_newly_enabled_devices_from_topology (line 306) | std::unordered_set<std::string>
function handle_device_topology_configuration (line 318) | boost::optional<handled_topology_result_t>
function get_current_topology_metadata (line 440) | boost::optional<handled_topology_result_t>
FILE: src/platform/windows/display_device/settings_topology.h
function namespace (line 6) | namespace display_device {
FILE: src/platform/windows/display_device/windows_utils.cpp
type display_device::w_utils (line 21) | namespace display_device::w_utils {
function get_monitor_device_path_wstr (line 30) | std::wstring
function get_device_interface_detail (line 52) | bool
function get_device_instance_id (line 85) | bool
function get_device_edid (line 111) | bool
function get_driver_key (line 161) | std::string
function get_error_string (line 179) | std::string
function is_primary (line 212) | bool
function are_modes_duplicated (line 217) | bool
function is_available (line 222) | bool
function is_active (line 227) | bool
function set_active (line 232) | void
function get_device_id (line 237) | std::string
function get_device_driver_path (line 349) | std::string
function get_monitor_device_path (line 402) | std::string
function get_friendly_name (line 407) | std::string
function get_display_name (line 434) | std::string
function hdr_state_e (line 451) | hdr_state_e
function set_hdr_state (line 473) | bool
function get_source_index (line 492) | boost::optional<UINT32>
function set_source_index (line 514) | void
function set_target_index (line 531) | void
function set_desktop_index (line 548) | void
function set_clone_group_id (line 565) | void
function DISPLAYCONFIG_SOURCE_MODE (line 582) | const DISPLAYCONFIG_SOURCE_MODE *
function DISPLAYCONFIG_SOURCE_MODE (line 602) | DISPLAYCONFIG_SOURCE_MODE *
function get_device_info_for_valid_path (line 607) | boost::optional<device_info_t>
function query_display_config (line 638) | boost::optional<path_and_mode_data_t>
function DISPLAYCONFIG_PATH_INFO (line 698) | const DISPLAYCONFIG_PATH_INFO *
function DISPLAYCONFIG_PATH_INFO (line 714) | DISPLAYCONFIG_PATH_INFO *
function is_user_session_locked (line 719) | bool
function test_no_access_to_ccd_api (line 755) | bool
function togglePnpDeviceByFriendlyName (line 779) | bool
function is_any_rdp_session_active (line 826) | bool is_any_rdp_session_active() {
function rotate_display (line 871) | bool
FILE: src/platform/windows/display_device/windows_utils.h
function ALL_DEVICES (line 12) | constexpr bool ALL_DEVICES { false }; /**< The device path can be active...
FILE: src/platform/windows/display_ram.cpp
type platf (line 10) | namespace platf {
type platf::dxgi (line 14) | namespace platf::dxgi {
type img_t (line 15) | struct img_t: public ::platf::img_t {
function blend_cursor_monochrome (line 22) | void
function apply_color_alpha (line 85) | void
function apply_color_masked (line 102) | void
function blend_cursor_color (line 114) | void
function blend_cursor (line 162) | void
function capture_e (line 179) | capture_e
function capture_e (line 328) | capture_e
FILE: src/platform/windows/display_vram.cpp
type platf (line 32) | namespace platf {
function free_frame (line 36) | static void
type platf::dxgi (line 43) | namespace platf::dxgi {
function buf_t (line 46) | buf_t
function blend_t (line 70) | blend_t
type img_d3d_t (line 150) | struct img_d3d_t: public platf::img_t {
type texture_lock_helper (line 184) | struct texture_lock_helper {
method texture_lock_helper (line 188) | texture_lock_helper(const texture_lock_helper &) = delete;
method texture_lock_helper (line 189) | texture_lock_helper &
method texture_lock_helper (line 192) | texture_lock_helper(texture_lock_helper &&other) {
method texture_lock_helper (line 198) | texture_lock_helper &
method texture_lock_helper (line 207) | texture_lock_helper(IDXGIKeyedMutex *mutex):
method lock (line 216) | bool
function make_cursor_xor_image (line 230) | util::buffer_t<std::uint8_t>
function make_cursor_alpha_image (line 301) | util::buffer_t<std::uint8_t>
function blob_t (line 376) | blob_t
function blob_t (line 403) | blob_t
function blob_t (line 408) | blob_t
function blob_t (line 413) | blob_t
class d3d_base_encode_device (line 418) | class d3d_base_encode_device final {
method convert (line 420) | int
method apply_colorspace (line 532) | void apply_colorspace(const ::video::sunshine_colorspace_t &colorspa...
method init_output (line 557) | int
method init (line 869) | int
type encoder_img_ctx_t (line 1000) | struct encoder_img_ctx_t {
method reset (line 1011) | void
method initialize_image_context (line 1021) | int
method shader_res_t (line 1067) | shader_res_t
type GroupResult (line 1170) | struct GroupResult {
type FinalResult (line 1179) | struct FinalResult {
method should_dispatch_hdr_analysis (line 1187) | bool
method init_hdr_luminance_analyzer (line 1200) | int
method dispatch_hdr_analysis (line 1398) | void
method read_hdr_analysis_results (line 1457) | void
class d3d_avcodec_encode_device_t (line 1516) | class d3d_avcodec_encode_device_t: public avcodec_encode_device_t {
method init (line 1518) | int
method convert (line 1525) | int
method apply_colorspace (line 1533) | void
method init_hwframes (line 1538) | void
method prepare_to_derive_context (line 1553) | int
method set_frame (line 1571) | int
class d3d_nvenc_encode_device_t (line 1616) | class d3d_nvenc_encode_device_t: public nvenc_encode_device_t {
method init_device (line 1618) | bool
method init_encoder (line 1640) | bool
method convert (line 1650) | int
class d3d_amf_encode_device_t (line 1664) | class d3d_amf_encode_device_t: public amf_encode_device_t {
method init_device (line 1666) | bool
method init_encoder (line 1679) | bool
method convert (line 1733) | int
function set_cursor_texture (line 1746) | bool
function capture_e (line 1791) | capture_e
function capture_e (line 2211) | capture_e
function capture_e (line 2355) | capture_e
function capture_e (line 2450) | capture_e
function capture_e (line 2463) | capture_e
function capture_e (line 2556) | capture_e
function init (line 2926) | int
FILE: src/platform/windows/display_wgc.cpp
type platf (line 35) | namespace platf {
type winrt (line 39) | namespace winrt {
type WINRT_IMPL_HAS_DECLSPEC_UUID (line 54) | struct
type platf::dxgi (line 78) | namespace platf::dxgi {
type secure_desktop (line 83) | namespace secure_desktop {
function backup_file_path (line 93) | static std::filesystem::path
function is_valid_consent_value (line 103) | static bool
function save_backup (line 112) | static bool
function remove_backup (line 135) | static void
function recover_from_crash (line 147) | static void
function disable (line 191) | static bool
function restore (line 251) | static void
function recover_secure_desktop (line 283) | void
function HWND (line 300) | static HWND
function capture_e (line 728) | capture_e
function capture_e (line 761) | capture_e
function capture_e (line 849) | capture_e
function capture_e (line 984) | capture_e
FILE: src/platform/windows/dsu_server.cpp
type platf (line 19) | namespace platf {
FILE: src/platform/windows/dsu_server.h
function namespace (line 17) | namespace platf {
FILE: src/platform/windows/ftime_compat.cpp
function ftime64 (line 4) | void ftime64(struct __timeb64* timeptr) {
FILE: src/platform/windows/input.cpp
type platf (line 40) | namespace platf {
type gp_touch_context_t (line 69) | struct gp_touch_context_t {
type gamepad_context_t (line 75) | struct gamepad_context_t {
function ds4_update_motion (line 147) | static void
class vigem_t (line 203) | class vigem_t {
method init (line 205) | int
method alloc_gamepad_internal (line 232) | int
method free_target (line 302) | void
method rumble (line 341) | void
method set_rgb_led (line 372) | void
function x360_notify (line 415) | void CALLBACK
function ds4_notify (line 429) | void CALLBACK
function set_mouse_mode (line 450) | void
type input_raw_t (line 456) | struct input_raw_t {
method init_dsu_server (line 468) | void
function input_t (line 494) | input_t
function send_input (line 535) | void
function inject_synthetic_pointer_input (line 558) | bool
function abs_mouse (line 572) | void
function move_mouse (line 595) | void
function get_mouse_loc (line 615) | util::point_t
function button_mouse (line 630) | void
function scroll (line 672) | void
function hscroll (line 698) | void
function keyboard_update (line 722) | void
type client_input_raw_t (line 780) | struct client_input_raw_t: public client_input_t {
method client_input_raw_t (line 781) | client_input_raw_t(input_t &input) {
function allocate_client_input_context (line 823) | std::unique_ptr<client_input_t>
function perform_touch_compaction (line 833) | void
function POINTER_TYPE_INFO (line 865) | POINTER_TYPE_INFO *
function populate_common_pointer_info (line 906) | void
function repeat_touch (line 968) | void
function repeat_pen (line 982) | void
function cancel_all_active_touches (line 996) | void
function touch_update (line 1033) | void
function pen_update (line 1164) | void
function unicode (line 1283) | void
function alloc_gamepad (line 1312) | int
function free_gamepad (line 1378) | void
function XUSB_BUTTON (line 1394) | static XUSB_BUTTON
function x360_update_state (line 1423) | static void
function DS4_DPAD_DIRECTIONS (line 1436) | static DS4_DPAD_DIRECTIONS
function DS4_BUTTONS (line 1479) | static DS4_BUTTONS
function DS4_SPECIAL_BUTTONS (line 1501) | static DS4_SPECIAL_BUTTONS
function to_ds4_triggerX (line 1516) | static std::uint8_t
function to_ds4_triggerY (line 1521) | static std::uint8_t
function ds4_update_state (line 1533) | static void
function ds4_update_ts_and_send (line 1556) | void
function gamepad_update (line 1592) | void
function gamepad_touch (line 1627) | void
function gamepad_motion (line 1741) | void
function gamepad_battery (line 1797) | void
function freeInput (line 1867) | void
function get_capabilities (line 1915) | platform_caps::caps_t
FILE: src/platform/windows/keylayout.h
function namespace (line 10) | namespace platf {
FILE: src/platform/windows/mic_write.cpp
type platf::audio (line 37) | namespace platf::audio {
function co_task_free (line 40) | void
class prop_var_t (line 55) | class prop_var_t {
method prop_var_t (line 57) | prop_var_t() {
function capture_e (line 121) | capture_e
function HRESULT (line 677) | HRESULT
FILE: src/platform/windows/mic_write.h
type OpusDecoder (line 19) | struct OpusDecoder
function namespace (line 21) | namespace platf::audio {
FILE: src/platform/windows/misc.cpp
function nt_set_timer_resolution_max (line 77) | bool
function nt_set_timer_resolution_min (line 87) | bool
type platf (line 102) | namespace platf {
function appdata (line 125) | std::filesystem::path
function from_sockaddr (line 132) | std::string
function from_sockaddr_ex (line 147) | std::pair<std::uint16_t, std::string>
function adapteraddrs_t (line 165) | adapteraddrs_t
function get_mac_address (line 177) | std::string
function HDESK (line 199) | HDESK
function print_status (line 226) | void
function IsUserAdmin (line 241) | bool
function HANDLE (line 271) | HANDLE
function merge_user_environment_block (line 333) | bool
function is_running_as_system (line 374) | bool
function append_string_to_environment_block (line 406) | void
function create_environment_block (line 412) | std::wstring
function LPPROC_THREAD_ATTRIBUTE_LIST (line 442) | LPPROC_THREAD_ATTRIBUTE_LIST
function free_proc_thread_attr_list (line 460) | void
function create_boost_child_from_results (line 474) | bp::child
function impersonate_current_user (line 512) | std::error_code
function STARTUPINFOEXW (line 550) | STARTUPINFOEXW
function override_per_user_predefined_keys (line 610) | bool
function escape_argument (line 667) | std::wstring
function expand_env_vars_in_cmd (line 711) | std::string
function escape_argument_for_cmd (line 790) | std::wstring
function resolve_command_string (line 815) | std::wstring
function run_command (line 1037) | bp::child
function open_url (line 1172) | void
function open_url_in_browser (line 1193) | void
function adjust_thread_priority (line 1209) | void
function streaming_will_start (line 1237) | void
function streaming_will_stop (line 1357) | void
function enter_away_mode (line 1392) | void
function exit_away_mode (line 1414) | void
function is_away_mode_active (line 1440) | bool
function system_sleep (line 1445) | bool
function system_hibernate (line 1468) | bool
function restart_on_exit (line 1486) | void
function restart (line 1518) | void
function set_env (line 1531) | int
function unset_env (line 1536) | int
type enum_wnd_context_t (line 1541) | struct enum_wnd_context_t {
function BOOL (line 1546) | static BOOL CALLBACK
function request_process_group_exit (line 1574) | bool
function process_group_running (line 1618) | bool
function SOCKADDR_IN (line 1631) | SOCKADDR_IN
function SOCKADDR_IN6 (line 1644) | SOCKADDR_IN6
function send_batch (line 1660) | bool
function send (line 1768) | bool
class qos_t (line 1851) | class qos_t: public deinit_t {
method qos_t (line 1853) | qos_t(QOS_FLOWID flow_id):
function enable_socket_qos (line 1875) | std::unique_ptr<deinit_t>
function qpc_counter (line 1986) | int64_t
function qpc_time_difference (line 1993) | std::chrono::nanoseconds
function from_utf8 (line 2008) | std::wstring
function to_utf8 (line 2035) | std::string
function get_host_name (line 2064) | std::string
class win32_high_precision_timer (line 2074) | class win32_high_precision_timer: public high_precision_timer {
method win32_high_precision_timer (line 2076) | win32_high_precision_timer() {
method sleep_for (line 2091) | void
function create_high_precision_timer (line 2120) | std::unique_ptr<high_precision_timer>
function fuzzy_match (line 2125) | bool
function split_words (line 2146) | std::vector<std::wstring>
FILE: src/platform/windows/misc.h
function namespace (line 14) | namespace platf {
FILE: src/platform/windows/nvprefs/driver_settings.cpp
function nvapi_error_message (line 14) | void
function fill_nvapi_string (line 21) | void
type nvprefs (line 29) | namespace nvprefs {
FILE: src/platform/windows/nvprefs/driver_settings.h
function namespace (line 37) | namespace nvprefs {
FILE: src/platform/windows/nvprefs/nvapi_opensource_wrapper.cpp
function NvAPI_Status (line 21) | NvAPI_Status
function NVAPI_INTERFACE (line 39) | NVAPI_INTERFACE
function NVAPI_INTERFACE (line 62) | NVAPI_INTERFACE
function NVAPI_INTERFACE (line 72) | NVAPI_INTERFACE
function NVAPI_INTERFACE (line 79) | NVAPI_INTERFACE
function NVAPI_INTERFACE (line 84) | NVAPI_INTERFACE
function NVAPI_INTERFACE (line 89) | NVAPI_INTERFACE
function NVAPI_INTERFACE (line 94) | NVAPI_INTERFACE
function NVAPI_INTERFACE (line 99) | NVAPI_INTERFACE
function NVAPI_INTERFACE (line 104) | NVAPI_INTERFACE
function NVAPI_INTERFACE (line 109) | NVAPI_INTERFACE
function NVAPI_INTERFACE (line 114) | NVAPI_INTERFACE
function NVAPI_INTERFACE (line 119) | NVAPI_INTERFACE
function NVAPI_INTERFACE (line 124) | NVAPI_INTERFACE
function NVAPI_INTERFACE (line 129) | NVAPI_INTERFACE
function NVAPI_INTERFACE (line 134) | NVAPI_INTERFACE
FILE: src/platform/windows/nvprefs/nvprefs_common.cpp
type nvprefs (line 12) | namespace nvprefs {
function info_message (line 14) | void
function info_message (line 19) | void
function error_message (line 24) | void
function error_message (line 29) | void
function nvprefs_options (line 34) | nvprefs_options
FILE: src/platform/windows/nvprefs/nvprefs_common.h
function namespace (line 17) | namespace nvprefs {
FILE: src/platform/windows/nvprefs/nvprefs_interface.cpp
type nvprefs (line 20) | namespace nvprefs {
type nvprefs_interface::impl (line 22) | struct nvprefs_interface::impl {
FILE: src/platform/windows/nvprefs/nvprefs_interface.h
function namespace (line 10) | namespace nvprefs {
FILE: src/platform/windows/nvprefs/undo_data.cpp
type nlohmann (line 16) | namespace nlohmann {
type adl_serializer<std::optional<T>> (line 21) | struct adl_serializer<std::optional<T>> {
method to_json (line 22) | static void
method from_json (line 32) | static void
type adl_serializer<data_t> (line 44) | struct adl_serializer<data_t> {
method to_json (line 45) | static void
method from_json (line 50) | static void
type adl_serializer<opengl_swapchain_t> (line 57) | struct adl_serializer<opengl_swapchain_t> {
method to_json (line 58) | static void
method from_json (line 66) | static void
type nvprefs (line 74) | namespace nvprefs {
FILE: src/platform/windows/nvprefs/undo_data.h
function namespace (line 13) | namespace nvprefs {
FILE: src/platform/windows/nvprefs/undo_file.cpp
function DWORD (line 12) | DWORD
type nvprefs (line 45) | namespace nvprefs {
FILE: src/platform/windows/nvprefs/undo_file.h
function namespace (line 14) | namespace nvprefs {
FILE: src/platform/windows/publish.cpp
type _DNS_SERVICE_INSTANCE (line 44) | struct _DNS_SERVICE_INSTANCE {
type _DNS_SERVICE_CANCEL (line 74) | struct _DNS_SERVICE_CANCEL {
type _DNS_SERVICE_REGISTER_REQUEST (line 78) | struct _DNS_SERVICE_REGISTER_REQUEST {
type platf::publish (line 94) | namespace platf::publish {
function VOID (line 95) | VOID WINAPI
function service (line 106) | static int
class mdns_registration_t (line 175) | class mdns_registration_t: public ::platf::deinit_t {
method mdns_registration_t (line 177) | mdns_registration_t():
function load_funcs (line 202) | int
function start (line 221) | std::unique_ptr<::platf::deinit_t>
FILE: src/platform/windows/virtual_mouse.cpp
type null_log_t (line 33) | struct null_log_t {
method null_log_t (line 35) | null_log_t &
function null_log_t (line 41) | null_log_t &
method null_log_t (line 35) | null_log_t &
function wide_to_utf8 (line 55) | std::string
function query_caps (line 65) | bool
function is_vmouse_device (line 77) | bool
type platf (line 87) | namespace platf {
type vmouse (line 88) | namespace vmouse {
type detail (line 89) | namespace detail {
function output_report_t (line 90) | output_report_t
function apply_button_transition (line 105) | uint8_t
function should_close_on_write_error (line 112) | bool
type device_t::impl_t (line 126) | struct device_t::impl_t {
method stop_flush_thread (line 145) | void
method start_flush_thread (line 153) | void
method flush_accumulated (line 164) | void
method close (line 181) | void
method open (line 195) | bool
method sendReportDirect (line 281) | bool
function device_t (line 356) | device_t
function is_driver_installed (line 366) | bool
FILE: src/platform/windows/virtual_mouse.h
function namespace (line 16) | namespace platf {
FILE: src/platform/windows/win_dark_mode.cpp
type win_dark_mode (line 13) | namespace win_dark_mode {
type PreferredAppMode (line 16) | enum class PreferredAppMode {
function init_dark_mode_apis (line 47) | static void
function enable_process_dark_mode (line 63) | void
FILE: src/platform/windows/win_dark_mode.h
function namespace (line 17) | namespace win_dark_mode {
FILE: src/process.cpp
type proc (line 50) | namespace proc {
class deinit_t (line 58) | class deinit_t: public platf::deinit_t {
function init (line 65) | std::unique_ptr<platf::deinit_t>
function terminate_process_group (line 70) | void
function find_working_directory (line 112) | boost::filesystem::path
function find_match (line 511) | std::string_view::iterator
function parse_env_val (line 533) | std::string
function validate_app_image_path (line 588) | std::string
function calculate_sha256 (line 685) | std::optional<std::string>
function calculate_crc32 (line 721) | uint32_t
function calculate_app_id (line 728) | std::tuple<std::string, std::string>
function parse (line 769) | std::optional<proc::proc_t>
function refresh (line 918) | void
FILE: src/process.h
function namespace (line 21) | namespace proc {
FILE: src/round_robin.h
function namespace (line 14) | namespace round_robin_util {
function other (line 133) | bool
function dec (line 161) | void
function eq (line 170) | bool
FILE: src/rswrapper.c
function reed_solomon_init (line 124) | void
FILE: src/rswrapper.h
type reed_solomon (line 10) | typedef struct _reed_solomon reed_solomon;
type reed_solomon (line 12) | typedef reed_solomon *(*reed_solomon_new_t)(int data_shards, int parity_...
FILE: src/rtsp.cpp
type rtsp_stream (line 43) | namespace rtsp_stream {
function parse_legacy_surround_params (line 45) | bool
function parse_delimited_surround_params (line 74) | bool
function parse_surround_params (line 132) | bool
function free_msg (line 139) | void
type encrypted_rtsp_header_t (line 148) | struct encrypted_rtsp_header_t {
method payload_length (line 158) | std::uint32_t
method is_encrypted (line 163) | bool
class rtsp_server_t (line 180) | class rtsp_server_t
method bind (line 520) | int
method handle_msg (line 557) | void
method handle_accept (line 574) | void
method map (line 613) | void
method session_raise (line 624) | void
method session_clear (line 652) | void
method session_count (line 672) | int
method clear (line 687) | void
method remove (line 709) | void
method insert (line 719) | void
method iterate (line 729) | void
method stop (line 744) | void
class socket_t (line 192) | class socket_t: public std::enable_shared_from_this<socket_t> {
method socket_t (line 194) | socket_t(boost::asio::io_context &io_context, std::function<void(tcp...
method read (line 202) | void
method handle_read_encrypted_header (line 239) | static void
method handle_read_encrypted_message (line 289) | static void
method read_plaintext_payload (line 352) | void
method handle_plaintext_payload (line 383) | static void
method handle_read_plaintext (line 454) | static void
method handle_data (line 497) | void
class rtsp_server_t (line 514) | class rtsp_server_t {
method bind (line 520) | int
method handle_msg (line 557) | void
method handle_accept (line 574) | void
method map (line 613) | void
method session_raise (line 624) | void
method session_clear (line 652) | void
method session_count (line 672) | int
method clear (line 687) | void
method remove (line 709) | void
method insert (line 719) | void
method iterate (line 729) | void
method stop (line 744) | void
function launch_session_raise (line 765) | void
function launch_session_clear (line 770) | void
function session_count (line 775) | int
function terminate_sessions (line 783) | void
function send (line 788) | int
function respond (line 805) | void
function respond (line 875) | void
function cmd_not_found (line 883) | void
function cmd_option (line 888) | void
function cmd_describe (line 901) | void
function cmd_setup (line 1018) | void
function cmd_announce (line 1090) | void
function cmd_play (line 1338) | void
function start (line 1351) | void
function print_msg (line 1395) | void
FILE: src/rtsp.h
type launch_session_t (line 17) | struct launch_session_t {
function setup_mic (line 55) | bool setup_mic { false };
FILE: src/stat_trackers.cpp
type stat_trackers (line 7) | namespace stat_trackers {
function one_digit_after_decimal (line 9) | boost::format
function two_digits_after_decimal (line 14) | boost::format
FILE: src/stat_trackers.h
function namespace (line 13) | namespace stat_trackers {
FILE: src/stb_image.h
type stbi_uc (line 387) | typedef unsigned char stbi_uc;
type stbi_us (line 388) | typedef unsigned short stbi_us;
type stbi_io_callbacks (line 411) | typedef struct
type stbi__uint16 (line 642) | typedef unsigned short stbi__uint16;
type stbi__int16 (line 643) | typedef signed short stbi__int16;
type stbi__uint32 (line 644) | typedef unsigned int stbi__uint32;
type stbi__int32 (line 645) | typedef signed int stbi__int32;
type stbi__uint16 (line 648) | typedef uint16_t stbi__uint16;
type stbi__int16 (line 649) | typedef int16_t stbi__int16;
type stbi__uint32 (line 650) | typedef uint32_t stbi__uint32;
type stbi__int32 (line 651) | typedef int32_t stbi__int32;
function stbi__cpuid3 (line 732) | static int stbi__cpuid3(void)
function stbi__sse2_available (line 754) | static int stbi__sse2_available(void)
function stbi__sse2_available (line 765) | static int stbi__sse2_available(void)
type stbi__context (line 805) | typedef struct
function stbi__start_mem (line 826) | static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int...
function stbi__start_callbacks (line 836) | static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c...
function stbi__stdio_read (line 850) | static int stbi__stdio_read(void *user, char *data, int size)
function stbi__stdio_skip (line 855) | static void stbi__stdio_skip(void *user, int n)
function stbi__stdio_eof (line 865) | static int stbi__stdio_eof(void *user)
function stbi__start_file (line 877) | static void stbi__start_file(stbi__context *s, FILE *f)
function stbi__rewind (line 886) | static void stbi__rewind(stbi__context *s)
type stbi__result_info (line 901) | typedef struct
function STBIDEF (line 972) | STBIDEF const char *stbi_failure_reason(void)
function stbi__err (line 978) | static int stbi__err(const char *str)
function stbi__addsizes_valid (line 1002) | static int stbi__addsizes_valid(int a, int b)
function stbi__mul2sizes_valid (line 1014) | static int stbi__mul2sizes_valid(int a, int b)
function stbi__mad2sizes_valid (line 1024) | static int stbi__mad2sizes_valid(int a, int b, int add)
function stbi__mad3sizes_valid (line 1031) | static int stbi__mad3sizes_valid(int a, int b, int c, int add)
function stbi__mad4sizes_valid (line 1039) | static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add)
function stbi__addints_valid (line 1070) | static int stbi__addints_valid(int a, int b)
function stbi__mul2shorts_valid (line 1078) | static int stbi__mul2shorts_valid(int a, int b)
function STBIDEF (line 1101) | STBIDEF void stbi_image_free(void *retval_from_stbi_load)
function STBIDEF (line 1116) | STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)
function STBIDEF (line 1126) | STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_sh...
function stbi_uc (line 1190) | static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, ...
function stbi__uint16 (line 1206) | static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, ...
function stbi__vertical_flip (line 1222) | static void stbi__vertical_flip(void *image, int w, int h, int bytes_per...
function stbi__vertical_flip_slices (line 1247) | static void stbi__vertical_flip_slices(void *image, int w, int h, int z,...
function stbi__uint16 (line 1286) | static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, ...
function stbi__float_postprocess (line 1314) | static void stbi__float_postprocess(float *result, int *x, int *y, int *...
function STBIDEF (line 1331) | STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, c...
function FILE (line 1337) | static FILE *stbi__fopen(char const *filename, char const *mode)
function STBIDEF (line 1366) | STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *co...
function STBIDEF (line 1376) | STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp,...
function STBIDEF (line 1389) | STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, in...
function STBIDEF (line 1402) | STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int ...
function STBIDEF (line 1415) | STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len...
function STBIDEF (line 1422) | STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *cl...
function STBIDEF (line 1429) | STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, i...
function STBIDEF (line 1436) | STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk,...
function STBIDEF (line 1444) | STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int le...
function STBIDEF (line 1478) | STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, in...
function STBIDEF (line 1485) | STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, ...
function STBIDEF (line 1493) | STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *com...
function STBIDEF (line 1503) | STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, ...
function STBIDEF (line 1517) | STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
function STBIDEF (line 1531) | STBIDEF int stbi_is_hdr (char const *filename)
function STBIDEF (line 1542) | STBIDEF int stbi_is_hdr_from_file(FILE *f)
function STBIDEF (line 1559) | STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clb...
function STBIDEF (line 1575) | STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = ga...
function STBIDEF (line 1576) | STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = sc...
function STBIDEF (line 1581) | STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = ...
function STBIDEF (line 1582) | STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = ...
function stbi__refill_buffer (line 1597) | static void stbi__refill_buffer(stbi__context *s)
function stbi_inline (line 1614) | stbi_inline static stbi_uc stbi__get8(stbi__context *s)
function stbi_inline (line 1628) | stbi_inline static int stbi__at_eof(stbi__context *s)
function stbi__skip (line 1644) | static void stbi__skip(stbi__context *s, int n)
function stbi__getn (line 1666) | static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n)
function stbi__get16be (line 1694) | static int stbi__get16be(stbi__context *s)
function stbi__uint32 (line 1704) | static stbi__uint32 stbi__get32be(stbi__context *s)
function stbi__get16le (line 1714) | static int stbi__get16le(stbi__context *s)
function stbi__uint32 (line 1722) | static stbi__uint32 stbi__get32le(stbi__context *s)
function stbi_uc (line 1746) | static stbi_uc stbi__compute_y(int r, int g, int b)
function stbi__uint16 (line 1803) | static stbi__uint16 stbi__compute_y_16(int r, int g, int b)
function stbi__uint16 (line 1812) | static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_...
function stbi_uc (line 1884) | static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp)
type stbi__huffman (line 1938) | typedef struct
type stbi__jpeg (line 1949) | typedef struct
function stbi__build_huffman (line 2003) | static int stbi__build_huffman(stbi__huffman *h, int *count)
function stbi__build_fast_ac (line 2050) | static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
function stbi__grow_buffer_unsafe (line 2075) | static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
function stbi_inline (line 2097) | stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffm...
function stbi_inline (line 2153) | stbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n)
function stbi_inline (line 2169) | stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n)
function stbi_inline (line 2181) | stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j)
function stbi__jpeg_decode_block (line 2210) | static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__...
function stbi__jpeg_decode_block_prog_dc (line 2265) | static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64]...
function stbi__jpeg_decode_block_prog_ac (line 2295) | static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64]...
function stbi_inline (line 2416) | stbi_inline static stbi_uc stbi__clamp(int x)
function stbi__idct_block (line 2467) | static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64])
function stbi__idct_simd (line 2530) | static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])
function stbi__idct_simd (line 2711) | static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])
function stbi_uc (line 2919) | static stbi_uc stbi__get_marker(stbi__jpeg *j)
function stbi__jpeg_reset (line 2936) | static void stbi__jpeg_reset(stbi__jpeg *j)
function stbi__parse_entropy_coded_data (line 2949) | static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
function stbi__jpeg_dequantize (line 3073) | static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant)
function stbi__jpeg_finish (line 3080) | static void stbi__jpeg_finish(stbi__jpeg *z)
function stbi__process_marker (line 3099) | static int stbi__process_marker(stbi__jpeg *z, int m)
function stbi__process_scan_header (line 3203) | static int stbi__process_scan_header(stbi__jpeg *z)
function stbi__free_jpeg_components (line 3242) | static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why)
function stbi__process_frame_header (line 3264) | static int stbi__process_frame_header(stbi__jpeg *z, int scan)
function stbi__decode_jpeg_header (line 3365) | static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan)
function stbi_uc (line 3389) | static stbi_uc stbi__skip_jpeg_junk_at_end(stbi__jpeg *j)
function stbi__decode_jpeg_image (line 3412) | static int stbi__decode_jpeg_image(stbi__jpeg *j)
type stbi_uc (line 3451) | typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_u...
function stbi_uc (line 3456) | static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *...
function stbi_uc (line 3465) | static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, s...
function stbi_uc (line 3475) | static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, ...
function stbi_uc (line 3505) | static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, ...
function stbi_uc (line 3530) | static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_n...
function stbi_uc (line 3646) | static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_nea...
function stbi__YCbCr_to_RGB_row (line 3660) | static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const...
function stbi__YCbCr_to_RGB_simd (line 3686) | static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi...
function stbi__setup_jpeg (line 3821) | static void stbi__setup_jpeg(stbi__jpeg *j)
function stbi__cleanup_jpeg (line 3843) | static void stbi__cleanup_jpeg(stbi__jpeg *j)
type stbi__resample (line 3848) | typedef struct
function stbi_uc (line 3859) | static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)
function stbi_uc (line 3865) | static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, i...
function stbi__jpeg_test (line 4042) | static int stbi__jpeg_test(stbi__context *s)
function stbi__jpeg_info_raw (line 4056) | static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)
function stbi__jpeg_info (line 4068) | static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)
type stbi__zhuffman (line 4097) | typedef struct
function stbi_inline (line 4107) | stbi_inline static int stbi__bitreverse16(int n)
function stbi_inline (line 4116) | stbi_inline static int stbi__bit_reverse(int v, int bits)
function stbi__zbuild_huffman (line 4124) | static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizeli...
type stbi__zbuf (line 4177) | typedef struct
function stbi_inline (line 4192) | stbi_inline static int stbi__zeof(stbi__zbuf *z)
function stbi_inline (line 4197) | stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z)
function stbi__fill_bits (line 4202) | static void stbi__fill_bits(stbi__zbuf *z)
function stbi__zreceive (line 4214) | int stbi__zreceive(stbi__zbuf *z, int n)
function stbi__zhuffman_decode_slowpath (line 4224) | static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
function stbi_inline (line 4243) | stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffm...
function stbi__zexpand (line 4273) | static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to m...
function stbi__parse_huffman_block (line 4309) | static int stbi__parse_huffman_block(stbi__zbuf *a)
function stbi__compute_huffman_codes (line 4359) | static int stbi__compute_huffman_codes(stbi__zbuf *a)
function stbi__parse_uncompressed_block (line 4409) | static int stbi__parse_uncompressed_block(stbi__zbuf *a)
function stbi__parse_zlib_header (line 4438) | static int stbi__parse_zlib_header(stbi__zbuf *a)
function stbi__parse_zlib (line 4481) | static int stbi__parse_zlib(stbi__zbuf *a, int parse_header)
function stbi__do_zlib (line 4510) | static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, i...
function STBIDEF (line 4520) | STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int ...
function STBIDEF (line 4536) | STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *...
function STBIDEF (line 4541) | STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *b...
function STBIDEF (line 4557) | STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const ...
function STBIDEF (line 4568) | STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int l...
function STBIDEF (line 4584) | STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, co...
type stbi__pngchunk (line 4607) | typedef struct
function stbi__pngchunk (line 4613) | static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
function stbi__check_png_header (line 4621) | static int stbi__check_png_header(stbi__context *s)
type stbi__png (line 4630) | typedef struct
function stbi__paeth (line 4657) | static int stbi__paeth(int a, int b, int c)
function stbi__create_png_alpha_expand8 (line 4675) | static void stbi__create_png_alpha_expand8(stbi_uc *dest, stbi_uc *src, ...
function stbi__create_png_image_raw (line 4696) | static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__...
function stbi__create_png_image (line 4861) | static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stb...
function stbi__compute_transparency (line 4906) | static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int o...
function stbi__compute_transparency16 (line 4931) | static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3]...
function stbi__expand_png_palette (line 4956) | static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int ...
function STBIDEF (line 4996) | STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpr...
function STBIDEF (line 5001) | STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_conv...
function STBIDEF (line 5013) | STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_shou...
function STBIDEF (line 5019) | STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_shou...
function stbi__de_iphone (line 5033) | static void stbi__de_iphone(stbi__png *z)
function stbi__parse_png_file (line 5078) | static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
function stbi__png_test (line 5302) | static int stbi__png_test(stbi__context *s)
function stbi__png_info_raw (line 5310) | static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp)
function stbi__png_info (line 5322) | static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)
function stbi__png_is16 (line 5329) | static int stbi__png_is16(stbi__context *s)
function stbi__bmp_test_raw (line 5346) | static int stbi__bmp_test_raw(stbi__context *s)
function stbi__bmp_test (line 5361) | static int stbi__bmp_test(stbi__context *s)
function stbi__high_bit (line 5370) | static int stbi__high_bit(unsigned int z)
function stbi__bitcount (line 5382) | static int stbi__bitcount(unsigned int a)
function stbi__shiftsigned (line 5395) | static int stbi__shiftsigned(unsigned int v, int shift, int bits)
type stbi__bmp_data (line 5415) | typedef struct
function stbi__bmp_set_mask_defaults (line 5422) | static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress)
function stbi__tga_get_comp (line 5739) | static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_r...
function stbi__tga_info (line 5755) | static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)
function stbi__tga_test (line 5820) | static int stbi__tga_test(stbi__context *s)
function stbi__tga_read_rgb16 (line 5852) | static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)
function stbi__psd_test (line 6081) | static int stbi__psd_test(stbi__context *s)
function stbi__psd_decode_rle (line 6088) | static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelC...
function stbi__pic_is4 (line 6336) | static int stbi__pic_is4(stbi__context *s,const char *str)
function stbi__pic_test_core (line 6346) | static int stbi__pic_test_core(stbi__context *s)
type stbi__pic_packet (line 6362) | typedef struct
function stbi_uc (line 6367) | static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest)
function stbi__copyval (line 6381) | static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src)
function stbi_uc (line 6390) | static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int heigh...
function stbi__pic_test (line 6541) | static int stbi__pic_test(stbi__context *s)
type stbi__gif_lzw (line 6553) | typedef struct
type stbi__gif (line 6560) | typedef struct
function stbi__gif_test_raw (line 6580) | static int stbi__gif_test_raw(stbi__context *s)
function stbi__gif_test (line 6590) | static int stbi__gif_test(stbi__context *s)
function stbi__gif_parse_colortable (line 6597) | static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256...
function stbi__gif_header (line 6608) | static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, i...
function stbi__gif_info_raw (line 6639) | static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)
function stbi__out_gif_code (line 6654) | static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
function stbi_uc (line 6691) | static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
function stbi_uc (line 6778) | static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int ...
function stbi__gif_info (line 7077) | static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)
function stbi__hdr_test_core (line 7087) | static int stbi__hdr_test_core(stbi__context *s, const char *signature)
function stbi__hdr_test (line 7097) | static int stbi__hdr_test(stbi__context* s)
function stbi__hdr_convert (line 7131) | static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp)
function stbi__hdr_info (line 7289) | static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)
function stbi__bmp_info (line 7335) | static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)
function stbi__psd_info (line 7359) | static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
function stbi__psd_is16 (line 7394) | static int stbi__psd_is16(stbi__context *s)
function stbi__pic_info (line 7423) | static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)
function stbi__pnm_test (line 7494) | static int stbi__pnm_test(stbi__context *s)
function stbi__pnm_isspace (line 7543) | static int stbi__pnm_isspace(char c)
function stbi__pnm_skip_whitespace (line 7548) | static void stbi__pnm_skip_whitespace(stbi__context *s, char *c)
function stbi__pnm_isdigit (line 7562) | static int stbi__pnm_isdigit(char c)
function stbi__pnm_getinteger (line 7567) | static int stbi__pnm_getinteger(stbi__context *s, char *c)
function stbi__pnm_info (line 7581) | static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)
function stbi__pnm_is16 (line 7624) | static int stbi__pnm_is16(stbi__context *s)
function stbi__info_main (line 7632) | static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)
function stbi__is_16_main (line 7674) | static int stbi__is_16_main(stbi__context *s)
function STBIDEF (line 7691) | STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)
function STBIDEF (line 7701) | STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
function STBIDEF (line 7712) | STBIDEF int stbi_is_16_bit(char const *filename)
function STBIDEF (line 7722) | STBIDEF int stbi_is_16_bit_from_file(FILE *f)
function STBIDEF (line 7734) | STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x...
function STBIDEF (line 7741) | STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *u...
function STBIDEF (line 7748) | STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len)
function STBIDEF (line 7755) | STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, vo...
FILE: src/stb_image_write.h
function STBIWDEF (line 262) | STBIWDEF void stbi_flip_vertically_on_write(int flag)
type stbi__write_context (line 267) | typedef struct
function stbi__start_write_callbacks (line 276) | static void stbi__start_write_callbacks(stbi__write_context *s, stbi_wri...
function stbi__stdio_write (line 284) | static void stbi__stdio_write(void *context, void *data, int size)
function STBIWDEF (line 298) | STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen,...
function FILE (line 304) | static FILE *stbiw__fopen(char const *filename, char const *mode)
function stbi__start_write_file (line 332) | static int stbi__start_write_file(stbi__write_context *s, const char *fi...
function stbi__end_write_file (line 339) | static void stbi__end_write_file(stbi__write_context *s)
type stbiw_uint32 (line 346) | typedef unsigned int stbiw_uint32;
function stbiw__writefv (line 349) | static void stbiw__writefv(stbi__write_context *s, const char *fmt, va_l...
function stbiw__writef (line 378) | static void stbiw__writef(stbi__write_context *s, const char *fmt, ...)
function stbiw__write_flush (line 386) | static void stbiw__write_flush(stbi__write_context *s)
function stbiw__putc (line 394) | static void stbiw__putc(stbi__write_context *s, unsigned char c)
function stbiw__write1 (line 399) | static void stbiw__write1(stbi__write_context *s, unsigned char a)
function stbiw__write3 (line 406) | static void stbiw__write3(stbi__write_context *s, unsigned char a, unsig...
function stbiw__write_pixel (line 418) | static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int ...
function stbiw__write_pixels (line 451) | static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int...
function stbiw__outfile (line 478) | static int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir,...
function stbi_write_bmp_core (line 492) | static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int...
function STBIWDEF (line 512) | STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context...
function STBIWDEF (line 520) | STBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp...
function stbi_write_tga_core (line 532) | static int stbi_write_tga_core(stbi__write_context *s, int x, int y, int...
function STBIWDEF (line 611) | STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context...
function STBIWDEF (line 619) | STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp...
function stbiw__linear_to_rgbe (line 639) | static void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear)
function stbiw__write_run_data (line 656) | static void stbiw__write_run_data(stbi__write_context *s, int length, un...
function stbiw__write_dump_data (line 664) | static void stbiw__write_dump_data(stbi__write_context *s, int length, u...
function stbiw__write_hdr_scanline (line 672) | static void stbiw__write_hdr_scanline(stbi__write_context *s, int width,...
function stbi_write_hdr_core (line 761) | static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int...
function STBIWDEF (line 787) | STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context...
function STBIWDEF (line 794) | STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp...
function stbiw__zlib_bitrev (line 849) | static int stbiw__zlib_bitrev(int code, int codebits)
function stbiw__zlib_countm (line 859) | static unsigned int stbiw__zlib_countm(unsigned char *a, unsigned char *...
function stbiw__zhash (line 867) | static unsigned int stbiw__zhash(unsigned char *data)
function stbiw__crc32 (line 1024) | static unsigned int stbiw__crc32(unsigned char *buffer, int len)
function stbiw__wpcrc (line 1077) | static void stbiw__wpcrc(unsigned char **data, int len)
function stbiw__paeth (line 1083) | static unsigned char stbiw__paeth(int a, int b, int c)
function stbiw__encode_png_line (line 1092) | static void stbiw__encode_png_line(unsigned char *pixels, int stride_byt...
function STBIWDEF (line 1215) | STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp...
function STBIWDEF (line 1231) | STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context...
function stbiw__jpg_writeBits (line 1253) | static void stbiw__jpg_writeBits(stbi__write_context *s, int *bitBufP, i...
function stbiw__jpg_DCT (line 1270) | static void stbiw__jpg_DCT(float *d0p, float *d1p, float *d2p, float *d3...
function stbiw__jpg_calcBits (line 1318) | static void stbiw__jpg_calcBits(int val, unsigned short bits[2]) {
function stbiw__jpg_processDU (line 1328) | static int stbiw__jpg_processDU(stbi__write_context *s, int *bitBuf, int...
function stbi_write_jpg_core (line 1398) | static int stbi_write_jpg_core(stbi__write_context *s, int width, int he...
function STBIWDEF (line 1607) | STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context...
function STBIWDEF (line 1616) | STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp...
FILE: src/stream.cpp
type stream (line 102) | namespace stream {
type socket_e (line 104) | enum class socket_e : int {
type video_short_frame_header_t (line 112) | struct video_short_frame_header_t {
type video_packet_raw_t (line 143) | struct video_packet_raw_t {
type video_packet_enc_prefix_t (line 155) | struct video_packet_enc_prefix_t {
type audio_packet_t (line 161) | struct audio_packet_t {
type control_header_v2 (line 165) | struct control_header_v2 {
type control_terminate_t (line 175) | struct control_terminate_t {
type control_rumble_t (line 181) | struct control_rumble_t {
type control_rumble_triggers_t (line 191) | struct control_rumble_triggers_t {
type control_set_motion_event_t (line 199) | struct control_set_motion_event_t {
type control_set_rgb_led_t (line 207) | struct control_set_rgb_led_t {
type control_adaptive_triggers_t (line 216) | struct control_adaptive_triggers_t {
type control_hdr_mode_t (line 231) | struct control_hdr_mode_t {
type control_resolution_change_t (line 240) | struct control_resolution_change_t {
type control_encrypted_t (line 247) | struct control_encrypted_t {
type audio_fec_packet_t (line 261) | struct audio_fec_packet_t {
type mic_packet_t (line 266) | struct mic_packet_t {
type rtp_packet_ext_t (line 271) | struct rtp_packet_ext_t {
function round_to_pkcs7_padded (line 281) | constexpr std::size_t
function encode_audio (line 295) | static inline int
function while_starting_do_nothing (line 306) | static inline void
class control_server_t (line 313) | class control_server_t {
method bind (line 315) | int
method map (line 346) | void
method send (line 351) | int
method flush (line 363) | void
type broadcast_ctx_t (line 381) | struct broadcast_ctx_t {
type mic_cipher_ctx_t (line 403) | struct mic_cipher_ctx_t {
method mic_cipher_ctx_t (line 407) | mic_cipher_ctx_t(const crypto::aes_t &key, bool padding, std::uint...
method mic_cipher_ctx_t (line 417) | mic_cipher_ctx_t(mic_cipher_ctx_t &&) noexcept = default;
method mic_cipher_ctx_t (line 418) | mic_cipher_ctx_t &operator=(mic_cipher_ctx_t &&) noexcept = default;
type session_t (line 435) | struct session_t {
function encode_control (line 535) | static inline std::string_view
function ensure_mic_sock_open (line 592) | bool
function reset_mic_encryption (line 624) | void
function remove_mic_encryption (line 636) | void
function setup_mic_for_session (line 649) | bool
function session_t (line 698) | session_t *
type fec (line 831) | namespace fec {
type fec_t (line 834) | struct fec_t {
method size (line 857) | size_t
function fec_t (line 863) | static fec_t
method size (line 857) | size_t
function concat_and_insert (line 950) | std::vector<uint8_t>
function replace (line 990) | std::vector<uint8_t>
function send_feedback_msg (line 1014) | int
function send_hdr_mode (line 1129) | int
function send_resolution_change (line 1160) | int
function controlBroadcastThread (line 1191) | void
function micRecvThread (line 1661) | void
function recvThread (line 1929) | void
function videoBroadcastThread (line 2042) | void
function audioBroadcastThread (line 2373) | void
function start_broadcast (line 2514) | int
function end_broadcast (line 2603) | void
function recv_ping (line 2651) | int
function videoThread (line 2707) | void
function audioThread (line 2732) | void
type session (line 2755) | namespace session {
function state_e (line 2759) | state_e
function stop (line 2764) | void
function join (line 2776) | void
function start (line 2871) | int
function alloc (line 2953) | std::shared_ptr<session_t>
function change_dynamic_param_for_client (line 3053) | bool
function get_all_sessions_info (line 3091) | std::vector<session_info_t>
FILE: src/stream.h
function namespace (line 16) | namespace stream {
FILE: src/system_tray.cpp
type system_tray (line 67) | namespace system_tray {
type tray_menu (line 77) | struct tray_menu
type tray (line 78) | struct tray
type tray_menu (line 108) | struct tray_menu
type tray_menu (line 109) | struct tray_menu
type tray_menu (line 110) | struct tray_menu
function update_advanced_settings_menu_text (line 113) | static void update_advanced_settings_menu_text() {
function update_vdd_submenu_text (line 123) | static void update_vdd_submenu_text() {
function clear_tray_notification (line 130) | static void clear_tray_notification() {
function tray_visit_project_submenu_text (line 138) | static void tray_visit_project_submenu_text() {
function init_localized_strings (line 144) | void
function update_menu_texts (line 171) | void
type tray_menu (line 197) | struct tray_menu
function is_vdd_active (line 203) | static bool is_vdd_active() {
function update_vdd_menu_text (line 209) | static void update_vdd_menu_text() {
function start_vdd_cooldown (line 229) | static void start_vdd_cooldown() {
type tray_menu (line 243) | struct tray_menu
type tray_menu (line 254) | struct tray_menu
type tray_menu (line 264) | struct tray_menu
type tray_menu (line 296) | struct tray_menu
type tray_menu (line 315) | struct tray_menu
type tray_menu (line 342) | struct tray_menu
type tray_menu (line 369) | struct tray_menu
type tray_menu (line 410) | struct tray_menu
type tray_menu (line 444) | struct tray_menu
type tray_menu (line 448) | struct tray_menu
type tray_menu (line 452) | struct tray_menu
type tray_menu (line 530) | struct tray_menu
type tray_menu (line 757) | struct tray_menu
type tray_menu (line 993) | struct tray_menu
type tray_menu (line 997) | struct tray_menu
type tray_menu (line 1001) | struct tray_menu
type tray_menu (line 1005) | struct tray_menu
type tray_menu (line 1057) | struct tray_menu
type tray_menu (line 1067) | struct tray_menu
type tray (line 1081) | struct tray
function init_tray (line 1089) | int
function process_tray_events (line 1213) | int
function end_tray (line 1224) | int
function update_tray_playing (line 1240) | void
function update_tray_pausing (line 1271) | void
function update_tray_stopped (line 1302) | void
function update_tray_require_pin (line 1333) | void
function update_vdd_menu (line 1367) | void
function tray_thread_worker (line 1377) | static void
function init_tray_threaded (line 1393) | int
FILE: src/system_tray.h
function namespace (line 10) | namespace system_tray {
FILE: src/system_tray_i18n.cpp
type system_tray_i18n (line 8) | namespace system_tray_i18n {
function get_current_locale (line 329) | std::string
function set_tray_locale (line 347) | void
function get_localized_string (line 354) | std::string
function utf8_to_wstring (line 382) | std::wstring
FILE: src/system_tray_i18n.h
function namespace (line 6) | namespace system_tray_i18n {
FILE: src/task_pool.h
function namespace (line 19) | namespace task_pool_util {
FILE: src/thread_pool.h
function namespace (line 10) | namespace thread_pool_util {
FILE: src/thread_safe.h
function peek (line 123) | bool
function status_t (line 153) | status_t _status { util::false_v<status_t> };
function ring (line 164) | void
function ring (line 173) | void
function reset (line 237) | void
function _rang (line 248) | bool _rang { false };
function peek (line 286) | bool
function stop (line 339) | void
function ptr_t (line 371) | struct ptr_t {
function release (line 426) | void
function has_ref (line 472) | [[nodiscard]] bool
function cleanup (line 563) | void
function cleanup (line 583) | inline void
FILE: src/upnp.cpp
type upnp (line 22) | namespace upnp {
type mapping_t (line 24) | struct mapping_t {
function status_string (line 34) | static std::string_view
function UPNP_GetValidIGDStatus (line 54) | int
class deinit_t (line 63) | class deinit_t: public platf::deinit_t {
method deinit_t (line 65) | deinit_t() {
method create_ipv6_pinholes (line 103) | bool
method map_upnp_port (line 184) | bool
method unmap_all_upnp_ports (line 289) | void
method upnp_thread_proc (line 311) | void
function start (line 379) | std::unique_ptr<platf::deinit_t>
FILE: src/upnp.h
function namespace (line 14) | namespace upnp {
FILE: src/utility.h
type U (line 30) | typedef U type;
function namespace (line 120) | namespace util {
function disable (line 180) | void
function failure (line 182) | bool failure { true };
function string (line 269) | string
function is_convertable (line 316) | auto is_convertable = [](char ch) -> bool {
function convert (line 335) | auto convert = [](char ch) -> std::uint8_t {
function is_convertable (line 367) | auto is_convertable = [](char ch) -> bool {
function convert (line 386) | auto convert = [](char ch) -> std::uint8_t {
function T (line 425) | enm(const T &val) -> const std::underlying_type_t<T> & {
function from_chars (line 435) | inline std::int64_t
function from_view (line 452) | inline std::int64_t
function has_left (line 462) | constexpr bool
function X (line 481) | const X &
function _p (line 503) | constexpr uniq_ptr(std::nullptr_t) noexcept:
function reset (line 551) | void
function pointer (line 560) | pointer
function pointer (line 567) | pointer
function const_reference (line 756) | const_reference
function reference (line 760) | reference
function const_pointer (line 764) | const_pointer
function pointer (line 768) | pointer
function explicit (line 834) | explicit buffer_t(size_t elements, const T &t):
function string_view (line 938) | string_view
FILE: src/uuid.h
function namespace (line 12) | namespace uuid_util {
function uuid_t (line 34) | static uuid_t
FILE: src/video.cpp
type AMFEncoderContext_Partial (line 37) | struct AMFEncoderContext_Partial {
type video (line 65) | namespace video {
function allow_encoder_probing (line 72) | bool
function free_ctx (line 100) | void
function free_frame (line 105) | void
function free_buffer (line 110) | void
type nv (line 115) | namespace nv {
type profile_h264_e (line 117) | enum class profile_h264_e : int {
type profile_hevc_e (line 122) | enum class profile_hevc_e : int {
type qsv (line 130) | namespace qsv {
type profile_h264_e (line 132) | enum class profile_h264_e : int {
type profile_hevc_e (line 137) | enum class profile_hevc_e : int {
type profile_av1_e (line 143) | enum class profile_av1_e : int {
class avcodec_software_encode_device_t (line 161) | class avcodec_software_encode_device_t: public platf::avcodec_encode_d...
method convert (line 163) | int
method set_frame (line 212) | int
method apply_colorspace (line 229) | void
method prefill (line 241) | void
method init (line 250) | int
type flag_e (line 335) | enum flag_e : uint32_t {
class avcodec_encode_session_t (line 350) | class avcodec_encode_session_t: public encode_session_t {
method avcodec_encode_session_t (line 352) | avcodec_encode_session_t() = default;
method avcodec_encode_session_t (line 353) | avcodec_encode_session_t(avcodec_ctx_t &&avcodec_ctx, std::unique_pt...
method avcodec_encode_session_t (line 356) | avcodec_encode_session_t(avcodec_encode_session_t &&other) noexcept ...
method avcodec_encode_session_t (line 370) | avcodec_encode_session_t &
method convert (line 383) | int
method request_idr_frame (line 389) | void
method request_normal_frame (line 398) | void
method invalidate_ref_frames (line 407) | void
method set_bitrate (line 413) | void
method set_dynamic_param (line 477) | void
class nvenc_encode_session_t (line 534) | class nvenc_encode_session_t: public encode_session_t {
method nvenc_encode_session_t (line 536) | nvenc_encode_session_t(std::unique_ptr<platf::nvenc_encode_device_t>...
method convert (line 540) | int
method request_idr_frame (line 546) | void
method request_normal_frame (line 551) | void
method invalidate_ref_frames (line 556) | void
method set_bitrate (line 565) | void
method set_dynamic_param (line 582) | void
method encode_frame (line 628) | nvenc::nvenc_encoded_frame
class amf_encode_session_t (line 647) | class amf_encode_session_t: public encode_session_t {
method amf_encode_session_t (line 649) | amf_encode_session_t(std::unique_ptr<platf::amf_encode_device_t> enc...
method convert (line 653) | int
method request_idr_frame (line 659) | void
method request_normal_frame (line 664) | void
method invalidate_ref_frames (line 669) | void
method set_bitrate (line 678) | void
method set_dynamic_param (line 693) | void
method encode_frame (line 706) | amf::amf_encoded_frame
type sync_session_ctx_t (line 720) | struct sync_session_ctx_t {
type sync_session_t (line 733) | struct sync_session_t {
type capture_ctx_t (line 741) | struct capture_ctx_t {
type capture_thread_async_ctx_t (line 746) | struct capture_thread_async_ctx_t {
type capture_thread_sync_ctx_t (line 755) | struct capture_thread_sync_ctx_t {
function encoder_t (line 809) | encoder_t nvenc {
function dxgi_init_avcodec_hardware_input_buffer (line 4060) | util::Either<avcodec_buffer_t, int>
function start_capture_async (line 4088) | int
function end_capture_async (line 4105) | void
function start_capture_sync (line 4112) | int
function end_capture_sync (line 4117) | void
function map_base_dev_type (line 4120) | platf::mem_type_e
function map_pix_fmt (line 4142) | platf::pix_fmt_e
function vaapi_init_avcodec_hardware_input_buffer (line 3986) | util::Either<avcodec_buffer_t, int>
function cuda_init_avcodec_hardware_input_buffer (line 4011) | util::Either<avcodec_buffer_t, int>
function vt_init_avcodec_hardware_input_buffer (line 4025) | util::Either<avcodec_buffer_t, int>
function vulkan_init_avcodec_hardware_input_buffer (line 4039) | util::Either<avcodec_buffer_t, int>
function do_nothing (line 4056) | void
type video (line 4059) | namespace video {
function allow_encoder_probing (line 72) | bool
function free_ctx (line 100) | void
function free_frame (line 105) | void
function free_buffer (line 110) | void
type nv (line 115) | namespace nv {
type profile_h264_e (line 117) | enum class profile_h264_e : int {
type profile_hevc_e (line 122) | enum class profile_hevc_e : int {
type qsv (line 130) | namespace qsv {
type profile_h264_e (line 132) | enum class profile_h264_e : int {
type profile_hevc_e (line 137) | enum class profile_hevc_e : int {
type profile_av1_e (line 143) | enum class profile_av1_e : int {
class avcodec_software_encode_device_t (line 161) | class avcodec_software_encode_device_t: public platf::avcodec_encode_d...
method convert (line 163) | int
method set_frame (line 212) | int
method apply_colorspace (line 229) | void
method prefill (line 241) | void
method init (line 250) | int
type flag_e (line 335) | enum flag_e : uint32_t {
class avcodec_encode_session_t (line 350) | class avcodec_encode_session_t: public encode_session_t {
method avcodec_encode_session_t (line 352) | avcodec_encode_session_t() = default;
method avcodec_encode_session_t (line 353) | avcodec_encode_session_t(avcodec_ctx_t &&avcodec_ctx, std::unique_pt...
method avcodec_encode_session_t (line 356) | avcodec_encode_session_t(avcodec_encode_session_t &&other) noexcept ...
method avcodec_encode_session_t (line 370) | avcodec_encode_session_t &
method convert (line 383) | int
method request_idr_frame (line 389) | void
method request_normal_frame (line 398) | void
method invalidate_ref_frames (line 407) | void
method set_bitrate (line 413) | void
method set_dynamic_param (line 477) | void
class nvenc_encode_session_t (line 534) | class nvenc_encode_session_t: public encode_session_t {
method nvenc_encode_session_t (line 536) | nvenc_encode_session_t(std::unique_ptr<platf::nvenc_encode_device_t>...
method convert (line 540) | int
method request_idr_frame (line 546) | void
method request_normal_frame (line 551) | void
method invalidate_ref_frames (line 556) | void
method set_bitrate (line 565) | void
method set_dynamic_param (line 582) | void
method encode_frame (line 628) | nvenc::nvenc_encoded_frame
class amf_encode_session_t (line 647) | class amf_encode_session_t: public encode_session_t {
method amf_encode_session_t (line 649) | amf_encode_session_t(std::unique_ptr<platf::amf_encode_device_t> enc...
method convert (line 653) | int
method request_idr_frame (line 659) | void
method request_normal_frame (line 664) | void
method invalidate_ref_frames (line 669) | void
method set_bitrate (line 678) | void
method set_dynamic_param (line 693) | void
method encode_frame (line 706) | amf::amf_encoded_frame
type sync_session_ctx_t (line 720) | struct sync_session_ctx_t {
type sync_session_t (line 733) | struct sync_session_t {
type capture_ctx_t (line 741) | struct capture_ctx_t {
type capture_thread_async_ctx_t (line 746) | struct capture_thread_async_ctx_t {
type capture_thread_sync_ctx_t (line 755) | struct capture_thread_sync_ctx_t {
function encoder_t (line 809) | encoder_t nvenc {
function dxgi_init_avcodec_hardware_input_buffer (line 4060) | util::Either<avcodec_buffer_t, int>
function start_capture_async (line 4088) | int
function end_capture_async (line 4105) | void
function start_capture_sync (line 4112) | int
function end_capture_sync (line 4117) | void
function map_base_dev_type (line 4120) | platf::mem_type_e
function map_pix_fmt (line 4142) | platf::pix_fmt_e
FILE: src/video.h
type AVPacket (line 17) | struct AVPacket
function namespace (line 18) | namespace video {
type encoder_platform_formats_t (line 116) | struct encoder_platform_formats_t {
function encoder_platform_formats_t (line 123) | struct encoder_platform_formats_avcodec: encoder_platform_formats_t {
function encoder_platform_formats_t (line 158) | struct encoder_platform_formats_nvenc: encoder_platform_formats_t {
function encoder_platform_formats_t (line 173) | struct encoder_platform_formats_amf: encoder_platform_formats_t {
type encoder_t (line 188) | struct encoder_t {
type option_t (line 217) | struct option_t {
function codec_t (line 252) | const codec_t &
type encode_session_t (line 270) | struct encode_session_t {
function packet_raw_avcodec (line 312) | struct packet_raw_t {
function is_idr (line 352) | bool
function frame_index (line 357) | int64_t
function data_size (line 367) | size_t
function packet_raw_t (line 375) | struct packet_raw_generic: packet_raw_t {
FILE: src/video_colorspace.cpp
type video (line 16) | namespace video {
function colorspace_is_hdr (line 18) | bool
function colorspace_is_hlg (line 24) | bool
function colorspace_is_pq (line 29) | bool
function sunshine_colorspace_t (line 34) | sunshine_colorspace_t
function avcodec_colorspace_t (line 104) | avcodec_colorspace_t
function color_t (line 158) | const color_t *
FILE: src/video_colorspace.h
function namespace (line 11) | namespace video {
FILE: src/webhook.cpp
type webhook (line 34) | namespace webhook {
function generate_signature (line 42) | std::string generate_signature(long long timestamp, const std::string&...
function generate_webhook_headers (line 51) | SimpleWeb::CaseInsensitiveMultimap generate_webhook_headers()
function get_local_ip (line 79) | std::string get_local_ip() {
function send_webhook_request (line 127) | bool send_webhook_request(const std::string& url, const std::string& j...
function send_single_webhook_request (line 158) | bool send_single_webhook_request(const std::string& url, const std::st...
function send_event_async (line 215) | void send_event_async(const event_t& event)
function is_enabled (line 286) | bool is_enabled()
function get_alert_message (line 297) | std::string get_alert_message(event_type_t type, bool is_chinese)
function sanitize_json_string (line 324) | std::string sanitize_json_string(const std::string& str)
function get_current_timestamp (line 353) | std::string get_current_timestamp()
function is_rate_limited (line 371) | bool is_rate_limited()
function record_successful_send (line 393) | void record_successful_send() {
function send_rate_limit_notification (line 401) | void send_rate_limit_notification()
function can_create_thread (line 451) | bool can_create_thread()
function register_thread (line 459) | void register_thread()
function unregister_thread (line 468) | void unregister_thread()
FILE: src/webhook.h
function namespace (line 11) | namespace webhook {
FILE: src/webhook_format.cpp
type webhook (line 13) | namespace webhook {
function format_type_t (line 30) | format_type_t WebhookFormat::get_format_type() const {
function init_webhook_format (line 431) | void init_webhook_format()
function load_format_config (line 440) | void load_format_config()
function configure_webhook_format (line 447) | void configure_webhook_format(bool use_markdown)
function validate_webhook_content_length (line 463) | bool validate_webhook_content_length(const std::string& content) {
FILE: src/webhook_format.h
type class (line 17) | enum class
function namespace (line 27) | namespace colors {
FILE: src/webhook_httpsclient.cpp
function webhook_verify_cb (line 11) | static int webhook_verify_cb(int ok, X509_STORE_CTX *ctx) {
type webhook (line 26) | namespace webhook {
FILE: src/webhook_httpsclient.h
function namespace (line 10) | namespace webhook {
FILE: src_assets/common/assets/web/composables/useAiDiagnosis.js
constant STORAGE_KEY (line 3) | const STORAGE_KEY = 'sunshine-ai-diagnosis-config'
constant PROVIDERS (line 5) | const PROVIDERS = [
constant SYSTEM_PROMPT (line 15) | const SYSTEM_PROMPT = `你是 Sunshine 串流软件的日志诊断助手。用户会提供 Sunshine 的运行日志,请分析日...
function loadConfig (line 33) | function loadConfig() {
function useAiDiagnosis (line 44) | function useAiDiagnosis() {
FILE: src_assets/common/assets/web/composables/useApps.js
constant MESSAGE_DURATION (line 8) | const MESSAGE_DURATION = 3000
function useApps (line 13) | function useApps() {
FILE: src_assets/common/assets/web/composables/useBackground.js
constant DEFAULT_BACKGROUND (line 3) | const DEFAULT_BACKGROUND = 'https://assets.alkaidlab.com/sunshine-bg0.webp'
constant STORAGE_KEY (line 4) | const STORAGE_KEY = 'customBackground'
constant COLOR_CONFIG (line 6) | const COLOR_CONFIG = {
constant DEFAULT_COLOR_INFO (line 12) | const DEFAULT_COLOR_INFO = {
function useBackground (line 187) | function useBackground(options = {}) {
FILE: src_assets/common/assets/web/composables/useConfig.js
constant PLATFORM_EXCLUSIONS (line 5) | const PLATFORM_EXCLUSIONS = {
constant EXCLUDED_DEFAULT_KEYS (line 12) | const EXCLUDED_DEFAULT_KEYS = new Set(['resolutions', 'fps', 'adapter_na...
constant DEFAULT_TABS (line 15) | const DEFAULT_TABS = [
function useConfig (line 265) | function useConfig() {
FILE: src_assets/common/assets/web/composables/useLogout.js
function useLogout (line 4) | function useLogout() {
FILE: src_assets/common/assets/web/composables/useLogs.js
constant LOG_REGEX (line 3) | const LOG_REGEX = /(\[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}]):\s/g
function useLogs (line 8) | function useLogs() {
FILE: src_assets/common/assets/web/composables/usePin.js
constant STATUS_RESET_DELAY (line 3) | const STATUS_RESET_DELAY = 5000
function usePin (line 8) | function usePin() {
FILE: src_assets/common/assets/web/composables/useQrPair.js
function useQrPair (line 4) | function useQrPair() {
FILE: src_assets/common/assets/web/composables/useSetupWizard.js
function useSetupWizard (line 6) | function useSetupWizard() {
FILE: src_assets/common/assets/web/composables/useTheme.js
function useTheme (line 4) | function useTheme() {
FILE: src_assets/common/assets/web/composables/useTroubleshooting.js
constant LOG_REFRESH_INTERVAL (line 3) | const LOG_REFRESH_INTERVAL = 5000
constant STATUS_RESET_DELAY (line 4) | const STATUS_RESET_DELAY = 5000
constant MAX_LOG_DISPLAY_SIZE (line 5) | const MAX_LOG_DISPLAY_SIZE = 4 * 1024 * 1024
function useTroubleshooting (line 37) | function useTroubleshooting() {
FILE: src_assets/common/assets/web/composables/useVersion.js
constant GITHUB_API_BASE (line 6) | const GITHUB_API_BASE = 'https://api.github.com/repos/qiin2333/Sunshine/...
function useVersion (line 44) | function useVersion() {
FILE: src_assets/common/assets/web/composables/useWelcome.js
function useWelcome (line 6) | function useWelcome() {
FILE: src_assets/common/assets/web/config/firebase.js
function initFirebase (line 17) | function initFirebase() {
function trackEvent (line 28) | function trackEvent(eventName, params = {}) {
FILE: src_assets/common/assets/web/init.js
function initApp (line 14) | function initApp(app, config) {
FILE: src_assets/common/assets/web/platform-i18n.js
class PlatformMessageI18n (line 3) | class PlatformMessageI18n {
method constructor (line 7) | constructor(platform) {
method getPlatformKey (line 16) | getPlatformKey(key, platform) {
method getMessageUsingPlatform (line 25) | getMessageUsingPlatform(key, defaultMsg) {
function usePlatformI18n (line 56) | function usePlatformI18n(platform) {
function $tp (line 77) | function $tp(key, defaultMsg) {
FILE: src_assets/common/assets/web/services/appService.js
class AppService (line 7) | class AppService {
method getApps (line 12) | static async getApps() {
method saveApps (line 32) | static async saveApps(apps, editApp = null) {
method deleteApp (line 61) | static async deleteApp(index) {
method getPlatform (line 82) | static async getPlatform() {
method searchApps (line 103) | static searchApps(apps, query) {
method validateApp (line 120) | static validateApp(app) {
method formatAppData (line 148) | static formatAppData(app) {
FILE: src_assets/common/assets/web/sunshine_version.js
class SunshineVersion (line 1) | class SunshineVersion {
method constructor (line 2) | constructor(release = null, version = null) {
method parseVersion (line 22) | parseVersion(version) {
method isGreater (line 33) | isGreater(otherVersion) {
FILE: src_assets/common/assets/web/utils/constants.js
constant APP_CONSTANTS (line 2) | const APP_CONSTANTS = {
constant ENV_VARS_CONFIG (line 67) | const ENV_VARS_CONFIG = {
constant API_ENDPOINTS (line 82) | const API_ENDPOINTS = {
FILE: src_assets/common/assets/web/utils/coverSearch.js
constant IGDB_BASE_URL (line 13) | const IGDB_BASE_URL = 'https://lizardbyte.github.io/GameDB'
constant IGDB_IMAGE_URL (line 14) | const IGDB_IMAGE_URL = 'https://images.igdb.com/igdb/image/upload/t_cove...
function isTauriEnv (line 23) | function isTauriEnv() {
function buildProxyUrl (line 35) | function buildProxyUrl(url) {
function getSearchBucket (line 45) | function getSearchBucket(name) {
function isValidForIGDB (line 59) | function isValidForIGDB(name) {
constant SEPARATOR_REGEX (line 66) | const SEPARATOR_REGEX = /[:\-_''""]/g
constant WHITESPACE_REGEX (line 67) | const WHITESPACE_REGEX = /\s+/g
function normalizeSearchString (line 74) | function normalizeSearchString(str) {
function getBigrams (line 83) | function getBigrams(str) {
function calculateSimilarity (line 98) | function calculateSimilarity(str1, str2) {
function matchesSearch (line 122) | function matchesSearch(gameName, searchTerm) {
function fetchWithCache (line 167) | async function fetchWithCache(cache, key, fetchFn) {
function buildIGDBImageUrl (line 182) | function buildIGDBImageUrl(thumbUrl, size = 't_cover_big_2x', ext = 'png...
function searchIGDBCover (line 195) | async function searchIGDBCover(searchName, bucket) {
function searchIGDBCovers (line 247) | async function searchIGDBCovers(name, signal = null, maxResults = 20) {
function searchCoverImage (line 332) | async function searchCoverImage(appName) {
function batchSearchCoverImages (line 359) | async function batchSearchCoverImages(appList) {
function searchAllCovers (line 375) | async function searchAllCovers(name, signal = null) {
function clearCache (line 402) | function clearCache() {
FILE: src_assets/common/assets/web/utils/errorHandler.js
class ErrorHandler (line 6) | class ErrorHandler {
method handleNetworkError (line 13) | static handleNetworkError(error, context = '操作') {
method handleValidationErrors (line 40) | static handleValidationErrors(errors) {
method handleAppError (line 55) | static handleAppError(error, operation, appName = '') {
method showErrorDialog (line 75) | static showErrorDialog(message, title = '错误') {
method showConfirmDialog (line 87) | static showConfirmDialog(message, title = '确认') {
method logError (line 97) | static logError(error, context = '', metadata = {}) {
method handleAsyncError (line 118) | static async handleAsyncError(promise, context = '') {
FILE: src_assets/common/assets/web/utils/fileSelection.js
constant FILE_FILTERS (line 6) | const FILE_FILTERS = [
constant PLACEHOLDERS (line 11) | const PLACEHOLDERS = {
class FileSelector (line 19) | class FileSelector {
method constructor (line 20) | constructor(options = {}) {
method select (line 32) | async select(fieldName, input, callback, isDirectory = false) {
method selectFile (line 52) | async selectFile(fieldName, fileInput, callback) {
method selectDirectory (line 59) | async selectDirectory(fieldName, dirInput, callback) {
method selectBrowser (line 66) | selectBrowser(input, callback, isDirectory) {
method selectFileBrowser (line 102) | selectFileBrowser(fileInput, callback) {
method selectDirectoryBrowser (line 106) | selectDirectoryBrowser(dirInput, callback) {
method isTauriEnvironment (line 113) | isTauriEnvironment() {
method isElectronEnvironment (line 121) | isElectronEnvironment() {
method selectTauri (line 128) | async selectTauri(fieldName, callback, isDirectory) {
method selectFileTauri (line 158) | async selectFileTauri(fieldName, callback) {
method selectDirectoryTauri (line 162) | async selectDirectoryTauri(fieldName, callback) {
method selectElectron (line 169) | async selectElectron(fieldName, callback, isDirectory) {
method selectFileElectron (line 193) | async selectFileElectron(fieldName, callback) {
method selectDirectoryElectron (line 197) | async selectDirectoryElectron(fieldName, callback) {
method processFilePath (line 204) | processFilePath(file) {
method processDirectoryPath (line 211) | processDirectoryPath(firstFile) {
method isDevelopmentEnvironment (line 220) | isDevelopmentEnvironment() {
method resetState (line 234) | resetState() {
method checkFileSelectionSupport (line 242) | checkFileSelectionSupport() {
method checkDirectorySelectionSupport (line 250) | checkDirectorySelectionSupport(dirInput) {
method getPlaceholderText (line 257) | getPlaceholderText(fieldName) {
method getButtonTitle (line 265) | getButtonTitle(type) {
method cleanupFileInputs (line 272) | cleanupFileInputs(fileInput, dirInput) {
function createFileSelector (line 281) | function createFileSelector(options = {}) {
function selectFile (line 288) | async function selectFile(options = {}) {
function selectDirectory (line 296) | async function selectDirectory(options = {}) {
function checkEnvironmentSupport (line 304) | function checkEnvironmentSupport() {
FILE: src_assets/common/assets/web/utils/helpers.js
function debounce (line 7) | function debounce(func, wait) {
function delay (line 24) | function delay(ms) {
function deepClone (line 33) | function deepClone(obj) {
function safeJsonParse (line 54) | function safeJsonParse(str, defaultValue = null) {
function formatError (line 68) | function formatError(error) {
function isValidUrl (line 79) | function isValidUrl(url) {
function getFileExtension (line 93) | function getFileExtension(filename) {
function formatFileSize (line 103) | function formatFileSize(bytes, decimals = 2) {
function generateRandomId (line 117) | function generateRandomId(length = 8) {
function validateRequiredFields (line 132) | function validateRequiredFields(obj, requiredFields) {
function isTauriEnv (line 147) | function isTauriEnv() {
function openExternalUrl (line 156) | async function openExternalUrl(url) {
FILE: src_assets/common/assets/web/utils/imageUtils.js
function getImagePreviewUrl (line 10) | function getImagePreviewUrl(imagePath = 'box.png') {
function isLocalImagePath (line 27) | function isLocalImagePath(imagePath) {
FILE: src_assets/common/assets/web/utils/steamApi.js
constant STEAM_CDN_BASE (line 8) | const STEAM_CDN_BASE = 'https://cdn.cloudflare.steamstatic.com/steam/apps'
constant STEAMGRIDDB_API_BASE (line 11) | const STEAMGRIDDB_API_BASE = '/steamgriddb'
function buildQueryString (line 27) | function buildQueryString(options) {
function fetchJson (line 44) | async function fetchJson(url, options = {}) {
function searchSteamApps (line 62) | async function searchSteamApps(searchName, maxResults = 20) {
function loadSteamApps (line 91) | async function loadSteamApps() {
function getSteamAppDetails (line 101) | async function getSteamAppDetails(appId) {
function searchSteamCovers (line 113) | async function searchSteamCovers(name, maxResults = 20) {
function searchSteamCoversWithDetails (line 142) | async function searchSteamCoversWithDetails(name, maxResults = 20) {
constant COVER_TYPE_MAP (line 183) | const COVER_TYPE_MAP = {
function getSteamCoverUrl (line 205) | function getSteamCoverUrl(appId, type = 'header') {
function checkImageExists (line 215) | async function checkImageExists(url) {
function getCachedBestCoverUrl (line 236) | async function getCachedBestCoverUrl(appId) {
function getBestCoverUrl (line 255) | async function getBestCoverUrl(appId, headerImage) {
function batchGetCoverUrls (line 266) | async function batchGetCoverUrls(appIds) {
function clearCoverCache (line 294) | function clearCoverCache() {
function isValidSteamAppId (line 305) | function isValidSteamAppId(appId) {
function formatSteamAppInfo (line 315) | function formatSteamAppInfo(appData) {
function mapSteamGridDBItem (line 343) | function mapSteamGridDBItem(item) {
function fetchSteamGridDBResource (line 368) | async function fetchSteamGridDBResource(resourceType, gameId, options = ...
function searchSteamGridDB (line 389) | async function searchSteamGridDB(searchTerm) {
function getSteamGridDBGameId (line 414) | async function getSteamGridDBGameId(steamAppId) {
function getSteamGridDBGrids (line 437) | function getSteamGridDBGrids(gameId, options = {}) {
function getSteamGridDBHeroes (line 447) | function getSteamGridDBHeroes(gameId, options = {}) {
function getSteamGridDBLogos (line 457) | function getSteamGridDBLogos(gameId, options = {}) {
function getSteamGridDBIcons (line 467) | function getSteamGridDBIcons(gameId, options = {}) {
constant DEFAULT_GRID_OPTIONS (line 472) | const DEFAULT_GRID_OPTIONS = {
function searchSteamGridDBCovers (line 486) | async function searchSteamGridDBCovers(name, maxResults = 20, gridOption...
function getSteamGridDBCoversBySteamId (line 527) | async function getSteamGridDBCoversBySteamId(steamAppId, gridOptions = {...
FILE: src_assets/common/assets/web/utils/theme.js
function loadAutoTheme (line 63) | function loadAutoTheme() {
FILE: src_assets/common/assets/web/utils/validation.js
function validateField (line 55) | function validateField(fieldName, value, customRules = {}) {
constant FIELD_MAPPINGS (line 124) | const FIELD_MAPPINGS = [
function validateAppForm (line 138) | function validateAppForm(formData) {
function validateFile (line 188) | function validateFile(file, options = {}) {
function createFormValidator (line 229) | function createFormValidator(formData, watchFields = []) {
function createDebouncedValidator (line 265) | function createDebouncedValidator(validationFn, delay = 300) {
FILE: tests/tests_common.h
function Test (line 12) | struct PlatformTestSuite: testing::Test {
FILE: tests/tests_environment.h
function Environment (line 8) | struct SunshineEnvironment: testing::Environment {
FILE: tests/tests_events.h
function EmptyTestEventListener (line 8) | struct SunshineEventListener: testing::EmptyTestEventListener {
FILE: tests/tests_log_checker.h
function namespace (line 14) | namespace log_checker {
FILE: tests/tests_main.cpp
function main (line 9) | int
FILE: tests/tools/vmouse_probe.cpp
type options_t (line 22) | struct options_t {
type raw_device_t (line 32) | struct raw_device_t {
type probe_result_t (line 37) | struct probe_result_t {
function to_lower (line 45) | std::string
function wide_to_utf8 (line 53) | std::string
function enumerate_raw_mouse_devices (line 69) | std::vector<raw_device_t>
function contains_case_insensitive (line 110) | bool
function sleep_ms (line 115) | void
class raw_input_probe_t (line 120) | class raw_input_probe_t {
method raw_input_probe_t (line 122) | raw_input_probe_t(std::string match_substring, bool quiet):
method initialize (line 126) | bool
method probe_result_t (line 177) | probe_result_t
method LRESULT (line 200) | static LRESULT CALLBACK
method LRESULT (line 217) | LRESULT
function print_usage (line 268) | void
function parse_args (line 275) | std::optional<options_t>
function send_test_sequence (line 316) | bool
function print_enumeration (line 334) | void
function main (line 352) | int
FILE: tests/tools/vmouse_send_diag.cpp
function wide_to_utf8 (line 19) | std::string
function build_report (line 35) | std::array<uint8_t, 8>
function main (line 50) | int
FILE: tests/unit/platform/test_common.cpp
type SetEnvTest (line 11) | struct SetEnvTest: ::testing::TestWithParam<std::tuple<std::string, std:...
method TearDown (line 13) | void
function TEST_P (line 21) | TEST_P(SetEnvTest, SetEnvironmentVariableTests) {
function TEST_P (line 35) | TEST_P(SetEnvTest, UnsetEnvironmentVariableTests) {
function TEST (line 53) | TEST(HostnameTests, TestAsioEquality) {
FILE: tests/unit/platform/windows/test_virtual_mouse.cpp
function TEST (line 15) | TEST(VMouseReportTests, BuildOutputReportSerializesLittleEndianSignedDel...
function TEST (line 37) | TEST(VMouseReportTests, ApplyButtonTransitionMaintainsAggregateState) {
function TEST (line 50) | TEST(VMouseReportTests, BuildOutputReportKeepsScrollBytesIndependent) {
function TEST (line 62) | TEST(VMouseReportTests, DisconnectErrorsTriggerHandleClose) {
FILE: tests/unit/test_audio.cpp
type AudioTest (line 11) | struct AudioTest: PlatformTestSuite, testing::WithParamInterface<std::tu...
method SetUp (line 12) | void
function config_flags (line 22) | constexpr std::bitset<config_t::MAX_FLAGS> config_flags(const int flag =...
function TEST_P (line 40) | TEST_P(AudioTest, TestEncode) {
FILE: tests/unit/test_entry_handler.cpp
function TEST (line 10) | TEST(EntryHandlerTests, LogPublisherDataTest) {
FILE: tests/unit/test_file_handler.cpp
type FileHandlerParentDirectoryTest (line 9) | struct FileHandlerParentDirectoryTest: testing::TestWithParam<std::tuple...
function TEST_P (line 11) | TEST_P(FileHandlerParentDirectoryTest, Run) {
type FileHandlerMakeDirectoryTest (line 24) | struct FileHandlerMakeDirectoryTest: testing::TestWithParam<std::tuple<s...
function TEST_P (line 26) | TEST_P(FileHandlerMakeDirectoryTest, Run) {
type FileHandlerTests (line 50) | struct FileHandlerTests: testing::TestWithParam<std::tuple<int, std::str...
function TEST_P (line 75) | TEST_P(FileHandlerTests, WriteFileTest) {
function TEST_P (line 81) | TEST_P(FileHandlerTests, ReadFileTest) {
function TEST (line 87) | TEST(FileHandlerTests, ReadMissingFileTest) {
FILE: tests/unit/test_httpcommon.cpp
type UrlEscapeTest (line 16) | struct UrlEscapeTest: testing::TestWithParam<std::tuple<std::string, std...
function TEST_P (line 18) | TEST_P(UrlEscapeTest, Run) {
type UrlGetHostTest (line 31) | struct UrlGetHostTest: testing::TestWithParam<std::tuple<std::string, st...
function TEST_P (line 33) | TEST_P(UrlGetHostTest, Run) {
type DownloadFileTest (line 46) | struct DownloadFileTest: testing::TestWithParam<std::tuple<std::string, ...
function TEST_P (line 48) | TEST_P(DownloadFileTest, Run) {
FILE: tests/unit/test_logging.cpp
type LogLevelsTest (line 25) | struct LogLevelsTest: testing::TestWithParam<decltype(log_levels)::value...
function TEST_P (line 33) | TEST_P(LogLevelsTest, PutMessage) {
FILE: tests/unit/test_mouse.cpp
type MouseHIDTest (line 9) | struct MouseHIDTest: PlatformTestSuite, testing::WithParamInterface<util...
method SetUp (line 10) | void
method TearDown (line 23) | void
function TEST_P (line 37) | TEST_P(MouseHIDTest, MoveInputTest) {
function TEST_P (line 73) | TEST_P(MouseHIDTest, AbsMoveInputTest) {
FILE: tests/unit/test_network.cpp
type MdnsInstanceNameTest (line 9) | struct MdnsInstanceNameTest: testing::TestWithParam<std::tuple<std::stri...
function TEST_P (line 11) | TEST_P(MdnsInstanceNameTest, Run) {
class BindAddressTest (line 33) | class BindAddressTest: public ::testing::Test {
method SetUp (line 37) | void SetUp() override {
method TearDown (line 42) | void TearDown() override {
function TEST_F (line 51) | TEST_F(BindAddressTest, DefaultBehaviorIPv4) {
function TEST_F (line 62) | TEST_F(BindAddressTest, DefaultBehaviorIPv6) {
function TEST_F (line 73) | TEST_F(BindAddressTest, ConfiguredIPv4Address) {
function TEST_F (line 84) | TEST_F(BindAddressTest, ConfiguredIPv6Address) {
function TEST_F (line 95) | TEST_F(BindAddressTest, ConfiguredAddressOverridesFamily) {
function TEST_F (line 107) | TEST_F(BindAddressTest, LoopbackAddresses) {
function TEST_F (line 122) | TEST_F(BindAddressTest, LinkLocalAddresses) {
function TEST_F (line 137) | TEST_F(BindAddressTest, WildcardAddressFunction) {
FILE: tests/unit/test_rswrapper.cpp
function TEST (line 11) | TEST(ReedSolomonWrapperTests, InitTest) {
function TEST (line 21) | TEST(ReedSolomonWrapperTests, EncodeTest) {
FILE: tests/unit/test_stream.cpp
type stream (line 11) | namespace stream {
function TEST (line 18) | TEST(ConcatAndInsertTests, ConcatNoInsertionTest) {
function TEST (line 26) | TEST(ConcatAndInsertTests, ConcatLargeStrideTest) {
function TEST (line 34) | TEST(ConcatAndInsertTests, ConcatSmallStrideTest) {
FILE: tests/unit/test_video.cpp
type EncoderTest (line 9) | struct EncoderTest: PlatformTestSuite, testing::WithParamInterface<video...
method SetUp (line 10) | void
function TEST_P (line 46) | TEST_P(EncoderTest, ValidateEncoder) {
FILE: tests/unit/test_webhook.cpp
type WebhookTest (line 15) | struct WebhookTest : testing::Test {
method SetUp (line 16) | void SetUp() override {
function TEST_F (line 25) | TEST_F(WebhookTest, IsEnabledCheck) {
function TEST_F (line 38) | TEST_F(WebhookTest, AlertMessageLocalization) {
function TEST_F (line 55) | TEST_F(WebhookTest, JsonStringSanitization) {
function TEST_F (line 73) | TEST_F(WebhookTest, TimestampFormat) {
function TEST_F (line 86) | TEST_F(WebhookTest, EventStructure) {
function TEST_F (line 107) | TEST_F(WebhookTest, GenerateWebhookJson) {
function TEST_F (line 150) | TEST_F(WebhookTest, GenerateWebhookJsonPairing) {
function TEST_F (line 168) | TEST_F(WebhookTest, RateLimiting) {
function TEST_F (line 185) | TEST_F(WebhookTest, ThreadManagement) {
function TEST_F (line 210) | TEST_F(WebhookTest, ThreadLimitEnforcement) {
function TEST_F (line 237) | TEST_F(WebhookTest, ThreadRegistrationOrder) {
function TEST_F (line 265) | TEST_F(WebhookTest, RateLimitNotificationBypass) {
FILE: tests/unit/test_webhook_config.cpp
type WebhookConfigTest (line 14) | struct WebhookConfigTest : testing::Test {
method SetUp (line 15) | void SetUp() override {
function TEST_F (line 24) | TEST_F(WebhookConfigTest, DefaultValues) {
function TEST_F (line 31) | TEST_F(WebhookConfigTest, ParseWebhookEnabled) {
function TEST_F (line 40) | TEST_F(WebhookConfigTest, ParseWebhookUrl) {
function TEST_F (line 49) | TEST_F(WebhookConfigTest, ParseWebhookSkipSslVerify) {
function TEST_F (line 58) | TEST_F(WebhookConfigTest, ParseWebhookTimeout) {
function TEST_F (line 67) | TEST_F(WebhookConfigTest, ParseWebhookTimeoutOutOfRange) {
function TEST_F (line 77) | TEST_F(WebhookConfigTest, ParseWebhookTimeoutTooLow) {
function TEST_F (line 87) | TEST_F(WebhookConfigTest, ParseAllWebhookSettings) {
function TEST_F (line 102) | TEST_F(WebhookConfigTest, ParseWebhookTimeoutBoundaryValues) {
function TEST_F (line 124) | TEST_F(WebhookConfigTest, ParseWebhookBooleanVariations) {
FILE: third-party/glad/include/EGL/eglplatform.h
type HDC (line 63) | typedef HDC EGLNativeDisplayType;
type HBITMAP (line 64) | typedef HBITMAP EGLNativePixmapType;
type HWND (line 65) | typedef HWND EGLNativeWindowType;
type EGLNativeDisplayType (line 69) | typedef int EGLNativeDisplayType;
type EGLNativePixmapType (line 70) | typedef int EGLNativePixmapType;
type EGLNativeWindowType (line 71) | typedef int EGLNativeWindowType;
type EGLNativeDisplayType (line 75) | typedef int EGLNativeDisplayType;
type wl_display (line 81) | struct wl_display
type wl_egl_pixmap (line 82) | struct wl_egl_pixmap
type wl_egl_window (line 83) | struct wl_egl_window
type gbm_device (line 87) | struct gbm_device
type gbm_bo (line 88) | struct gbm_bo
type ANativeWindow (line 93) | struct ANativeWindow
type egl_native_pixmap_t (line 94) | struct egl_native_pixmap_t
type egl_native_pixmap_t (line 97) | struct egl_native_pixmap_t
type ANativeWindow (line 98) | struct ANativeWindow
type EGLNativeDisplayType (line 102) | typedef intptr_t EGLNativeDisplayType;
type EGLNativePixmapType (line 103) | typedef intptr_t EGLNativePixmapType;
type EGLNativeWindowType (line 104) | typedef intptr_t EGLNativeWindowType;
type khronos_uintptr_t (line 109) | typedef khronos_uintptr_t EGLNativePixmapType;
type khronos_uintptr_t (line 110) | typedef khronos_uintptr_t EGLNativeWindowType;
type Display (line 118) | typedef Display *EGLNativeDisplayType;
type Pixmap (line 119) | typedef Pixmap EGLNativePixmapType;
type Window (line 120) | typedef Window EGLNativeWindowType;
type EGLNativeDisplayType (line 124) | typedef int EGLNativeDisplayType;
type khronos_uintptr_t (line 133) | typedef khronos_uintptr_t EGLNativePixmapType;
type khronos_uintptr_t (line 134) | typedef khronos_uintptr_t EGLNativeWindowType;
type khronos_uintptr_t (line 139) | typedef khronos_uintptr_t EGLNativePixmapType;
type khronos_uintptr_t (line 140) | typedef khronos_uintptr_t EGLNativeWindowType;
type EGLNativeDisplayType (line 147) | typedef EGLNativeDisplayType NativeDisplayType;
type EGLNativePixmapType (line 148) | typedef EGLNativePixmapType NativePixmapType;
type EGLNativeWindowType (line 149) | typedef EGLNativeWindowType NativeWindowType;
type khronos_int32_t (line 158) | typedef khronos_int32_t EGLint;
FILE: third-party/glad/include/KHR/khrplatform.h
type khronos_int32_t (line 149) | typedef int32_t khronos_int32_t;
type khronos_uint32_t (line 150) | typedef uint32_t khronos_uint32_t;
type khronos_int64_t (line 151) | typedef int64_t khronos_int64_t;
type khronos_uint64_t (line 152) | typedef uint64_t khronos_uint64_t;
type khronos_int32_t (line 162) | typedef int32_t khronos_int32_t;
type khronos_uint32_t (line 163) | typedef uint32_t khronos_uint32_t;
type khronos_int64_t (line 164) | typedef int64_t khronos_int64_t;
type khronos_uint64_t (line 165) | typedef uint64_t khronos_uint64_t;
type __int32 (line 174) | typedef __int32 khronos_int32_t;
type khronos_uint32_t (line 175) | typedef unsigned __int32 khronos_uint32_t;
type __int64 (line 176) | typedef __int64 khronos_int64_t;
type khronos_uint64_t (line 177) | typedef unsigned __int64 khronos_uint64_t;
type khronos_int32_t (line 186) | typedef int khronos_int32_t;
type khronos_uint32_t (line 187) | typedef unsigned int khronos_uint32_t;
type khronos_int64_t (line 189) | typedef long int khronos_int64_t;
type khronos_uint64_t (line 190) | typedef unsigned long int khronos_uint64_t;
type khronos_int64_t (line 192) | typedef long long int khronos_int64_t;
type khronos_uint64_t (line 193) | typedef unsigned long long int khronos_uint64_t;
type khronos_int32_t (line 203) | typedef int khronos_int32_t;
type khronos_uint32_t (line 204) | typedef unsigned int khronos_uint32_t;
type khronos_int32_t (line 214) | typedef int32_t khronos_int32_t;
type khronos_uint32_t (line 215) | typedef uint32_t khronos_uint32_t;
type khronos_int64_t (line 216) | typedef int64_t khronos_int64_t;
type khronos_uint64_t (line 217) | typedef uint64_t khronos_uint64_t;
type khronos_int8_t (line 226) | typedef signed char khronos_int8_t;
type khronos_uint8_t (line 227) | typedef unsigned char khronos_uint8_t;
type khronos_int16_t (line 228) | typedef signed short int khronos_int16_t;
type khronos_uint16_t (line 229) | typedef unsigned short int khronos_uint16_t;
type khronos_intptr_t (line 237) | typedef signed long long int khronos_intptr_t;
type khronos_uintptr_t (line 238) | typedef unsigned long long int khronos_uintptr_t;
type khronos_ssize_t (line 239) | typedef signed long long int khronos_ssize_t;
type khronos_usize_t (line 240) | typedef unsigned long long int khronos_usize_t;
type khronos_intptr_t (line 242) | typedef signed long int khronos_intptr_t;
type khronos_uintptr_t (line 243) | typedef unsigned long int khronos_uintptr_t;
type khronos_ssize_t (line 244) | typedef signed long int khronos_ssize_t;
type khronos_usize_t (line 245) | typedef unsigned long int khronos_usize_t;
type khronos_float_t (line 252) | typedef float khronos_float_t;
type khronos_uint64_t (line 265) | typedef khronos_uint64_t khronos_utime_nanoseconds_t;
type khronos_int64_t (line 266) | typedef khronos_int64_t khronos_stime_nanoseconds_t;
type khronos_boolean_enum_t (line 282) | typedef enum {
FILE: third-party/glad/include/glad/egl.h
type GLADapiproc (line 144) | typedef GLADapiproc (*GLADloadfunc)(const char *name);
type GLADapiproc (line 145) | typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *na...
type AHardwareBuffer (line 322) | struct AHardwareBuffer
type wl_buffer (line 324) | struct wl_buffer
type wl_display (line 326) | struct wl_display
type wl_resource (line 328) | struct wl_resource
type EGLBoolean (line 330) | typedef unsigned int EGLBoolean;
type EGLenum (line 332) | typedef unsigned int EGLenum;
type EGLAttribKHR (line 334) | typedef intptr_t EGLAttribKHR;
type EGLAttrib (line 336) | typedef intptr_t EGLAttrib;
type khronos_utime_nanoseconds_t (line 372) | typedef khronos_utime_nanoseconds_t EGLTimeKHR;
type khronos_utime_nanoseconds_t (line 374) | typedef khronos_utime_nanoseconds_t EGLTime;
type khronos_utime_nanoseconds_t (line 376) | typedef khronos_utime_nanoseconds_t EGLTimeNV;
type khronos_utime_nanoseconds_t (line 378) | typedef khronos_utime_nanoseconds_t EGLuint64NV;
type khronos_uint64_t (line 380) | typedef khronos_uint64_t EGLuint64KHR;
type khronos_stime_nanoseconds_t (line 382) | typedef khronos_stime_nanoseconds_t EGLnsecsANDROID;
type EGLNativeFileDescriptorKHR (line 384) | typedef int EGLNativeFileDescriptorKHR;
type khronos_ssize_t (line 386) | typedef khronos_ssize_t EGLsizeiANDROID;
type EGLsizeiANDROID (line 390) | typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID)(const void *key, EGLsiz...
type EGLClientPixmapHI (line 392) | struct EGLClientPixmapHI {
type EGLint (line 424) | typedef EGLBoolean(GLAD_API_PTR *PFNEGLCHOOSECONFIGPROC)(EGLDisplay dpy,...
type const (line 427) | typedef EGLContext(GLAD_API_PTR *PFNEGLCREATECONTEXTPROC)(EGLDisplay dpy...
type const (line 432) | typedef EGLSurface(GLAD_API_PTR *PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC)(...
type const (line 433) | typedef EGLSurface(GLAD_API_PTR *PFNEGLCREATEPLATFORMWINDOWSURFACEPROC)(...
type const (line 447) | typedef EGLDisplay(GLAD_API_PTR *PFNEGLGETPLATFORMDISPLAYPROC)(EGLenum p...
FILE: third-party/glad/include/glad/gl.h
type GLADapiproc (line 169) | typedef GLADapiproc (*GLADloadfunc)(const char *name);
type GLADapiproc (line 170) | typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *na...
type GLenum (line 1988) | typedef unsigned int GLenum;
type GLboolean (line 1990) | typedef unsigned char GLboolean;
type GLbitfield (line 1992) | typedef unsigned int GLbitfield;
type GLvoid (line 1994) | typedef void GLvoid;
type khronos_int8_t (line 1996) | typedef khronos_int8_t GLbyte;
type khronos_uint8_t (line 1998) | typedef khronos_uint8_t GLubyte;
type khronos_int16_t (line 2000) | typedef khronos_int16_t GLshort;
type khronos_uint16_t (line 2002) | typedef khronos_uint16_t GLushort;
type GLint (line 2004) | typedef int GLint;
type GLuint (line 2006) | typedef unsigned int GLuint;
type khronos_int32_t (line 2008) | typedef khronos_int32_t GLclampx;
type GLsizei (line 2010) | typedef int GLsizei;
type khronos_float_t (line 2012) | typedef khronos_float_t GLfloat;
type khronos_float_t (line 2014) | typedef khronos_float_t GLclampf;
type GLdouble (line 2016) | typedef double GLdouble;
type GLclampd (line 2018) | typedef double GLclampd;
type GLchar (line 2024) | typedef char GLchar;
type GLcharARB (line 2026) | typedef char GLcharARB;
type GLhandleARB (line 2031) | typedef unsigned int GLhandleARB;
type khronos_uint16_t (line 2034) | typedef khronos_uint16_t GLhalf;
type khronos_uint16_t (line 2036) | typedef khronos_uint16_t GLhalfARB;
type khronos_int32_t (line 2038) | typedef khronos_int32_t GLfixed;
type khronos_intptr_t (line 2041) | typedef khronos_intptr_t GLintptr;
type khronos_intptr_t (line 2043) | typedef khronos_intptr_t GLintptr;
type khronos_intptr_t (line 2047) | typedef khronos_intptr_t GLintptrARB;
type khronos_intptr_t (line 2049) | typedef khronos_intptr_t GLintptrARB;
type khronos_ssize_t (line 2053) | typedef khronos_ssize_t GLsizeiptr;
type khronos_ssize_t (line 2055) | typedef khronos_ssize_t GLsizeiptr;
type khronos_ssize_t (line 2059) | typedef khronos_ssize_t GLsizeiptrARB;
type khronos_ssize_t (line 2061) | typedef khronos_ssize_t GLsizeiptrARB;
type khronos_int64_t (line 2064) | typedef khronos_int64_t GLint64;
type khronos_int64_t (line 2066) | typedef khronos_int64_t GLint64EXT;
type khronos_uint64_t (line 2068) | typedef khronos_uint64_t GLuint64;
type khronos_uint64_t (line 2070) | typedef khronos_uint64_t GLuint64EXT;
type __GLsync (line 2072) | struct __GLsync
type _cl_context (line 2074) | struct _cl_context
type _cl_event (line 2076) | struct _cl_event
type GLhalfNV (line 2086) | typedef unsigned short GLhalfNV;
type GLintptr (line 2088) | typedef GLintptr GLvdpauSurfaceNV;
type GLuint (line 2117) | typedef GLboolean(GLAD_API_PTR *PFNGLARETEXTURESRESIDENTPROC)(GLsizei n,...
type const (line 2445) | typedef GLuint(GLAD_API_PTR *PFNGLGETPROGRAMRESOURCEINDEXPROC)(GLuint pr...
type const (line 2446) | typedef GLint(GLAD_API_PTR *PFNGLGETPROGRAMRESOURCELOCATIONPROC)(GLuint ...
type const (line 2447) | typedef GLint(GLAD_API_PTR *PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)(GL...
type GLubyte (line 2471) | typedef const GLubyte *(GLAD_API_PTR *PFNGLGETSTRINGPROC)(GLenum name);
type GLubyte (line 2472) | typedef const GLubyte *(GLAD_API_PTR *PFNGLGETSTRINGIPROC)(GLenum name, ...
type const (line 2473) | typedef GLuint(GLAD_API_PTR *PFNGLGETSUBROUTINEINDEXPROC)(GLuint program...
type const (line 2474) | typedef GLint(GLAD_API_PTR *PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)(GLuin...
type GladGLContext (line 3162) | typedef struct GladGLContext {
FILE: third-party/glad/src/egl.c
function glad_egl_load_EGL_VERSION_1_0 (line 80) | static void glad_egl_load_EGL_VERSION_1_0( GLADuserptrloadfunc load, voi...
function glad_egl_load_EGL_VERSION_1_1 (line 107) | static void glad_egl_load_EGL_VERSION_1_1( GLADuserptrloadfunc load, voi...
function glad_egl_load_EGL_VERSION_1_2 (line 114) | static void glad_egl_load_EGL_VERSION_1_2( GLADuserptrloadfunc load, voi...
function glad_egl_load_EGL_VERSION_1_4 (line 124) | static void glad_egl_load_EGL_VERSION_1_4( GLADuserptrloadfunc load, voi...
function glad_egl_load_EGL_VERSION_1_5 (line 128) | static void glad_egl_load_EGL_VERSION_1_5( GLADuserptrloadfunc load, voi...
function glad_egl_get_extensions (line 144) | static int glad_egl_get_extensions(EGLDisplay display, const char **exte...
function glad_egl_has_extension (line 150) | static int glad_egl_has_extension(const char *extensions, const char *ex...
function GLADapiproc (line 170) | static GLADapiproc glad_egl_get_proc_from_userptr(void *userptr, const c...
function glad_egl_find_extensions_egl (line 174) | static int glad_egl_find_extensions_egl(EGLDisplay display) {
function glad_egl_find_core_egl (line 183) | static int glad_egl_find_core_egl(EGLDisplay display) {
function gladLoadEGLUserPtr (line 224) | int gladLoadEGLUserPtr(EGLDisplay display, GLADuserptrloadfunc load, voi...
function gladLoadEGL (line 245) | int gladLoadEGL(EGLDisplay display, GLADloadfunc load) {
function glad_close_dlopen_handle (line 296) | static void glad_close_dlopen_handle(void* handle) {
function GLADapiproc (line 306) | static GLADapiproc glad_dlsym_handle(void* handle, const char *name) {
type _glad_egl_userptr (line 320) | struct _glad_egl_userptr {
function GLADapiproc (line 325) | static GLADapiproc glad_egl_get_proc(void *vuserptr, const char* name) {
function glad_egl_build_userptr (line 355) | static struct _glad_egl_userptr glad_egl_build_userptr(void *handle) {
function gladLoaderLoadEGL (line 362) | int gladLoaderLoadEGL(EGLDisplay display) {
function gladLoaderUnloadEGL (line 386) | void gladLoaderUnloadEGL() {
FILE: third-party/glad/src/gl.c
function glad_gl_load_GL_VERSION_1_0 (line 28) | static void glad_gl_load_GL_VERSION_1_0(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_1_1 (line 337) | static void glad_gl_load_GL_VERSION_1_1(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_1_2 (line 370) | static void glad_gl_load_GL_VERSION_1_2(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_1_3 (line 377) | static void glad_gl_load_GL_VERSION_1_3(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_1_4 (line 426) | static void glad_gl_load_GL_VERSION_1_4(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_1_5 (line 476) | static void glad_gl_load_GL_VERSION_1_5(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_2_0 (line 498) | static void glad_gl_load_GL_VERSION_2_0(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_2_1 (line 595) | static void glad_gl_load_GL_VERSION_2_1(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_3_0 (line 604) | static void glad_gl_load_GL_VERSION_3_0(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_3_1 (line 691) | static void glad_gl_load_GL_VERSION_3_1(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_3_2 (line 709) | static void glad_gl_load_GL_VERSION_3_2(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_3_3 (line 731) | static void glad_gl_load_GL_VERSION_3_3(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_4_0 (line 792) | static void glad_gl_load_GL_VERSION_4_0(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_4_1 (line 841) | static void glad_gl_load_GL_VERSION_4_1(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_4_2 (line 932) | static void glad_gl_load_GL_VERSION_4_2(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_4_3 (line 947) | static void glad_gl_load_GL_VERSION_4_3(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_4_4 (line 994) | static void glad_gl_load_GL_VERSION_4_4(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_4_5 (line 1006) | static void glad_gl_load_GL_VERSION_4_5(GladGLContext *context, GLADuser...
function glad_gl_load_GL_VERSION_4_6 (line 1131) | static void glad_gl_load_GL_VERSION_4_6(GladGLContext *context, GLADuser...
function glad_gl_get_extensions (line 1147) | static int glad_gl_get_extensions(GladGLContext *context, int version, c...
function glad_gl_free_extensions (line 1192) | static void glad_gl_free_extensions(char **exts_i, unsigned int num_exts...
function glad_gl_has_extension (line 1202) | static int glad_gl_has_extension(int version, const char *exts, unsigned...
function GLADapiproc (line 1235) | static GLADapiproc glad_gl_get_proc_from_userptr(void *userptr, const ch...
function glad_gl_find_extensions_gl (line 1239) | static int glad_gl_find_extensions_gl(GladGLContext *context, int versio...
function glad_gl_find_core_gl (line 1252) | static int glad_gl_find_core_gl(GladGLContext *context) {
function gladLoadGLContextUserPtr (line 1301) | int gladLoadGLContextUserPtr(GladGLContext *context, GLADuserptrloadfunc...
function gladLoadGLContext (line 1337) | int gladLoadGLContext(GladGLContext *context, GLADloadfunc load) {
function glad_close_dlopen_handle (line 1390) | static void glad_close_dlopen_handle(void* handle) {
function GLADapiproc (line 1400) | static GLADapiproc glad_dlsym_handle(void* handle, const char *name) {
type _glad_gl_userptr (line 1415) | struct _glad_gl_userptr {
function GLADapiproc (line 1420) | static GLADapiproc glad_gl_get_proc(void *vuserptr, const char *name) {
function glad_gl_build_userptr (line 1463) | static struct _glad_gl_userptr glad_gl_build_userptr(void *handle) {
function gladLoaderLoadGLContext (line 1480) | int gladLoaderLoadGLContext(GladGLContext *context) {
function gladLoaderUnloadGL (line 1503) | void gladLoaderUnloadGL(void) {
FILE: third-party/nvfbc/NvFBC.h
type NVFBCSTATUS (line 281) | typedef enum _NVFBCSTATUS {
type NVFBC_BOOL (line 386) | typedef enum _NVFBC_BOOL {
type NVFBC_CAPTURE_TYPE (line 405) | typedef enum _NVFBC_CAPTURE_TYPE {
type NVFBC_TRACKING_TYPE (line 439) | typedef enum {
type NVFBC_BUFFER_FORMAT (line 470) | typedef enum _NVFBC_BUFFER_FORMAT {
type NVFBC_SESSION_HANDLE (line 505) | typedef uint64_t NVFBC_SESSION_HANDLE;
type NVFBC_BOX (line 517) | typedef struct _NVFBC_BOX {
type NVFBC_SIZE (line 539) | typedef struct _NVFBC_SIZE {
type NVFBC_FRAME_GRAB_INFO (line 553) | typedef struct _NVFBC_FRAME_GRAB_INFO {
type NVFBC_CREATE_HANDLE_PARAMS (line 639) | typedef struct _NVFBC_CREATE_HANDLE_PARAMS {
type NVFBC_DESTROY_HANDLE_PARAMS (line 699) | typedef struct _NVFBC_DESTROY_HANDLE_PARAMS {
type NVFBC_RANDR_OUTPUT_INFO (line 729) | typedef struct _NVFBC_OUTPUT {
type NVFBC_GET_STATUS_PARAMS (line 750) | typedef struct _NVFBC_GET_STATUS_PARAMS {
type NVFBC_CREATE_CAPTURE_SESSION_PARAMS (line 821) | typedef struct _NVFBC_CREATE_CAPTURE_SESSION_PARAMS {
type NVFBC_DESTROY_CAPTURE_SESSION_PARAMS (line 988) | typedef struct _NVFBC_DESTROY_CAPTURE_SESSION_PARAMS {
type NVFBC_BIND_CONTEXT_PARAMS (line 1003) | typedef struct _NVFBC_BIND_CONTEXT_PARAMS {
type NVFBC_RELEASE_CONTEXT_PARAMS (line 1018) | typedef struct _NVFBC_RELEASE_CONTEXT_PARAMS {
type NVFBC_TOSYS_GRAB_FLAGS (line 1033) | typedef enum {
type NVFBC_TOSYS_SETUP_PARAMS (line 1073) | typedef struct _NVFBC_TOSYS_SETUP_PARAMS {
type NVFBC_TOSYS_GRAB_FRAME_PARAMS (line 1151) | typedef struct _NVFBC_TOSYS_GRAB_FRAME_PARAMS {
type NVFBC_TOCUDA_FLAGS (line 1202) | typedef enum {
type NVFBC_TOCUDA_SETUP_PARAMS (line 1242) | typedef struct _NVFBC_TOCUDA_SETUP_PARAMS {
type NVFBC_TOCUDA_GRAB_FRAME_PARAMS (line 1261) | typedef struct _NVFBC_TOCUDA_GRAB_FRAME_PARAMS {
type NVFBC_TOGL_FLAGS (line 1326) | typedef enum {
type NVFBC_TOGL_SETUP_PARAMS (line 1371) | typedef struct _NVFBC_TOGL_SETUP_PARAMS {
type NVFBC_TOGL_GRAB_FRAME_PARAMS (line 1437) | typedef struct _NVFBC_TOGL_GRAB_FRAME_PARAMS {
type NVFBC_API_FUNCTION_LIST (line 1941) | typedef struct
FILE: third-party/nvfbc/helper_math.h
type uint (line 44) | typedef unsigned int uint;
type ushort (line 45) | typedef unsigned short ushort;
function fminf (line 58) | inline float
function fmaxf (line 63) | inline float
function max (line 68) | inline int
function min (line 73) | inline int
function rsqrtf (line 78) | inline float
function float2 (line 88) | float2
function float2 (line 92) | float2
function float2 (line 96) | float2
function float2 (line 100) | float2
function int2 (line 105) | int2
function int2 (line 109) | int2
function int2 (line 113) | int2
function int2 (line 117) | int2
function uint2 (line 122) | uint2
function uint2 (line 126) | uint2
function uint2 (line 130) | uint2
function float3 (line 135) | float3
function float3 (line 139) | float3
function float3 (line 143) | float3
function float3 (line 147) | float3
function float3 (line 151) | float3
function float3 (line 155) | float3
function int3 (line 160) | int3
function int3 (line 164) | int3
function int3 (line 168) | int3
function int3 (line 172) | int3
function int3 (line 176) | int3
function uint3 (line 181) | uint3
function uint3 (line 185) | uint3
function uint3 (line 189) | uint3
function uint3 (line 193) | uint3
function uint3 (line 197) | uint3
function float4 (line 202) | float4
function float4 (line 206) | float4
function float4 (line 210) | float4
function float4 (line 214) | float4
function float4 (line 218) | float4
function int4 (line 223) | int4
function int4 (line 227) | int4
function int4 (line 231) | int4
function int4 (line 235) | int4
function int4 (line 239) | int4
function uint4 (line 244) | uint4
function uint4 (line 248) | uint4
function uint4 (line 252) | uint4
function uint4 (line 256) | uint4
function float2 (line 749) | float2
function float2 (line 758) | float2
function float2 (line 762) | float2
function int2 (line 772) | int2
function int2 (line 781) | int2
function int2 (line 785) | int2
function uint2 (line 795) | uint2
function uint2 (line 804) | uint2
function uint2 (line 808) | uint2
function float3 (line 818) | float3
function float3 (line 828) | float3
function float3 (line 832) | float3
function int3 (line 843) | int3
function int3 (line 853) | int3
function int3 (line 857) | int3
function uint3 (line 868) | uint3
function uint3 (line 878) | uint3
function uint3 (line 882) | uint3
function float4 (line 893) | float4
function float4 (line 904) | float4
function float4 (line 908) | float4
function int4 (line 920) | int4
function int4 (line 931) | int4
function int4 (line 935) | int4
function uint4 (line 947) | uint4
function uint4 (line 958) | uint4
function uint4 (line 962) | uint4
function float2 (line 1057) | float2
function float3 (line 1061) | float3
function float4 (line 1065) | float4
function int2 (line 1070) | int2
function int3 (line 1074) | int3
function int4 (line 1078) | int4
function uint2 (line 1083) | uint2
function uint3 (line 1087) | uint3
function uint4 (line 1091) | uint4
function float2 (line 1100) | float2
function float3 (line 1104) | float3
function float4 (line 1108) | float4
function int2 (line 1113) | int2
function int3 (line 1117) | int3
function int4 (line 1121) | int4
function uint2 (line 1126) | uint2
function uint3 (line 1130) | uint3
function uint4 (line 1134) | uint4
function lerp (line 1144) | float
function float2 (line 1148) | float2
function float3 (line 1152) | float3
function float4 (line 1156) | float4
function clamp (line 1166) | float
function clamp (line 1170) | int
function uint (line 1174) | uint
function float2 (line 1179) | float2
functio
Condensed preview — 586 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,163K chars).
[
{
"path": ".clang-format",
"chars": 2276,
"preview": "---\n# This file is centrally managed in https://github.com/<organization>/.github/\n# Don't make changes to this file in "
},
{
"path": ".codeql-prebuild-cpp-Linux.sh",
"chars": 241,
"preview": "# install dependencies for C++ analysis\nset -e\n\nchmod +x ./scripts/linux_build.sh\n./scripts/linux_build.sh --skip-packag"
},
{
"path": ".codeql-prebuild-cpp-Windows.sh",
"chars": 2487,
"preview": "# install dependencies for C++ analysis\nset -e\n\n# update pacman\npacman --noconfirm -Syu\n\ngcc_version=\"15.1.0-5\"\n\nbroken_"
},
{
"path": ".codeql-prebuild-cpp-macOS.sh",
"chars": 428,
"preview": "# install dependencies for C++ analysis\nset -e\n\n# install dependencies\ndependencies=(\n \"cmake\"\n \"miniupnpc\"\n \"ninja\"\n"
},
{
"path": ".coderabbit.yaml",
"chars": 1819,
"preview": "# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json\nlanguage: zh-CN\nearly_access: true\n\nre"
},
{
"path": ".dockerignore",
"chars": 384,
"preview": "# ignore hidden files\n.*\n\n# do not ignore .git, needed for versioning\n!/.git\n\n# do not ignore .rstcheck.cfg, needed to t"
},
{
"path": ".flake8",
"chars": 89,
"preview": "[flake8]\nfilename =\n *.py,\n *.pys\nmax-line-length = 120\nextend-exclude =\n venv/\n"
},
{
"path": ".gitattributes",
"chars": 210,
"preview": "# ensure dockerfiles are checked out with LF line endings\nDockerfile text eol=lf\n*.dockerfile text eol=lf\n\n# ensure flat"
},
{
"path": ".github/FUNDING.yml",
"chars": 89,
"preview": "custom: [\n \"https://www.ifdian.net/a/qiin2333\",\n \"https://www.ifdian.net/a/Yundi339\"\n]\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report_en.yml",
"chars": 7190,
"preview": "name: \"🐛 Bug Report (English)\"\ndescription: \"Report a bug to help us improve\"\ntitle: \"[Bug]: \"\nlabels: [\"bug\"]\nbody:\n -"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report_zh.yml",
"chars": 5297,
"preview": "name: \"🐛 问题报告(中文)\"\ndescription: \"报告问题帮助我们改进\"\ntitle: \"[Bug]: \"\nlabels: [\"bug\"]\nbody:\n - type: markdown\n attributes:\n "
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 27,
"preview": "blank_issues_enabled: false"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request_en.yml",
"chars": 5761,
"preview": "name: \"✨ Feature Request (English)\"\ndescription: \"Suggest a new feature or improvement\"\ntitle: \"[Feature]: \"\nlabels: [\"e"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request_zh.yml",
"chars": 3879,
"preview": "name: \"✨ 功能建议(中文)\"\ndescription: \"建议新功能或改进\"\ntitle: \"[Feature]: \"\nlabels: [\"enhancement\"]\nbody:\n - type: markdown\n att"
},
{
"path": ".github/RELEASE_TEMPLATE.md",
"chars": 1101,
"preview": "## What's Changed\n\n### ✨ New Features\n* **feat:** 功能描述 by [@用户名](https://github.com/用户名) in [#PR号](https://github.com/qi"
},
{
"path": ".github/workflows/main.yml",
"chars": 12237,
"preview": "name: Build and Release\n\non:\n pull_request:\n branches:\n - master\n types:\n - opened\n - synchronize\n"
},
{
"path": ".github/workflows/sign-and-repackage.yml",
"chars": 14441,
"preview": "# 签名并重新打包工作流(仅用于正式发布版本)\n# 流程:\n# 1. 编译当前分支的代码(只编译一次)\n# 2. 生成未签名的 ZIP 和 Inno Setup staging 目录\n# 3. 将所有 EXE/DLL 文件提交到 SignP"
},
{
"path": ".github/workflows/test-signpath.yml",
"chars": 7231,
"preview": "# SignPath 测试工作流\n# 用于手动测试 SignPath 签名功能\n\nname: Test SignPath Signing\n\non:\n workflow_dispatch:\n inputs:\n artifac"
},
{
"path": ".github/workflows/translate-simple.yml",
"chars": 7547,
"preview": "name: Simple README Translation\n\non:\n push:\n branches:\n - master\n paths:\n - 'README.md'\n workflow_disp"
},
{
"path": ".github/workflows/update-driver-versions.yml",
"chars": 3996,
"preview": "# Update driver version pins in cmake/packaging/FetchDriverDeps.cmake\n#\n# Driver binaries are no longer committed to the"
},
{
"path": ".gitignore",
"chars": 1385,
"preview": "# Prerequisites\n*.d\n\n# Compiled Object files\n*.slo\n*.lo\n*.o\n*.obj\n\n# Precompiled Headers\n*.gch\n*.pch\n\n# Compiled Dynamic"
},
{
"path": ".gitmodules",
"chars": 2927,
"preview": "[submodule \"packaging/linux/flatpak/deps/flatpak-builder-tools\"]\n\tpath = packaging/linux/flatpak/deps/flatpak-builder-to"
},
{
"path": ".prettierrc.json",
"chars": 109,
"preview": "{\n \"printWidth\": 120,\n \"semi\": false,\n \"singleQuote\": true,\n \"prettier.spaceBeforeFunctionParen\": true\n}\n"
},
{
"path": ".readthedocs.yaml",
"chars": 790,
"preview": "---\n# .readthedocs.yaml\n# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.ht"
},
{
"path": ".rstcheck.cfg",
"chars": 208,
"preview": "# configuration file for rstcheck, an rst linting tool\n# https://rstcheck.readthedocs.io/en/latest/usage/config\n\n[rstche"
},
{
"path": "CMakeLists.txt",
"chars": 2314,
"preview": "cmake_minimum_required(VERSION 3.20)\n# `CMAKE_CUDA_ARCHITECTURES` requires 3.18\n# `set_source_files_properties` requires"
},
{
"path": "CMakePresets.json",
"chars": 641,
"preview": "{\n \"version\": 6,\n \"cmakeMinimumRequired\": {\n \"major\": 3,\n \"minor\": 20,\n \"patch\": 0\n },\n \"configurePresets\":"
},
{
"path": "DOCKER_README.md",
"chars": 5931,
"preview": "# Docker\n\n## Important note\nStarting with v0.18.0, tag names have changed. You may no longer use `latest`, `master`, `vX"
},
{
"path": "LICENSE",
"chars": 35149,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "NOTICE",
"chars": 171,
"preview": "©2018 Valve Corporation. Steam and the Steam logo are trademarks and/or\nregistered trademarks of Valve Corporation in th"
},
{
"path": "README.de.md",
"chars": 10345,
"preview": "# Sunshine Foundation Edition\n\n## 🌐 Mehrsprachige Unterstützung / Multi-language Support\n\n<div align=\"center\">\n\n[\n\n# AppImage\nif(${SUNSHINE_BUILD"
},
{
"path": "cmake/compile_definitions/macos.cmake",
"chars": 2097,
"preview": "# macos specific compile definitions\n\nadd_compile_definitions(SUNSHINE_PLATFORM=\"macos\")\n\nset(MACOS_LINK_DIRECTORIES\n "
},
{
"path": "cmake/compile_definitions/unix.cmake",
"chars": 368,
"preview": "# unix specific compile definitions\n# put anything here that applies to both linux and macos\n\nlist(APPEND SUNSHINE_EXTER"
},
{
"path": "cmake/compile_definitions/windows.cmake",
"chars": 5874,
"preview": "# windows specific compile definitions\n\nadd_compile_definitions(SUNSHINE_PLATFORM=\"windows\")\n\nenable_language(RC)\nset(CM"
},
{
"path": "cmake/dependencies/Boost_Sunshine.cmake",
"chars": 3754,
"preview": "#\n# Loads the boost library giving the priority to the system package first, with a fallback to FetchContent.\n#\ninclude_"
},
{
"path": "cmake/dependencies/common.cmake",
"chars": 3440,
"preview": "# load common dependencies\n# this file will also load platform specific dependencies\n\n# boost, this should be before Sim"
},
{
"path": "cmake/dependencies/libevdev_Sunshine.cmake",
"chars": 1629,
"preview": "#\n# Loads the libevdev library giving the priority to the system package first, with a fallback to ExternalProject\n#\ninc"
},
{
"path": "cmake/dependencies/linux.cmake",
"chars": 30,
"preview": "# linux specific dependencies\n"
},
{
"path": "cmake/dependencies/macos.cmake",
"chars": 424,
"preview": "# macos specific dependencies\n\nFIND_LIBRARY(APP_KIT_LIBRARY AppKit)\nFIND_LIBRARY(APP_SERVICES_LIBRARY ApplicationService"
},
{
"path": "cmake/dependencies/nlohmann_json.cmake",
"chars": 933,
"preview": "#\n# Loads the nlohmann_json library giving the priority to the system package first, with a fallback to FetchContent.\n#\n"
},
{
"path": "cmake/dependencies/unix.cmake",
"chars": 86,
"preview": "# unix specific dependencies\n# put anything here that applies to both linux and macos\n"
},
{
"path": "cmake/dependencies/windows.cmake",
"chars": 465,
"preview": "# windows specific dependencies\n\n# nlohmann_json\nfind_package(nlohmann_json CONFIG 3.11 REQUIRED)\n\n# Make sure MinHook i"
},
{
"path": "cmake/macros/common.cmake",
"chars": 881,
"preview": "# common macros\n# this file will also load platform specific macros\n\n# platform specific macros\nif(WIN32)\n include(${"
},
{
"path": "cmake/macros/linux.cmake",
"chars": 1160,
"preview": "# linux specific macros\n\n# GEN_WAYLAND: args = `filename`\nmacro(GEN_WAYLAND wayland_directory subdirectory filename)\n "
},
{
"path": "cmake/macros/macos.cmake",
"chars": 619,
"preview": "# macos specific macros\n\n# ADD_FRAMEWORK: args = `fwname`, `appname`\nmacro(ADD_FRAMEWORK fwname appname)\n find_librar"
},
{
"path": "cmake/macros/unix.cmake",
"chars": 80,
"preview": "# unix specific macros\n# put anything here that applies to both linux and macos\n"
},
{
"path": "cmake/macros/windows.cmake",
"chars": 26,
"preview": "# windows specific macros\n"
},
{
"path": "cmake/packaging/ChineseSimplified.isl",
"chars": 13367,
"preview": "; *** Inno Setup version 6.5.0+ Chinese Simplified messages ***\n;\n; To download user-contributed translations of this fi"
},
{
"path": "cmake/packaging/FetchDriverDeps.cmake",
"chars": 9929,
"preview": "# FetchDriverDeps.cmake — Download driver dependencies from GitHub Releases\n#\n# Downloads pre-built signed driver binari"
},
{
"path": "cmake/packaging/FetchGUI.cmake",
"chars": 4645,
"preview": "# FetchGUI.cmake — Download pre-built Sunshine GUI from GitHub Releases\n#\n# Downloads the Tauri-based GUI binary at conf"
},
{
"path": "cmake/packaging/common.cmake",
"chars": 3998,
"preview": "# common packaging\n\n# common cpack options\nset(CPACK_PACKAGE_NAME ${CMAKE_PROJECT_NAME})\nset(CPACK_PACKAGE_VENDOR \"qiin2"
},
{
"path": "cmake/packaging/linux.cmake",
"chars": 6355,
"preview": "# linux specific packaging\n\ninstall(DIRECTORY \"${SUNSHINE_SOURCE_ASSETS_DIR}/linux/assets/\"\n DESTINATION \"${SUNSH"
},
{
"path": "cmake/packaging/macos.cmake",
"chars": 1041,
"preview": "# macos specific packaging\n\n# todo - bundle doesn't produce a valid .app use cpack -G DragNDrop\nset(CPACK_BUNDLE_NAME \"$"
},
{
"path": "cmake/packaging/sunshine.iss.in",
"chars": 26500,
"preview": "; Sunshine Inno Setup Script\n; Generated from CMake template - DO NOT EDIT DIRECTLY\n; Edit cmake/packaging/sunshine.iss."
},
{
"path": "cmake/packaging/unix.cmake",
"chars": 396,
"preview": "# unix specific packaging\n# put anything here that applies to both linux and macos\n\n# return here if building a macos pa"
},
{
"path": "cmake/packaging/windows.cmake",
"chars": 7104,
"preview": "# windows specific packaging\n\n# Fetch driver dependencies (downloads at configure time)\ninclude(${CMAKE_MODULE_PATH}/pac"
},
{
"path": "cmake/packaging/windows_innosetup.cmake",
"chars": 2820,
"preview": "# Inno Setup Packaging\n# Replaces NSIS packaging with Inno Setup for Windows installer generation\n# \n# Usage:\n# cmake "
},
{
"path": "cmake/packaging/windows_nsis.cmake",
"chars": 13628,
"preview": "# NSIS Packaging\n# see options at: https://cmake.org/cmake/help/latest/cpack_gen/nsis.html\n\nset(CPACK_NSIS_INSTALLED_ICO"
},
{
"path": "cmake/packaging/windows_wix.cmake",
"chars": 120,
"preview": "# WIX Packaging\n# see options at: https://cmake.org/cmake/help/latest/cpack_gen/wix.html\n\n# TODO: Replace nsis with wix\n"
},
{
"path": "cmake/prep/build_version.cmake",
"chars": 2845,
"preview": "# Check if env vars are defined before attempting to access them, variables will be defined even if blank\nif((DEFINED EN"
},
{
"path": "cmake/prep/constants.cmake",
"chars": 245,
"preview": "# source assets will be installed from this directory\nset(SUNSHINE_SOURCE_ASSETS_DIR \"${CMAKE_SOURCE_DIR}/src_assets\")\n\n"
},
{
"path": "cmake/prep/init.cmake",
"chars": 555,
"preview": "if (WIN32)\nelseif (APPLE)\nelseif (UNIX)\n include(GNUInstallDirs)\n\n if(NOT DEFINED SUNSHINE_EXECUTABLE_PATH)\n "
},
{
"path": "cmake/prep/options.cmake",
"chars": 3242,
"preview": "# Publisher Metadata\nset(SUNSHINE_PUBLISHER_NAME \"qiin2333\"\n CACHE STRING \"The name of the publisher (not develop"
},
{
"path": "cmake/prep/special_package_configuration.cmake",
"chars": 2206,
"preview": "if(UNIX)\n if(${SUNSHINE_CONFIGURE_HOMEBREW})\n configure_file(packaging/sunshine.rb sunshine.rb @ONLY)\n endi"
},
{
"path": "cmake/targets/common.cmake",
"chars": 4707,
"preview": "# common target definitions\n# this file will also load platform specific macros\n\nadd_executable(sunshine ${SUNSHINE_TARG"
},
{
"path": "cmake/targets/linux.cmake",
"chars": 36,
"preview": "# linux specific target definitions\n"
},
{
"path": "cmake/targets/macos.cmake",
"chars": 336,
"preview": "# macos specific target definitions\ntarget_link_options(sunshine PRIVATE LINKER:-sectcreate,__TEXT,__info_plist,${APPLE_"
},
{
"path": "cmake/targets/unix.cmake",
"chars": 92,
"preview": "# unix specific target definitions\n# put anything here that applies to both linux and macos\n"
},
{
"path": "cmake/targets/windows.cmake",
"chars": 1206,
"preview": "# windows specific target definitions\nset_target_properties(sunshine PROPERTIES LINK_SEARCH_START_STATIC 1)\nset(CMAKE_FI"
},
{
"path": "codecov.yml",
"chars": 302,
"preview": "---\ncodecov:\n branch: master\n\ncoverage:\n status:\n project:\n default:\n target: auto\n threshold: 1"
},
{
"path": "crowdin.yml",
"chars": 1070,
"preview": "---\n\"base_path\": \".\"\n\"base_url\": \"https://api.crowdin.com\" # optional (for Crowdin Enterprise only)\n\"preserve_hierarchy"
},
{
"path": "docker/archlinux.dockerfile",
"chars": 3508,
"preview": "# syntax=docker/dockerfile:1\n# artifacts: true\n# platforms: linux/amd64\n# archlinux does not have an arm64 base image\n# "
},
{
"path": "docker/clion-toolchain.dockerfile",
"chars": 2586,
"preview": "# syntax=docker/dockerfile:1\n# artifacts: false\n# platforms: linux/amd64\n# platforms_pr: linux/amd64\n# no-cache-filters:"
},
{
"path": "docker/debian-bookworm.dockerfile",
"chars": 2172,
"preview": "# syntax=docker/dockerfile:1\n# artifacts: true\n# platforms: linux/amd64,linux/arm64/v8\n# platforms_pr: linux/amd64\n# no-"
},
{
"path": "docker/fedora-39.dockerfile",
"chars": 2071,
"preview": "# syntax=docker/dockerfile:1\n# artifacts: true\n# platforms: linux/amd64\n# platforms_pr: linux/amd64\n# no-cache-filters: "
},
{
"path": "docker/fedora-40.dockerfile",
"chars": 2071,
"preview": "# syntax=docker/dockerfile:1\n# artifacts: true\n# platforms: linux/amd64\n# platforms_pr: linux/amd64\n# no-cache-filters: "
},
{
"path": "docker/ubuntu-22.04.dockerfile",
"chars": 2169,
"preview": "# syntax=docker/dockerfile:1\n# artifacts: true\n# platforms: linux/amd64,linux/arm64/v8\n# platforms_pr: linux/amd64\n# no-"
},
{
"path": "docker/ubuntu-24.04.dockerfile",
"chars": 2169,
"preview": "# syntax=docker/dockerfile:1\n# artifacts: true\n# platforms: linux/amd64,linux/arm64/v8\n# platforms_pr: linux/amd64\n# no-"
},
{
"path": "docs/Doxyfile",
"chars": 1933,
"preview": "# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project.\n#\n#"
},
{
"path": "docs/Doxyfile-1.10.0-default",
"chars": 129662,
"preview": "# Doxyfile 1.10.0\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org)"
},
{
"path": "docs/WEBUI_DEVELOPMENT.md",
"chars": 18198,
"preview": "# WebUI 开发指南\n\nSunshine 包含一个现代化的 Web 控制界面,基于 Vue 3 和 Composition API 构建,遵循 Vue 最佳实践。\n\n> **注意**: 本文档已更新以反映最新的项目结构优化。所有页面已重"
},
{
"path": "docs/WGC_vs_DDAPI_Smoothness_Fun_Guide.md",
"chars": 3903,
"preview": "# 杂鱼!你还在用 DDAPI 吗?WGC vs DDAPI 流畅度大对决!\n\n> 杂鱼杂鱼~连捕获模式都不会选的杂鱼~ \n> 本文用通俗到杂鱼都能懂的方式,解释为什么 WGC 比 DDAPI 更丝滑!\n\n---\n\n## 诶?为什么同样的"
},
{
"path": "docs/app_examples.md",
"chars": 16182,
"preview": "# App Examples\nSince not all applications behave the same, we decided to create some examples to help you get started ad"
},
{
"path": "docs/building.md",
"chars": 4459,
"preview": "# Building\nSunshine binaries are built using [CMake](https://cmake.org) and requires `cmake` > 3.25.\n\n## Building Locall"
},
{
"path": "docs/changelog.md",
"chars": 493,
"preview": "# Changelog\n\n@htmlonly\n<script type=\"module\" src=\"https://md-block.verou.me/md-block.js\"></script>\n<md-block\n hmin=\"2\"\n"
},
{
"path": "docs/configuration.md",
"chars": 86525,
"preview": "# Configuration\nSunshine will work with the default settings for most users. In some cases you may want to configure Sun"
},
{
"path": "docs/contributing.md",
"chars": 10306,
"preview": "# Contributing\nRead our contribution guide in our organization level\n[docs](https://lizardbyte.readthedocs.io/en/latest/"
},
{
"path": "docs/gamestream_migration.md",
"chars": 1622,
"preview": "# GameStream Migration\nNvidia announced that their GameStream service for Nvidia Games clients will be discontinued in F"
},
{
"path": "docs/getting_started.md",
"chars": 18275,
"preview": "# Getting Started\n\nThe recommended method for running Sunshine is to use the [binaries](#binaries) included in the\n[late"
},
{
"path": "docs/guides.md",
"chars": 19263,
"preview": "# Guides\n\n@admonition{Community | This collection of guides is written by the community!\nFeel free to contribute your ow"
},
{
"path": "docs/legal.md",
"chars": 1735,
"preview": "# Legal\n@attention{This documentation is for informational purposes only and is not intended as legal advice. If you hav"
},
{
"path": "docs/performance_tuning.md",
"chars": 677,
"preview": "# Performance Tuning\nIn addition to the options available in the [Configuration](configuration.md) section, there are a "
},
{
"path": "docs/run_command_dev_guide.md",
"chars": 4700,
"preview": "# `run_command` 函数开发说明\n\n## 1. 函数签名\n\n```cpp\nbp::child run_command(\n bool elevated, // 是否以提升权限运行\n "
},
{
"path": "docs/source/about/advanced_usage.rst",
"chars": 50935,
"preview": "Advanced Usage\n==============\nSunshine will work with the default settings for most users. In some cases you may want to"
},
{
"path": "docs/source/source_code/src/display_device/display_device.rst",
"chars": 62,
"preview": "display_device\n==============\n\n.. todo:: Add display_device.h\n"
},
{
"path": "docs/source/source_code/src/display_device/parsed_config.rst",
"chars": 59,
"preview": "parsed_config\n=============\n\n.. todo:: Add parsed_config.h\n"
},
{
"path": "docs/source/source_code/src/display_device/session.rst",
"chars": 41,
"preview": "session\n=======\n\n.. todo:: Add session.h\n"
},
{
"path": "docs/source/source_code/src/display_device/settings.rst",
"chars": 44,
"preview": "settings\n========\n\n.. todo:: Add settings.h\n"
},
{
"path": "docs/source/source_code/src/display_device/to_string.rst",
"chars": 47,
"preview": "to_string\n=========\n\n.. todo:: Add to_string.h\n"
},
{
"path": "docs/source/source_code/src/platform/windows/display_device/settings_data.rst",
"chars": 59,
"preview": "settings_data\n=============\n\n.. todo:: Add settings_data.h\n"
},
{
"path": "docs/source/source_code/src/platform/windows/display_device/settings_topology.rst",
"chars": 71,
"preview": "settings_topology\n=================\n\n.. todo:: Add settings_topology.h\n"
},
{
"path": "docs/source/source_code/src/platform/windows/display_device/windows_utils.rst",
"chars": 59,
"preview": "windows_utils\n=============\n\n.. todo:: Add windows_utils.h\n"
},
{
"path": "docs/third_party_packages.md",
"chars": 2871,
"preview": "# Third-Party Packages\n\n@danger{These packages are not maintained by LizardByte. Use at your own risk.}\n\n## Chocolatey\n["
},
{
"path": "docs/troubleshooting.md",
"chars": 7731,
"preview": "# Troubleshooting\n\n## General\n\n### Forgotten Credentials\nIf you forgot your credentials to the web UI, try this.\n\n@tabs{"
},
{
"path": "docs/webhook_format.md",
"chars": 3062,
"preview": "# Sunshine Webhook格式配置\n\n## 概述\n\nSunshine支持多种webhook格式,包括Markdown、纯文本和JSON格式,暂时没有适配的对象平台。\n\n## Webhook格式规范\n\n### 消息格式要求\n- **"
},
{
"path": "gh-pages-template/index.html",
"chars": 48647,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>LizardByte - Sunshine</title>\n <meta charset=\"utf-8\" /"
},
{
"path": "package.json",
"chars": 1338,
"preview": "{\n \"type\": \"module\",\n \"scripts\": {\n \"prebuild\": \"node ./src_assets/common/assets/web/scripts/extract-welcome-locale"
},
{
"path": "scripts/README_I18N.md",
"chars": 7969,
"preview": "# i18n Tools\n\nThis directory contains scripts for managing internationalization (i18n) in the Sunshine project.\n\n## Over"
},
{
"path": "scripts/_locale.py",
"chars": 5149,
"preview": "\"\"\"\n..\n _locale.py\n\nFunctions related to building, initializing, updating, and compiling localization translations.\n\nB"
},
{
"path": "scripts/format-i18n.js",
"chars": 3983,
"preview": "#!/usr/bin/env node\n/**\n * i18n JSON Sorting and Formatting Script\n * \n * This script sorts all locale JSON files alphab"
},
{
"path": "scripts/generate-checksums.ps1",
"chars": 2380,
"preview": "# Generate SHA256 checksums for release packages\n# Usage: .\\generate-checksums.ps1 [-Path <directory>] [-Output <file>]\n"
},
{
"path": "scripts/icons/convert_and_pack.sh",
"chars": 1938,
"preview": "#!/bin/bash\r\n\r\nif ! [ -x \"$(command -v ./go-png2ico)\" ]; then\r\n echo \"./go-png2ico not found\"\r\n echo \"download the"
},
{
"path": "scripts/linux_build.sh",
"chars": 14727,
"preview": "#!/bin/bash\nset -e\n\n# Default value for arguments\nappimage_build=0\npublisher_name=\"Third Party Publisher\"\npublisher_webs"
},
{
"path": "scripts/requirements.txt",
"chars": 27,
"preview": "Babel==2.16.0\nclang-format\n"
},
{
"path": "scripts/reverse-sync-i18n.js",
"chars": 4792,
"preview": "#!/usr/bin/env node\n/**\n * Reverse i18n Sync Script\n * \n * This script identifies keys that exist in other locale files "
},
{
"path": "scripts/update_clang_format.py",
"chars": 793,
"preview": "# standard imports\nimport os\nimport subprocess\n\n# variables\ndirectories = [\n 'src',\n 'tests',\n 'tools',\n os."
},
{
"path": "scripts/validate-i18n.js",
"chars": 14487,
"preview": "#!/usr/bin/env node\n/**\n * i18n Translation Validation and Sync Script\n * \n * This script validates that all locale file"
},
{
"path": "scripts/vmouse_smoke.ps1",
"chars": 4008,
"preview": "param(\n [string]$ProbeExe = \"\",\n [int]$TimeoutMs = 5000,\n [string]$MatchSubstring = \"VID_1ACE&PID_0002\",\n [s"
},
{
"path": "src/abr.cpp",
"chars": 22547,
"preview": "/**\n * @file src/abr.cpp\n * @brief Adaptive Bitrate (ABR) decision engine using LLM AI.\n *\n * Architecture: two-tier bit"
},
{
"path": "src/abr.h",
"chars": 5366,
"preview": "/**\n * @file src/abr.h\n * @brief Adaptive Bitrate (ABR) decision engine for server-side bitrate control.\n *\n * Two-tier "
},
{
"path": "src/amf/amf_config.h",
"chars": 3672,
"preview": "/**\n * @file src/amf/amf_config.h\n * @brief Declarations for AMF encoder configuration.\n */\n#pragma once\n\n#include <cstd"
},
{
"path": "src/amf/amf_d3d11.cpp",
"chars": 40261,
"preview": "/**\n * @file src/amf/amf_d3d11.cpp\n * @brief Implementation of standalone AMF encoder with D3D11 texture input.\n */\n\n#in"
},
{
"path": "src/amf/amf_d3d11.h",
"chars": 3370,
"preview": "/**\n * @file src/amf/amf_d3d11.h\n * @brief Declarations for AMF D3D11 encoder.\n */\n#pragma once\n\n#include \"amf_encoder.h"
},
{
"path": "src/amf/amf_encoded_frame.h",
"chars": 401,
"preview": "/**\n * @file src/amf/amf_encoded_frame.h\n * @brief Declarations for AMF encoded frame.\n */\n#pragma once\n\n#include <cstdi"
},
{
"path": "src/amf/amf_encoder.h",
"chars": 2368,
"preview": "/**\n * @file src/amf/amf_encoder.h\n * @brief Declarations for standalone AMF encoder interface.\n */\n#pragma once\n\n#inclu"
},
{
"path": "src/assets/abr_prompt.md",
"chars": 2173,
"preview": "You are an adaptive bitrate controller for a game streaming server. Analyze the network metrics and active application t"
},
{
"path": "src/audio.cpp",
"chars": 12772,
"preview": "/**\n * @file src/audio.cpp\n * @brief Definitions for audio capture and encoding.\n */\n// standard includes\n#include <thre"
},
{
"path": "src/audio.h",
"chars": 3797,
"preview": "/**\n * @file src/audio.h\n * @brief Declarations for audio capture and encoding.\n */\n#pragma once\n\n// local includes\n#inc"
},
{
"path": "src/cbs.cpp",
"chars": 7981,
"preview": "/**\n * @file src/cbs.cpp\n * @brief Definitions for FFmpeg Coded Bitstream API.\n */\nextern \"C\" {\n#include <libavcodec/avc"
},
{
"path": "src/cbs.h",
"chars": 922,
"preview": "/**\n * @file src/cbs.h\n * @brief Declarations for FFmpeg Coded Bitstream API.\n */\n#pragma once\n\n#include \"utility.h\"\n\nst"
},
{
"path": "src/config.cpp",
"chars": 62171,
"preview": "/**\n * @file src/config.cpp\n * @brief Definitions for the configuration of Sunshine.\n */\n#include <algorithm>\n#include <"
},
{
"path": "src/config.h",
"chars": 8240,
"preview": "/**\n * @file src/config.h\n * @brief Declarations for the configuration of Sunshine.\n */\n#pragma once\n\n#include <bitset>\n"
},
{
"path": "src/confighttp.cpp",
"chars": 95982,
"preview": "/**\n * @file src/confighttp.cpp\n * @brief Definitions for the Web UI Config HTTP server.\n *\n * @todo Authentication, bet"
},
{
"path": "src/confighttp.h",
"chars": 2039,
"preview": "/**\n * @file src/confighttp.h\n * @brief Declarations for the Web UI Config HTTP server.\n */\n#pragma once\n\n#include <func"
},
{
"path": "src/crypto.cpp",
"chars": 19488,
"preview": "/**\n * @file src/crypto.cpp\n * @brief Definitions for cryptography functions.\n */\n#include \"crypto.h\"\n#include <openssl/"
},
{
"path": "src/crypto.h",
"chars": 6039,
"preview": "/**\n * @file src/crypto.h\n * @brief Declarations for cryptography functions.\n */\n#pragma once\n\n#include <array>\n#include"
},
{
"path": "src/display_device/display_device.h",
"chars": 10259,
"preview": "#pragma once\n\n// standard includes\n#include <map>\n#include <string>\n#include <unordered_set>\n#include <vector>\n\n// lib i"
},
{
"path": "src/display_device/parsed_config.cpp",
"chars": 29791,
"preview": "// lib includes\n#include <boost/algorithm/string.hpp>\n#include <boost/regex.hpp>\n#include <charconv>\n#include <cmath>\n\n/"
},
{
"path": "src/display_device/parsed_config.h",
"chars": 7311,
"preview": "#pragma once\n\n// local includes\n#include \"display_device.h\"\n\n// forward declarations\nnamespace config {\n struct video_t"
},
{
"path": "src/display_device/session.cpp",
"chars": 28572,
"preview": "// standard includes\n#include <boost/optional/optional_io.hpp>\n#include <boost/process/v1.hpp>\n#include <future>\n#includ"
},
{
"path": "src/display_device/session.h",
"chars": 9616,
"preview": "#pragma once\n\n// standard includes\n#include <mutex>\n// lib includes\n#include <boost/atomic.hpp>\n// local includes\n#inclu"
},
{
"path": "src/display_device/settings.cpp",
"chars": 1219,
"preview": "// local includes\n#include \"settings.h\"\n#include \"src/logging.h\"\n\nnamespace display_device {\n\n settings_t::apply_result"
},
{
"path": "src/display_device/settings.h",
"chars": 7597,
"preview": "#pragma once\n\n// standard includes\n#include <filesystem>\n#include <memory>\n\n// local includes\n#include \"parsed_config.h\""
},
{
"path": "src/display_device/to_string.cpp",
"chars": 3535,
"preview": "// local includes\n#include \"to_string.h\"\n#include \"src/logging.h\"\n\nnamespace display_device {\n\n std::string\n to_string"
},
{
"path": "src/display_device/to_string.h",
"chars": 3454,
"preview": "#pragma once\n\n// local includes\n#include \"display_device.h\"\n\nnamespace display_device {\n\n /**\n * @brief Stringify a d"
},
{
"path": "src/display_device/vdd_utils.cpp",
"chars": 26312,
"preview": "#define WIN32_LEAN_AND_MEAN\n\n#include \"vdd_utils.h\"\n\n#include <algorithm>\n#include <boost/filesystem.hpp>\n#include <boos"
},
{
"path": "src/display_device/vdd_utils.h",
"chars": 4448,
"preview": "#pragma once\n\n#define WIN32_LEAN_AND_MEAN\n\n#include <chrono>\n#include <functional>\n#include <string>\n#include <string_vi"
},
{
"path": "src/entry_handler.cpp",
"chars": 7106,
"preview": "/**\n * @file entry_handler.cpp\n * @brief Definitions for entry handling functions.\n */\n// standard includes\n#include <cs"
},
{
"path": "src/entry_handler.h",
"chars": 3190,
"preview": "/**\n * @file entry_handler.h\n * @brief Declarations for entry handling functions.\n */\n#pragma once\n\n// standard includes"
},
{
"path": "src/file_handler.cpp",
"chars": 1320,
"preview": "/**\n * @file file_handler.cpp\n * @brief Definitions for file handling functions.\n */\n\n// standard includes\n#include <fil"
},
{
"path": "src/file_handler.h",
"chars": 1447,
"preview": "/**\n * @file file_handler.h\n * @brief Declarations for file handling functions.\n */\n#pragma once\n\n#include <string>\n\n/**"
},
{
"path": "src/globals.cpp",
"chars": 431,
"preview": "/**\n * @file globals.cpp\n * @brief Definitions for globally accessible variables and functions.\n */\n#include \"globals.h\""
},
{
"path": "src/globals.h",
"chars": 1686,
"preview": "/**\n * @file globals.h\n * @brief Declarations for globally accessible variables and functions.\n */\n#pragma once\n\n#includ"
},
{
"path": "src/httpcommon.cpp",
"chars": 18621,
"preview": "/**\n * @file src/httpcommon.cpp\n * @brief Definitions for common HTTP.\n */\n#define BOOST_BIND_GLOBAL_PLACEHOLDERS\n\n#incl"
},
{
"path": "src/httpcommon.h",
"chars": 1283,
"preview": "/**\n * @file src/httpcommon.h\n * @brief Declarations for common HTTP.\n */\n#pragma once\n\n// lib includes\n#include <curl/c"
},
{
"path": "src/input.cpp",
"chars": 57560,
"preview": "/**\n * @file src/input.cpp\n * @brief Definitions for gamepad, keyboard, and mouse input handling.\n */\n// define uint32_t"
},
{
"path": "src/input.h",
"chars": 1340,
"preview": "/**\n * @file src/input.h\n * @brief Declarations for gamepad, keyboard, and mouse input handling.\n */\n#pragma once\n\n#incl"
},
{
"path": "src/logging.cpp",
"chars": 11434,
"preview": "/**\n * @file src/logging.cpp\n * @brief Definitions for logging related functions.\n */\n// standard includes\n#include <fst"
},
{
"path": "src/logging.h",
"chars": 6607,
"preview": "/**\n * @file src/logging.h\n * @brief Declarations for logging related functions.\n */\n#pragma once\n\n// lib includes\n#incl"
},
{
"path": "src/main.cpp",
"chars": 14375,
"preview": "/**\n * @file src/main.cpp\n * @brief Definitions for the main entry point for Sunshine.\n */\n// standard includes\n#include"
},
{
"path": "src/main.h",
"chars": 342,
"preview": "/**\n * @file src/main.h\n * @brief Declarations for the main entry point for Sunshine.\n */\n#pragma once\n\n/**\n * @brief Ma"
},
{
"path": "src/move_by_copy.h",
"chars": 1372,
"preview": "/**\n * @file src/move_by_copy.h\n * @brief Declarations for the MoveByCopy utility class.\n */\n#pragma once\n\n#include <uti"
},
{
"path": "src/network.cpp",
"chars": 6265,
"preview": "/**\n * @file src/network.cpp\n * @brief Definitions for networking related functions.\n */\n#include \"network.h\"\n#include \""
},
{
"path": "src/network.h",
"chars": 3474,
"preview": "/**\n * @file src/network.h\n * @brief Declarations for networking related functions.\n */\n#pragma once\n\n#include <tuple>\n#"
},
{
"path": "src/nvenc/common_impl/nvenc_base.cpp",
"chars": 52534,
"preview": "/**\n * @file src/nvenc/common_impl/nvenc_base.cpp\n * @brief Definitions for abstract platform-agnostic base of standalon"
},
{
"path": "src/nvenc/common_impl/nvenc_base.h",
"chars": 6152,
"preview": "/**\n * @file src/nvenc/common_impl/nvenc_base.h\n * @brief Declarations for abstract platform-agnostic base of standalone"
},
{
"path": "src/nvenc/common_impl/nvenc_utils.cpp",
"chars": 3323,
"preview": "/**\r\n * @file src/nvenc/common_impl/nvenc_utils.cpp\r\n * @brief Definitions for NVENC utilities.\r\n */\r\n#include \"nvenc_ut"
},
{
"path": "src/nvenc/common_impl/nvenc_utils.h",
"chars": 946,
"preview": "/**\r\n * @file src/nvenc/common_impl/nvenc_utils.h\r\n * @brief Declarations for NVENC utilities.\r\n */\r\n#pragma once\r\n\r\n#if"
},
{
"path": "src/nvenc/nvenc_config.h",
"chars": 4639,
"preview": "/**\n * @file src/nvenc/nvenc_config.h\n * @brief Declarations for NVENC encoder configuration.\n */\n#pragma once\n\n#include"
},
{
"path": "src/nvenc/nvenc_encoded_frame.h",
"chars": 418,
"preview": "/**\r\n * @file src/nvenc/nvenc_encoded_frame.h\r\n * @brief Declarations for NVENC encoded frame.\r\n */\r\n#pragma once\r\n\r\n#in"
},
{
"path": "src/nvenc/nvenc_encoder.h",
"chars": 3134,
"preview": "/**\n * @file src/nvenc/nvenc_encoder.h\n * @brief Declarations for NVENC encoder interface.\n */\n#pragma once\n\n#include \"n"
},
{
"path": "src/nvenc/win/impl/nvenc_d3d11_base.cpp",
"chars": 1506,
"preview": "/**\r\n * @file src/nvenc/win/impl/nvenc_d3d11_base.cpp\r\n * @brief Definitions for abstract Direct3D11 NVENC encoder.\r\n */"
},
{
"path": "src/nvenc/win/impl/nvenc_d3d11_base.h",
"chars": 1257,
"preview": "/**\r\n * @file src/nvenc/win/impl/nvenc_d3d11_base.h\r\n * @brief Declarations for abstract Direct3D11 NVENC encoder.\r\n */\r"
},
{
"path": "src/nvenc/win/impl/nvenc_d3d11_native.cpp",
"chars": 2472,
"preview": "/**\r\n * @file src/nvenc/win/impl/nvenc_d3d11_native.cpp\r\n * @brief Definitions for native Direct3D11 NVENC encoder.\r\n */"
},
{
"path": "src/nvenc/win/impl/nvenc_d3d11_native.h",
"chars": 794,
"preview": "/**\r\n * @file src/nvenc/win/impl/nvenc_d3d11_native.h\r\n * @brief Declarations for native Direct3D11 NVENC encoder.\r\n */\r"
},
{
"path": "src/nvenc/win/impl/nvenc_d3d11_on_cuda.cpp",
"chars": 9894,
"preview": "/**\r\n * @file src/nvenc/win/impl/nvenc_d3d11_on_cuda.cpp\r\n * @brief Definitions for CUDA NVENC encoder with Direct3D11 i"
},
{
"path": "src/nvenc/win/impl/nvenc_d3d11_on_cuda.h",
"chars": 2674,
"preview": "/**\r\n * @file src/nvenc/win/impl/nvenc_d3d11_on_cuda.h\r\n * @brief Declarations for CUDA NVENC encoder with Direct3D11 in"
},
{
"path": "src/nvenc/win/impl/nvenc_dynamic_factory_1100.cpp",
"chars": 2753,
"preview": "\r\nnamespace nvenc_1100 {\r\n enum NV_ENC_VUI_VIDEO_FORMAT {\r\n NV_ENC_VUI_VIDEO_FORMAT_COMPONENT = 0,\r\n NV_ENC_VUI_V"
},
{
"path": "src/nvenc/win/impl/nvenc_dynamic_factory_1100.h",
"chars": 130,
"preview": "#pragma once\r\n\r\n#undef NVENC_FACTORY_VERSION\r\n#define NVENC_FACTORY_VERSION 1100\r\n\r\n#include \"nvenc_dynamic_factory_blue"
},
{
"path": "src/nvenc/win/impl/nvenc_dynamic_factory_1200.cpp",
"chars": 75,
"preview": "#define NVENC_FACTORY_DEFINITION\r\n#include \"nvenc_dynamic_factory_1200.h\"\r\n"
},
{
"path": "src/nvenc/win/impl/nvenc_dynamic_factory_1200.h",
"chars": 130,
"preview": "#pragma once\r\n\r\n#undef NVENC_FACTORY_VERSION\r\n#define NVENC_FACTORY_VERSION 1200\r\n\r\n#include \"nvenc_dynamic_factory_blue"
},
{
"path": "src/nvenc/win/impl/nvenc_dynamic_factory_1202.cpp",
"chars": 75,
"preview": "#define NVENC_FACTORY_DEFINITION\r\n#include \"nvenc_dynamic_factory_1202.h\"\r\n"
},
{
"path": "src/nvenc/win/impl/nvenc_dynamic_factory_1202.h",
"chars": 130,
"preview": "#pragma once\r\n\r\n#undef NVENC_FACTORY_VERSION\r\n#define NVENC_FACTORY_VERSION 1202\r\n\r\n#include \"nvenc_dynamic_factory_blue"
},
{
"path": "src/nvenc/win/impl/nvenc_dynamic_factory_blueprint.h",
"chars": 2106,
"preview": "/**\r\n * @file src/nvenc/win/impl/nvenc_dynamic_factory_blueprint.h\r\n * @brief Special blueprint used for declaring and d"
},
{
"path": "src/nvenc/win/impl/nvenc_shared_dll.h",
"chars": 552,
"preview": "/**\r\n * @file src/nvenc/win/impl/nvenc_shared_dll.h\r\n * @brief Declarations for Windows HMODULE RAII helpers.\r\n */\r\n#pra"
},
{
"path": "src/nvenc/win/nvenc_d3d11.h",
"chars": 563,
"preview": "/**\r\n * @file src/nvenc/win/nvenc_d3d11.h\r\n * @brief Declarations for Direct3D11 NVENC encoder interface.\r\n */\r\n#pragma "
},
{
"path": "src/nvenc/win/nvenc_dynamic_factory.cpp",
"chars": 4653,
"preview": "/**\r\n * @file src/nvenc/win/nvenc_dynamic_factory.cpp\r\n * @brief Definitions for Windows NVENC encoder factory.\r\n */\r\n#i"
}
]
// ... and 386 more files (download for full content)
About this extraction
This page contains the full source code of the qiin2333/foundation-sunshine GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 586 files (6.2 MB), approximately 1.7M tokens, and a symbol index with 3004 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.