From a7e8ef87cf0cfbb4e3205eb3992cbc2d20384003 Mon Sep 17 00:00:00 2001 From: Vixea Date: Sun, 4 Feb 2024 04:47:02 -0600 Subject: [PATCH 1/2] support full 0-255 color range --- alvr/server/cpp/platform/linux/EncodePipelineNvEnc.cpp | 1 + alvr/server/cpp/platform/linux/EncodePipelineVAAPI.cpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/alvr/server/cpp/platform/linux/EncodePipelineNvEnc.cpp b/alvr/server/cpp/platform/linux/EncodePipelineNvEnc.cpp index 2c48eb1c56..8cb366d7a2 100644 --- a/alvr/server/cpp/platform/linux/EncodePipelineNvEnc.cpp +++ b/alvr/server/cpp/platform/linux/EncodePipelineNvEnc.cpp @@ -160,6 +160,7 @@ alvr::EncodePipelineNvEnc::EncodePipelineNvEnc(Renderer *render, encoder_ctx->sample_aspect_ratio = AVRational{1, 1}; encoder_ctx->max_b_frames = 0; encoder_ctx->gop_size = INT16_MAX; + encoder_ctx->color_range = AVCOL_RANGE_JPEG; auto params = FfiDynamicEncoderParams {}; params.updated = true; params.bitrate_bps = 30'000'000; diff --git a/alvr/server/cpp/platform/linux/EncodePipelineVAAPI.cpp b/alvr/server/cpp/platform/linux/EncodePipelineVAAPI.cpp index dd987cd31b..b9ef928d78 100644 --- a/alvr/server/cpp/platform/linux/EncodePipelineVAAPI.cpp +++ b/alvr/server/cpp/platform/linux/EncodePipelineVAAPI.cpp @@ -225,6 +225,7 @@ alvr::EncodePipelineVAAPI::EncodePipelineVAAPI(Renderer *render, VkContext &vk_c encoder_ctx->pix_fmt = AV_PIX_FMT_VAAPI; encoder_ctx->max_b_frames = 0; encoder_ctx->gop_size = INT_MAX; + encoder_ctx->color_range = AVCOL_RANGE_JPEG; auto params = FfiDynamicEncoderParams {}; params.updated = true; @@ -332,7 +333,7 @@ alvr::EncodePipelineVAAPI::EncodePipelineVAAPI(Renderer *render, VkContext &vk_c inputs->pad_idx = 0; inputs->next = NULL; - std::string filters = "scale_vaapi=format="; + std::string filters = "scale_vaapi=out_range=full:format="; if ((Settings::Instance().m_codec == ALVR_CODEC_HEVC || Settings::Instance().m_codec == ALVR_CODEC_AV1) && Settings::Instance().m_use10bitEncoder) { filters += "p010"; } else { From 36ef4864da918587e41d029dd7a831a8016a1138 Mon Sep 17 00:00:00 2001 From: Vixea Date: Mon, 5 Feb 2024 04:12:28 -0600 Subject: [PATCH 2/2] add amf full range --- alvr/server/cpp/platform/linux/EncodePipelineNvEnc.cpp | 2 +- alvr/server/cpp/platform/linux/EncodePipelineVAAPI.cpp | 4 ++-- alvr/server/cpp/platform/win32/VideoEncoderAMF.cpp | 9 +++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/alvr/server/cpp/platform/linux/EncodePipelineNvEnc.cpp b/alvr/server/cpp/platform/linux/EncodePipelineNvEnc.cpp index 8cb366d7a2..bf72234142 100644 --- a/alvr/server/cpp/platform/linux/EncodePipelineNvEnc.cpp +++ b/alvr/server/cpp/platform/linux/EncodePipelineNvEnc.cpp @@ -160,7 +160,7 @@ alvr::EncodePipelineNvEnc::EncodePipelineNvEnc(Renderer *render, encoder_ctx->sample_aspect_ratio = AVRational{1, 1}; encoder_ctx->max_b_frames = 0; encoder_ctx->gop_size = INT16_MAX; - encoder_ctx->color_range = AVCOL_RANGE_JPEG; + encoder_ctx->color_range = Settings::Instance().m_useFullRangeEncoding ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; auto params = FfiDynamicEncoderParams {}; params.updated = true; params.bitrate_bps = 30'000'000; diff --git a/alvr/server/cpp/platform/linux/EncodePipelineVAAPI.cpp b/alvr/server/cpp/platform/linux/EncodePipelineVAAPI.cpp index b9ef928d78..2be75b4239 100644 --- a/alvr/server/cpp/platform/linux/EncodePipelineVAAPI.cpp +++ b/alvr/server/cpp/platform/linux/EncodePipelineVAAPI.cpp @@ -225,7 +225,7 @@ alvr::EncodePipelineVAAPI::EncodePipelineVAAPI(Renderer *render, VkContext &vk_c encoder_ctx->pix_fmt = AV_PIX_FMT_VAAPI; encoder_ctx->max_b_frames = 0; encoder_ctx->gop_size = INT_MAX; - encoder_ctx->color_range = AVCOL_RANGE_JPEG; + encoder_ctx->color_range = Settings::Instance().m_useFullRangeEncoding ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; auto params = FfiDynamicEncoderParams {}; params.updated = true; @@ -333,7 +333,7 @@ alvr::EncodePipelineVAAPI::EncodePipelineVAAPI(Renderer *render, VkContext &vk_c inputs->pad_idx = 0; inputs->next = NULL; - std::string filters = "scale_vaapi=out_range=full:format="; + std::string filters = Settings::Instance().m_useFullRangeEncoding ? "scale_vaapi=out_range=full:format=" : "scale_vaapi=format="; if ((Settings::Instance().m_codec == ALVR_CODEC_HEVC || Settings::Instance().m_codec == ALVR_CODEC_AV1) && Settings::Instance().m_use10bitEncoder) { filters += "p010"; } else { diff --git a/alvr/server/cpp/platform/win32/VideoEncoderAMF.cpp b/alvr/server/cpp/platform/win32/VideoEncoderAMF.cpp index 7dc5524fc6..df21008986 100644 --- a/alvr/server/cpp/platform/win32/VideoEncoderAMF.cpp +++ b/alvr/server/cpp/platform/win32/VideoEncoderAMF.cpp @@ -222,6 +222,9 @@ amf::AMFComponentPtr VideoEncoderAMF::MakeEncoder( } } + // Enable Full Range + amfEncoder->SetProperty(AMF_VIDEO_ENCODER_FULL_RANGE_COLOR, Settings::Instance().m_useFullRangeEncoding); + //No noticable performance difference and should improve subjective quality by allocating more bits to smooth areas amfEncoder->SetProperty(AMF_VIDEO_ENCODER_ENABLE_VBAQ, Settings::Instance().m_enableVbaq); @@ -299,6 +302,9 @@ amf::AMFComponentPtr VideoEncoderAMF::MakeEncoder( } } + // Enable Full Range + amfEncoder->SetProperty(AMF_VIDEO_ENCODER_HEVC_NOMINAL_RANGE, Settings::Instance().m_useFullRangeEncoding ? AMF_VIDEO_ENCODER_HEVC_NOMINAL_RANGE_FULL : AMF_VIDEO_ENCODER_HEVC_NOMINAL_RANGE_STUDIO); + //No noticable performance difference and should improve subjective quality by allocating more bits to smooth areas amfEncoder->SetProperty(AMF_VIDEO_ENCODER_HEVC_ENABLE_VBAQ, Settings::Instance().m_enableVbaq); @@ -385,6 +391,9 @@ amf::AMFComponentPtr VideoEncoderAMF::MakeEncoder( } } + // Enable Full Range + amfEncoder->SetProperty(AMF_VIDEO_ENCODER_AV1_OUTPUT_COLOR_PROFILE, Settings::Instance().m_useFullRangeEncoding ? AMF_VIDEO_CONVERTER_COLOR_PROFILE_JPEG : AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN); + // May impact performance but improves quality in high-motion areas amfEncoder->SetProperty(AMF_VIDEO_ENCODER_AV1_HIGH_MOTION_QUALITY_BOOST, Settings::Instance().m_enableHmqb);