From 115aa6b90aeaa7c3219afb23f5b8d858b4386b8b Mon Sep 17 00:00:00 2001 From: Elia Zammuto Date: Mon, 23 Dec 2024 14:06:28 +0100 Subject: [PATCH 1/2] fix(nvenc): Enable opt-in client refresh by client --- src/nvenc/nvenc_base.cpp | 6 ++++++ src/rtsp.cpp | 2 ++ src/video.h | 2 ++ 3 files changed, 10 insertions(+) diff --git a/src/nvenc/nvenc_base.cpp b/src/nvenc/nvenc_base.cpp index b69d6f26bd6..f112a630de3 100644 --- a/src/nvenc/nvenc_base.cpp +++ b/src/nvenc/nvenc_base.cpp @@ -321,6 +321,12 @@ namespace nvenc { set_ref_frames(format_config.maxNumRefFramesInDPB, format_config.numRefL0, 5); set_minqp_if_enabled(config.min_qp_hevc); fill_h264_hevc_vui(format_config.hevcVUIParameters); + if (client_config.enableIntraRefresh == 1) { + format_config.enableIntraRefresh = 1; + format_config.singleSliceIntraRefresh = 1; + format_config.intraRefreshPeriod = 300; + format_config.intraRefreshCnt = 299; + } break; } diff --git a/src/rtsp.cpp b/src/rtsp.cpp index 0fcd4c9df41..f6b42f78483 100644 --- a/src/rtsp.cpp +++ b/src/rtsp.cpp @@ -976,6 +976,7 @@ namespace rtsp_stream { args.try_emplace("x-ml-video.configuredBitrateKbps"sv, "0"sv); args.try_emplace("x-ss-general.encryptionEnabled"sv, "0"sv); args.try_emplace("x-ss-video[0].chromaSamplingType"sv, "0"sv); + args.try_emplace("x-ss-video[0].intraRefresh"sv, "0"sv); stream::config_t config; @@ -1012,6 +1013,7 @@ namespace rtsp_stream { config.monitor.videoFormat = util::from_view(args.at("x-nv-vqos[0].bitStreamFormat"sv)); config.monitor.dynamicRange = util::from_view(args.at("x-nv-video[0].dynamicRangeMode"sv)); config.monitor.chromaSamplingType = util::from_view(args.at("x-ss-video[0].chromaSamplingType"sv)); + config.monitor.enableIntraRefresh = util::from_view(args.at("x-ss-video[0].intraRefresh"sv)); configuredBitrateKbps = util::from_view(args.at("x-ml-video.configuredBitrateKbps"sv)); } diff --git a/src/video.h b/src/video.h index 1f39764820d..3e253cc2346 100644 --- a/src/video.h +++ b/src/video.h @@ -38,6 +38,8 @@ namespace video { int dynamicRange; int chromaSamplingType; // 0 - 4:2:0, 1 - 4:4:4 + + int enableIntraRefresh; // 0 - disabled, 1 - enabled }; platf::mem_type_e From 574fdb80e336e6cd9a1c06d2068649e72a7a4b20 Mon Sep 17 00:00:00 2001 From: Elia Zammuto Date: Mon, 23 Dec 2024 14:18:29 +0100 Subject: [PATCH 2/2] fix(nvenc): Enable refresh only on supported Cards --- src/nvenc/nvenc_base.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/nvenc/nvenc_base.cpp b/src/nvenc/nvenc_base.cpp index f112a630de3..6dd72755fca 100644 --- a/src/nvenc/nvenc_base.cpp +++ b/src/nvenc/nvenc_base.cpp @@ -322,10 +322,20 @@ namespace nvenc { set_minqp_if_enabled(config.min_qp_hevc); fill_h264_hevc_vui(format_config.hevcVUIParameters); if (client_config.enableIntraRefresh == 1) { - format_config.enableIntraRefresh = 1; - format_config.singleSliceIntraRefresh = 1; - format_config.intraRefreshPeriod = 300; - format_config.intraRefreshCnt = 299; + if (get_encoder_cap(NV_ENC_CAPS_SUPPORT_INTRA_REFRESH)) { + format_config.enableIntraRefresh = 1; + format_config.intraRefreshPeriod = 300; + format_config.intraRefreshCnt = 299; + if (get_encoder_cap(NV_ENC_CAPS_SINGLE_SLICE_INTRA_REFRESH)) { + format_config.singleSliceIntraRefresh = 1; + } + else { + BOOST_LOG(warning) << "NvEnc: Single Slice Intra Refresh not supported"; + } + } + else { + BOOST_LOG(error) << "NvEnc: Client asked for intra-refresh but the encoder does not support intra-refresh"; + } } break; }