From 0943ea2cf654d590c612848c7af4f5593df3e0b1 Mon Sep 17 00:00:00 2001 From: Alex Luccisano Date: Mon, 3 Nov 2025 10:54:05 -0500 Subject: [PATCH] plugins: Apply multitrack dynamic bitrate flag Enable the `OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE` capability on the encoders that support it. --- plugins/mac-videotoolbox/encoder.c | 2 +- plugins/obs-ffmpeg/texture-amf.cpp | 18 ++++++++++++------ plugins/obs-nvenc/nvenc-compat.c | 21 ++++++++++++--------- plugins/obs-nvenc/nvenc.c | 18 ++++++++++++------ 4 files changed, 37 insertions(+), 22 deletions(-) diff --git a/plugins/mac-videotoolbox/encoder.c b/plugins/mac-videotoolbox/encoder.c index ad923eefa..ca084ac6e 100644 --- a/plugins/mac-videotoolbox/encoder.c +++ b/plugins/mac-videotoolbox/encoder.c @@ -1447,7 +1447,7 @@ void obs_module_post_load(void) .get_defaults2 = vt_defaults, .get_extra_data = vt_extra_data, .free_type_data = vt_free_type_data, - .caps = OBS_ENCODER_CAP_DYN_BITRATE, + .caps = OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE, }; da_init(vt_prores_hardware_encoder_list); diff --git a/plugins/obs-ffmpeg/texture-amf.cpp b/plugins/obs-ffmpeg/texture-amf.cpp index 789bf2fc1..39c29ea59 100644 --- a/plugins/obs-ffmpeg/texture-amf.cpp +++ b/plugins/obs-ffmpeg/texture-amf.cpp @@ -1758,12 +1758,14 @@ static void register_avc() amf_encoder_info.get_defaults = amf_avc_defaults; amf_encoder_info.get_properties = amf_avc_properties; amf_encoder_info.get_extra_data = amf_extra_data; - amf_encoder_info.caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI; + amf_encoder_info.caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | + OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | OBS_ENCODER_CAP_ROI; obs_register_encoder(&amf_encoder_info); amf_encoder_info.id = "h264_fallback_amf"; - amf_encoder_info.caps = OBS_ENCODER_CAP_INTERNAL | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI; + amf_encoder_info.caps = OBS_ENCODER_CAP_INTERNAL | OBS_ENCODER_CAP_DYN_BITRATE | + OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | OBS_ENCODER_CAP_ROI; amf_encoder_info.encode_texture = nullptr; amf_encoder_info.create = amf_avc_create_fallback; amf_encoder_info.encode = amf_encode_fallback; @@ -2160,12 +2162,14 @@ static void register_hevc() amf_encoder_info.get_defaults = amf_hevc_defaults; amf_encoder_info.get_properties = amf_hevc_properties; amf_encoder_info.get_extra_data = amf_extra_data; - amf_encoder_info.caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI; + amf_encoder_info.caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | + OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | OBS_ENCODER_CAP_ROI; obs_register_encoder(&amf_encoder_info); amf_encoder_info.id = "h265_fallback_amf"; - amf_encoder_info.caps = OBS_ENCODER_CAP_INTERNAL | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI; + amf_encoder_info.caps = OBS_ENCODER_CAP_INTERNAL | OBS_ENCODER_CAP_DYN_BITRATE | + OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | OBS_ENCODER_CAP_ROI; amf_encoder_info.encode_texture = nullptr; amf_encoder_info.create = amf_hevc_create_fallback; amf_encoder_info.encode = amf_encode_fallback; @@ -2576,12 +2580,14 @@ static void register_av1() amf_encoder_info.get_defaults = amf_av1_defaults; amf_encoder_info.get_properties = amf_av1_properties; amf_encoder_info.get_extra_data = amf_extra_data; - amf_encoder_info.caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI; + amf_encoder_info.caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | + OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | OBS_ENCODER_CAP_ROI; obs_register_encoder(&amf_encoder_info); amf_encoder_info.id = "av1_fallback_amf"; - amf_encoder_info.caps = OBS_ENCODER_CAP_INTERNAL | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI; + amf_encoder_info.caps = OBS_ENCODER_CAP_INTERNAL | OBS_ENCODER_CAP_DYN_BITRATE | + OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | OBS_ENCODER_CAP_ROI; amf_encoder_info.encode_texture = nullptr; amf_encoder_info.create = amf_av1_create_fallback; amf_encoder_info.encode = amf_encode_fallback; diff --git a/plugins/obs-nvenc/nvenc-compat.c b/plugins/obs-nvenc/nvenc-compat.c index 24ec152a6..658da370c 100644 --- a/plugins/obs-nvenc/nvenc-compat.c +++ b/plugins/obs-nvenc/nvenc-compat.c @@ -299,8 +299,8 @@ struct obs_encoder_info compat_h264_nvenc_info = { .id = "jim_nvenc", .codec = "h264", .type = OBS_ENCODER_VIDEO, - .caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI | - OBS_ENCODER_CAP_DEPRECATED, + .caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | + OBS_ENCODER_CAP_ROI | OBS_ENCODER_CAP_DEPRECATED, .get_name = h264_nvenc_get_name, .create = h264_nvenc_create, .destroy = fake_nvenc_destroy, @@ -314,8 +314,8 @@ struct obs_encoder_info compat_hevc_nvenc_info = { .id = "jim_hevc_nvenc", .codec = "hevc", .type = OBS_ENCODER_VIDEO, - .caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI | - OBS_ENCODER_CAP_DEPRECATED, + .caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | + OBS_ENCODER_CAP_ROI | OBS_ENCODER_CAP_DEPRECATED, .get_name = hevc_nvenc_get_name, .create = hevc_nvenc_create, .destroy = fake_nvenc_destroy, @@ -329,8 +329,8 @@ struct obs_encoder_info compat_av1_nvenc_info = { .id = "jim_av1_nvenc", .codec = "av1", .type = OBS_ENCODER_VIDEO, - .caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI | - OBS_ENCODER_CAP_DEPRECATED, + .caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | + OBS_ENCODER_CAP_ROI | OBS_ENCODER_CAP_DEPRECATED, .get_name = av1_nvenc_get_name, .create = av1_nvenc_create, .destroy = fake_nvenc_destroy, @@ -343,7 +343,8 @@ struct obs_encoder_info compat_h264_nvenc_soft_info = { .id = "obs_nvenc_h264_cuda", .codec = "h264", .type = OBS_ENCODER_VIDEO, - .caps = OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI | OBS_ENCODER_CAP_DEPRECATED, + .caps = OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | OBS_ENCODER_CAP_ROI | + OBS_ENCODER_CAP_DEPRECATED, .get_name = h264_nvenc_get_name, .create = h264_nvenc_soft_create, .destroy = fake_nvenc_destroy, @@ -357,7 +358,8 @@ struct obs_encoder_info compat_hevc_nvenc_soft_info = { .id = "obs_nvenc_hevc_cuda", .codec = "hevc", .type = OBS_ENCODER_VIDEO, - .caps = OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI | OBS_ENCODER_CAP_DEPRECATED, + .caps = OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | OBS_ENCODER_CAP_ROI | + OBS_ENCODER_CAP_DEPRECATED, .get_name = hevc_nvenc_get_name, .create = hevc_nvenc_soft_create, .destroy = fake_nvenc_destroy, @@ -371,7 +373,8 @@ struct obs_encoder_info compat_av1_nvenc_soft_info = { .id = "obs_nvenc_av1_cuda", .codec = "av1", .type = OBS_ENCODER_VIDEO, - .caps = OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI | OBS_ENCODER_CAP_DEPRECATED, + .caps = OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | OBS_ENCODER_CAP_ROI | + OBS_ENCODER_CAP_DEPRECATED, .get_name = av1_nvenc_get_name, .create = av1_nvenc_soft_create, .destroy = fake_nvenc_destroy, diff --git a/plugins/obs-nvenc/nvenc.c b/plugins/obs-nvenc/nvenc.c index 1bf714993..ad6e5caa9 100644 --- a/plugins/obs-nvenc/nvenc.c +++ b/plugins/obs-nvenc/nvenc.c @@ -1395,7 +1395,8 @@ struct obs_encoder_info h264_nvenc_info = { .id = "obs_nvenc_h264_tex", .codec = "h264", .type = OBS_ENCODER_VIDEO, - .caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI, + .caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | + OBS_ENCODER_CAP_ROI, .get_name = h264_nvenc_get_name, .create = h264_nvenc_create, .destroy = nvenc_destroy, @@ -1416,7 +1417,8 @@ struct obs_encoder_info hevc_nvenc_info = { .id = "obs_nvenc_hevc_tex", .codec = "hevc", .type = OBS_ENCODER_VIDEO, - .caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI, + .caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | + OBS_ENCODER_CAP_ROI, .get_name = hevc_nvenc_get_name, .create = hevc_nvenc_create, .destroy = nvenc_destroy, @@ -1437,7 +1439,8 @@ struct obs_encoder_info av1_nvenc_info = { .id = "obs_nvenc_av1_tex", .codec = "av1", .type = OBS_ENCODER_VIDEO, - .caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI, + .caps = OBS_ENCODER_CAP_PASS_TEXTURE | OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | + OBS_ENCODER_CAP_ROI, .get_name = av1_nvenc_get_name, .create = av1_nvenc_create, .destroy = nvenc_destroy, @@ -1456,7 +1459,8 @@ struct obs_encoder_info h264_nvenc_soft_info = { .id = "obs_nvenc_h264_soft", .codec = "h264", .type = OBS_ENCODER_VIDEO, - .caps = OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI | OBS_ENCODER_CAP_INTERNAL, + .caps = OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | OBS_ENCODER_CAP_ROI | + OBS_ENCODER_CAP_INTERNAL, .get_name = h264_nvenc_soft_get_name, .create = h264_nvenc_soft_create, .destroy = nvenc_destroy, @@ -1474,7 +1478,8 @@ struct obs_encoder_info hevc_nvenc_soft_info = { .id = "obs_nvenc_hevc_soft", .codec = "hevc", .type = OBS_ENCODER_VIDEO, - .caps = OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI | OBS_ENCODER_CAP_INTERNAL, + .caps = OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | OBS_ENCODER_CAP_ROI | + OBS_ENCODER_CAP_INTERNAL, .get_name = hevc_nvenc_soft_get_name, .create = hevc_nvenc_soft_create, .destroy = nvenc_destroy, @@ -1492,7 +1497,8 @@ struct obs_encoder_info av1_nvenc_soft_info = { .id = "obs_nvenc_av1_soft", .codec = "av1", .type = OBS_ENCODER_VIDEO, - .caps = OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI | OBS_ENCODER_CAP_INTERNAL, + .caps = OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE | OBS_ENCODER_CAP_ROI | + OBS_ENCODER_CAP_INTERNAL, .get_name = av1_nvenc_soft_get_name, .create = av1_nvenc_soft_create, .destroy = nvenc_destroy,