From 5d1a6791f77048718e887d3393375045c571f7a2 Mon Sep 17 00:00:00 2001 From: Yury Date: Wed, 4 Jan 2023 22:31:59 +0200 Subject: [PATCH] Add VBAQ option (#1336) * Add VBAQ option to AMF * Add VBAQ to VAAPI --- alvr/dashboard/js/app/nls/settings.js | 4 ++++ alvr/server/cpp/alvr_server/Settings.cpp | 1 + alvr/server/cpp/alvr_server/Settings.h | 1 + alvr/server/cpp/platform/linux/EncodePipelineVAAPI.cpp | 2 +- alvr/server/cpp/platform/win32/VideoEncoderVCE.cpp | 4 ++-- alvr/server/src/connection.rs | 1 + alvr/session/src/lib.rs | 1 + alvr/session/src/settings.rs | 2 ++ 8 files changed, 13 insertions(+), 3 deletions(-) diff --git a/alvr/dashboard/js/app/nls/settings.js b/alvr/dashboard/js/app/nls/settings.js index a849d53f01..d10f8ede40 100644 --- a/alvr/dashboard/js/app/nls/settings.js +++ b/alvr/dashboard/js/app/nls/settings.js @@ -85,6 +85,10 @@ define({ "Specifies the entropy coding method (h264 only). CABAC - provides better quality at lower bitrate, but may increase the encoder/decoder latency, CAVLC - provides worse quality that can be compensated with higher bitrate, and may significantly decrease encoder/decoder latency.", "_root_video_entropyCoding_cabac-choice-.name": "CABAC", "_root_video_entropyCoding_cavlc-choice-.name": "CAVLC", + "_root_video_advancedCodecOptions_amfControls_enableVbaq.name": + "Enable VBAQ", + "_root_video_advancedCodecOptions_amfControls_enableVbaq.description": + "Enables Variance Based Adaptive Quantization (VBAQ) that allocates more bits to smooth areas (gradients, solid colors), but picture details may suffer from compression artifacts.", "_root_video_advancedCodecOptions_amfControls_usePreproc.name": "Enable Pre-Processor component", "_root_video_advancedCodecOptions_amfControls_usePreproc.description": diff --git a/alvr/server/cpp/alvr_server/Settings.cpp b/alvr/server/cpp/alvr_server/Settings.cpp index 57ce520063..f82a42b197 100644 --- a/alvr/server/cpp/alvr_server/Settings.cpp +++ b/alvr/server/cpp/alvr_server/Settings.cpp @@ -100,6 +100,7 @@ void Settings::Load() m_adaptiveBitrateDownRate = (int)config.get("bitrate_down_rate").get(); m_adaptiveBitrateLightLoadThreshold = config.get("bitrate_light_load_threshold").get(); m_use10bitEncoder = config.get("use_10bit_encoder").get(); + m_enableVbaq = config.get("enable_vbaq").get(); m_usePreproc = config.get("use_preproc").get(); m_preProcSigma = (uint32_t)config.get("preproc_sigma").get(); m_preProcTor = (uint32_t)config.get("preproc_tor").get(); diff --git a/alvr/server/cpp/alvr_server/Settings.h b/alvr/server/cpp/alvr_server/Settings.h index 9bd76174e4..4cd23985d0 100644 --- a/alvr/server/cpp/alvr_server/Settings.h +++ b/alvr/server/cpp/alvr_server/Settings.h @@ -74,6 +74,7 @@ class Settings uint64_t m_adaptiveBitrateDownRate; float m_adaptiveBitrateLightLoadThreshold; bool m_use10bitEncoder; + bool m_enableVbaq; bool m_usePreproc; uint32_t m_preProcSigma; uint32_t m_preProcTor; diff --git a/alvr/server/cpp/platform/linux/EncodePipelineVAAPI.cpp b/alvr/server/cpp/platform/linux/EncodePipelineVAAPI.cpp index 361b7f565a..f429df6170 100644 --- a/alvr/server/cpp/platform/linux/EncodePipelineVAAPI.cpp +++ b/alvr/server/cpp/platform/linux/EncodePipelineVAAPI.cpp @@ -161,7 +161,7 @@ alvr::EncodePipelineVAAPI::EncodePipelineVAAPI(std::vector& input_frame vlVaQualityBits quality = {}; quality.valid_setting = 1; - quality.vbaq_mode = 1; //No noticable performance difference and should improve subjective quality by allocating more bits to smooth areas + quality.vbaq_mode = Settings::Instance().m_enableVbaq; //No noticable performance difference and should improve subjective quality by allocating more bits to smooth areas switch (settings.m_encoderQualityPreset) { case ALVR_QUALITY: diff --git a/alvr/server/cpp/platform/win32/VideoEncoderVCE.cpp b/alvr/server/cpp/platform/win32/VideoEncoderVCE.cpp index b7ddf7370d..93e1e6be72 100644 --- a/alvr/server/cpp/platform/win32/VideoEncoderVCE.cpp +++ b/alvr/server/cpp/platform/win32/VideoEncoderVCE.cpp @@ -195,7 +195,7 @@ amf::AMFComponentPtr VideoEncoderVCE::MakeEncoder( } //No noticable performance difference and should improve subjective quality by allocating more bits to smooth areas - amfEncoder->SetProperty(AMF_VIDEO_ENCODER_ENABLE_VBAQ, true); + amfEncoder->SetProperty(AMF_VIDEO_ENCODER_ENABLE_VBAQ, Settings::Instance().m_enableVbaq); //Turns Off IDR/I Frames amfEncoder->SetProperty(AMF_VIDEO_ENCODER_IDR_PERIOD, 0); @@ -256,7 +256,7 @@ amf::AMFComponentPtr VideoEncoderVCE::MakeEncoder( } //No noticable performance difference and should improve subjective quality by allocating more bits to smooth areas - amfEncoder->SetProperty(AMF_VIDEO_ENCODER_HEVC_ENABLE_VBAQ, true); + amfEncoder->SetProperty(AMF_VIDEO_ENCODER_HEVC_ENABLE_VBAQ, Settings::Instance().m_enableVbaq); //Turns Off IDR/I Frames amfEncoder->SetProperty(AMF_VIDEO_ENCODER_HEVC_NUM_GOPS_PER_IDR, 0); diff --git a/alvr/server/src/connection.rs b/alvr/server/src/connection.rs index 244f654709..6314b6f276 100644 --- a/alvr/server/src/connection.rs +++ b/alvr/server/src/connection.rs @@ -254,6 +254,7 @@ async fn client_handshake( entropy_coding: settings.video.entropy_coding as u32, refresh_rate: fps as _, use_10bit_encoder: settings.video.use_10bit_encoder, + enable_vbaq: amf_controls.enable_vbaq, use_preproc: amf_controls.use_preproc, preproc_sigma: amf_controls.preproc_sigma, preproc_tor: amf_controls.preproc_tor, diff --git a/alvr/session/src/lib.rs b/alvr/session/src/lib.rs index 88459d52f6..53e01cccdd 100644 --- a/alvr/session/src/lib.rs +++ b/alvr/session/src/lib.rs @@ -62,6 +62,7 @@ pub struct OpenvrConfig { pub codec: u32, pub refresh_rate: u32, pub use_10bit_encoder: bool, + pub enable_vbaq: bool, pub use_preproc: bool, pub preproc_sigma: u32, pub preproc_tor: u32, diff --git a/alvr/session/src/settings.rs b/alvr/session/src/settings.rs index 929d1a3119..d9910fcc45 100644 --- a/alvr/session/src/settings.rs +++ b/alvr/session/src/settings.rs @@ -114,6 +114,7 @@ pub struct NvencOverrides { #[derive(SettingsSchema, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct AmfControls { + pub enable_vbaq: bool, pub use_preproc: bool, #[schema(min = 0, max = 10)] pub preproc_sigma: u32, @@ -696,6 +697,7 @@ pub fn session_settings_default() -> SettingsDefault { enable_weighted_prediction: false, }, amf_controls: AmfControlsDefault { + enable_vbaq: false, use_preproc: false, preproc_sigma: 4, preproc_tor: 7,