From 869b6ed89ddb1a78590d288c72d3ceb1bde774f2 Mon Sep 17 00:00:00 2001 From: loki Date: Wed, 18 Aug 2021 20:19:15 +0200 Subject: [PATCH] Fix VAAPI with intel iGPU's --- sunshine/platform/linux/vaapi.cpp | 4 ++-- sunshine/video.cpp | 29 ++++++++++++++++++++--------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/sunshine/platform/linux/vaapi.cpp b/sunshine/platform/linux/vaapi.cpp index 363c51ad..966b6139 100644 --- a/sunshine/platform/linux/vaapi.cpp +++ b/sunshine/platform/linux/vaapi.cpp @@ -547,14 +547,14 @@ int vaapi_make_hwdevice_ctx(platf::hwdevice_t *base, AVBufferRef **hw_device_buf return 0; } -bool query(display_t::pointer display, profile_e profile) { +static bool query(display_t::pointer display, profile_e profile) { std::vector entrypoints; entrypoints.resize(maxNumEntrypoints(display)); int count; auto status = queryConfigEntrypoints(display, profile, entrypoints.data(), &count); if(status) { - BOOST_LOG(error) << "Couldn't query entrypoints for profile::H264Main "sv << va::errorStr(status); + BOOST_LOG(error) << "Couldn't query entrypoints: "sv << va::errorStr(status); return false; } entrypoints.resize(count); diff --git a/sunshine/video.cpp b/sunshine/video.cpp index 403db051..4099d5e6 100644 --- a/sunshine/video.cpp +++ b/sunshine/video.cpp @@ -237,10 +237,11 @@ public: }; enum flag_e { - DEFAULT = 0x00, - SYSTEM_MEMORY = 0x01, - H264_ONLY = 0x02, - LIMITED_GOP_SIZE = 0x04, + DEFAULT = 0x00, + PARALLEL_ENCODING = 0x01, + H264_ONLY = 0x02, // When HEVC is to heavy + LIMITED_GOP_SIZE = 0x04, // Some encoders don't like it when you have an infinite GOP_SIZE. *cough* VAAPI *cough* + SINGLE_SLICE_ONLY = 0x08, // Never use multiple slices <-- Older intel iGPU's ruin it for everyone else :P }; struct encoder_t { @@ -440,7 +441,7 @@ static encoder_t nvenc { DEFAULT, dxgi_make_hwdevice_ctx #else - SYSTEM_MEMORY, + PARALLEL_ENCODING, cuda_make_hwdevice_ctx #endif }; @@ -506,7 +507,7 @@ static encoder_t software { std::make_optional("qp"s, &config::video.qp), "libx264"s, }, - H264_ONLY | SYSTEM_MEMORY, + H264_ONLY | PARALLEL_ENCODING, nullptr }; @@ -534,7 +535,7 @@ static encoder_t vaapi { std::make_optional("qp"s, &config::video.qp), "h264_vaapi"s, }, - LIMITED_GOP_SIZE | SYSTEM_MEMORY, + LIMITED_GOP_SIZE | PARALLEL_ENCODING | SINGLE_SLICE_ONLY, vaapi_make_hwdevice_ctx }; @@ -1374,7 +1375,7 @@ void capture( auto idr_events = mail->event(mail::idr); idr_events->raise(true); - if(encoders.front().flags & SYSTEM_MEMORY) { + if(encoders.front().flags & PARALLEL_ENCODING) { capture_async(std::move(mail), config, channel_data); } else { @@ -1540,8 +1541,13 @@ retry: std::vector> configs { { encoder_t::DYNAMIC_RANGE, { 1920, 1080, 60, 1000, 1, 0, 3, 1, 1 } }, - { encoder_t::SLICE, { 1920, 1080, 60, 1000, 2, 1, 1, 0, 0 } }, }; + + if(!(encoder.flags & SINGLE_SLICE_ONLY)) { + configs.emplace_back( + std::pair { encoder_t::SLICE, { 1920, 1080, 60, 1000, 2, 1, 1, 0, 0 } }); + } + for(auto &[flag, config] : configs) { auto h264 = config; auto hevc = config; @@ -1555,6 +1561,11 @@ retry: } } + if(encoder.flags & SINGLE_SLICE_ONLY) { + encoder.h264.capabilities[encoder_t::SLICE] = false; + encoder.hevc.capabilities[encoder_t::SLICE] = false; + } + encoder.h264[encoder_t::VUI_PARAMETERS] = encoder.h264[encoder_t::VUI_PARAMETERS] && !config::sunshine.flags[config::flag::FORCE_VIDEO_HEADER_REPLACE]; encoder.hevc[encoder_t::VUI_PARAMETERS] = encoder.hevc[encoder_t::VUI_PARAMETERS] && !config::sunshine.flags[config::flag::FORCE_VIDEO_HEADER_REPLACE];