mirror of
https://github.com/LizardByte/Sunshine.git
synced 2025-02-14 06:41:03 +00:00
Configure source for frame capturing on Windows
This commit is contained in:
parent
95f90501e4
commit
c3af78caaa
@ -57,6 +57,7 @@ fec_percentage = 10
|
|||||||
# If back_button_timeout < 0, then the Home/Guide button will not be emulated
|
# If back_button_timeout < 0, then the Home/Guide button will not be emulated
|
||||||
# back_button_timeout = 2000
|
# back_button_timeout = 2000
|
||||||
|
|
||||||
|
|
||||||
# The name of the audio sink used for Audio Loopback
|
# The name of the audio sink used for Audio Loopback
|
||||||
# If you do not specify this variable, pulseaudio will select the default monitor device.
|
# If you do not specify this variable, pulseaudio will select the default monitor device.
|
||||||
#
|
#
|
||||||
@ -65,6 +66,14 @@ fec_percentage = 10
|
|||||||
# audio_sink = alsa_output.pci-0000_09_00.3.analog-stereo.monitor
|
# audio_sink = alsa_output.pci-0000_09_00.3.analog-stereo.monitor
|
||||||
|
|
||||||
|
|
||||||
|
# !! Windows only !!
|
||||||
|
# You can select the video card you want to stream:
|
||||||
|
# The appropriate values can be found using the following command:
|
||||||
|
# tools\dxgi-info.exe
|
||||||
|
# adapter_name = Radeon RX 580 Series
|
||||||
|
# output_name = \\.\DISPLAY1
|
||||||
|
|
||||||
|
|
||||||
###############################################
|
###############################################
|
||||||
# FFmpeg software encoding parameters
|
# FFmpeg software encoding parameters
|
||||||
# Honestly, I have no idea what the optimal values would be.
|
# Honestly, I have no idea what the optimal values would be.
|
||||||
|
@ -23,7 +23,9 @@ video_t video {
|
|||||||
|
|
||||||
0, // hevc_mode
|
0, // hevc_mode
|
||||||
"superfast"s, // preset
|
"superfast"s, // preset
|
||||||
"zerolatency"s // tune
|
"zerolatency"s, // tune
|
||||||
|
{}, // adapter_name
|
||||||
|
{} // output_name
|
||||||
};
|
};
|
||||||
|
|
||||||
audio_t audio {};
|
audio_t audio {};
|
||||||
@ -166,6 +168,8 @@ void parse_file(const char *file) {
|
|||||||
});
|
});
|
||||||
string_f(vars, "preset", video.preset);
|
string_f(vars, "preset", video.preset);
|
||||||
string_f(vars, "tune", video.tune);
|
string_f(vars, "tune", video.tune);
|
||||||
|
string_f(vars, "adapter_name", video.adapter_name);
|
||||||
|
string_f(vars, "output_name", video.output_name);
|
||||||
|
|
||||||
string_f(vars, "pkey", nvhttp.pkey);
|
string_f(vars, "pkey", nvhttp.pkey);
|
||||||
string_f(vars, "cert", nvhttp.cert);
|
string_f(vars, "cert", nvhttp.cert);
|
||||||
|
@ -15,6 +15,9 @@ struct video_t {
|
|||||||
int hevc_mode;
|
int hevc_mode;
|
||||||
std::string preset;
|
std::string preset;
|
||||||
std::string tune;
|
std::string tune;
|
||||||
|
|
||||||
|
std::string adapter_name;
|
||||||
|
std::string output_name;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct audio_t {
|
struct audio_t {
|
||||||
|
@ -7,6 +7,9 @@
|
|||||||
#include <d3dcommon.h>
|
#include <d3dcommon.h>
|
||||||
#include <dxgi1_2.h>
|
#include <dxgi1_2.h>
|
||||||
|
|
||||||
|
#include <codecvt>
|
||||||
|
#include <sunshine/config.h>
|
||||||
|
|
||||||
#include "sunshine/main.h"
|
#include "sunshine/main.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
@ -370,16 +373,31 @@ public:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> converter;
|
||||||
|
|
||||||
|
auto adapter_name = converter.from_bytes(config::video.adapter_name);
|
||||||
|
auto output_name = converter.from_bytes(config::video.output_name);
|
||||||
|
|
||||||
for(int x = 0; factory_p->EnumAdapters1(x, &adapter_p) != DXGI_ERROR_NOT_FOUND; ++x) {
|
for(int x = 0; factory_p->EnumAdapters1(x, &adapter_p) != DXGI_ERROR_NOT_FOUND; ++x) {
|
||||||
dxgi::adapter_t adapter_tmp { adapter_p };
|
dxgi::adapter_t adapter_tmp { adapter_p };
|
||||||
|
|
||||||
|
DXGI_ADAPTER_DESC1 adapter_desc;
|
||||||
|
adapter_tmp->GetDesc1(&adapter_desc);
|
||||||
|
|
||||||
|
if(!adapter_name.empty() && adapter_desc.Description != adapter_name) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
for(int y = 0; adapter_tmp->EnumOutputs(y, &output_p) != DXGI_ERROR_NOT_FOUND; ++y) {
|
for(int y = 0; adapter_tmp->EnumOutputs(y, &output_p) != DXGI_ERROR_NOT_FOUND; ++y) {
|
||||||
dxgi::output_t output_tmp {output_p };
|
dxgi::output_t output_tmp {output_p };
|
||||||
|
|
||||||
DXGI_OUTPUT_DESC desc;
|
DXGI_OUTPUT_DESC desc;
|
||||||
output_tmp->GetDesc(&desc);
|
output_tmp->GetDesc(&desc);
|
||||||
|
|
||||||
|
if(!output_name.empty() && desc.DeviceName != output_name) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if(desc.AttachedToDesktop) {
|
if(desc.AttachedToDesktop) {
|
||||||
output = std::move(output_tmp);
|
output = std::move(output_tmp);
|
||||||
|
|
||||||
@ -443,7 +461,9 @@ public:
|
|||||||
DXGI_ADAPTER_DESC adapter_desc;
|
DXGI_ADAPTER_DESC adapter_desc;
|
||||||
adapter->GetDesc(&adapter_desc);
|
adapter->GetDesc(&adapter_desc);
|
||||||
|
|
||||||
BOOST_LOG(info)
|
auto description = converter.to_bytes(adapter_desc.Description);
|
||||||
|
BOOST_LOG(info) << std::endl
|
||||||
|
<< "Device Description : " << description << std::endl
|
||||||
<< "Device Vendor ID : 0x"sv << util::hex(adapter_desc.VendorId).to_string_view() << std::endl
|
<< "Device Vendor ID : 0x"sv << util::hex(adapter_desc.VendorId).to_string_view() << std::endl
|
||||||
<< "Device Device ID : 0x"sv << util::hex(adapter_desc.DeviceId).to_string_view() << std::endl
|
<< "Device Device ID : 0x"sv << util::hex(adapter_desc.DeviceId).to_string_view() << std::endl
|
||||||
<< "Device Video Mem : "sv << adapter_desc.DedicatedVideoMemory / 1048576 << " MiB"sv << std::endl
|
<< "Device Video Mem : "sv << adapter_desc.DedicatedVideoMemory / 1048576 << " MiB"sv << std::endl
|
||||||
|
Loading…
x
Reference in New Issue
Block a user