diff --git a/UI/goliveapi-postdata.cpp b/UI/goliveapi-postdata.cpp index 090fec75d..27a62e0dd 100644 --- a/UI/goliveapi-postdata.cpp +++ b/UI/goliveapi-postdata.cpp @@ -14,29 +14,30 @@ constructGoLivePost(QString streamKey, { GoLiveApi::PostData post_data{}; post_data.service = "IVS"; - post_data.schema_version = "2023-05-10"; + post_data.schema_version = "2024-06-04"; post_data.authentication = streamKey.toStdString(); system_info(post_data.capabilities); - auto &client = post_data.capabilities.client; + auto &client = post_data.client; client.name = "obs-studio"; client.version = obs_get_version_string(); - client.vod_track_audio = vod_track_enabled; + + auto &preferences = post_data.preferences; + preferences.vod_track_audio = vod_track_enabled; obs_video_info ovi; if (obs_get_video_info(&ovi)) { - client.width = ovi.output_width; - client.height = ovi.output_height; - client.fps_numerator = ovi.fps_num; - client.fps_denominator = ovi.fps_den; + preferences.width = ovi.output_width; + preferences.height = ovi.output_height; + preferences.framerate.numerator = ovi.fps_num; + preferences.framerate.denominator = ovi.fps_den; - client.canvas_width = ovi.base_width; - client.canvas_height = ovi.base_height; + preferences.canvas_width = ovi.base_width; + preferences.canvas_height = ovi.base_height; } - auto &preferences = post_data.preferences; if (maximum_aggregate_bitrate.has_value()) preferences.maximum_aggregate_bitrate = maximum_aggregate_bitrate.value(); diff --git a/UI/models/multitrack-video.hpp b/UI/models/multitrack-video.hpp index 00045ebad..4999bd391 100644 --- a/UI/models/multitrack-video.hpp +++ b/UI/models/multitrack-video.hpp @@ -109,18 +109,8 @@ using json = nlohmann::json; struct Client { string name = "obs-studio"; string version; - bool vod_track_audio; - uint32_t width; - uint32_t height; - uint32_t fps_numerator; - uint32_t fps_denominator; - uint32_t canvas_width; - uint32_t canvas_height; - NLOHMANN_DEFINE_TYPE_INTRUSIVE(Client, name, version, vod_track_audio, - width, height, fps_numerator, - fps_denominator, canvas_width, - canvas_height) + NLOHMANN_DEFINE_TYPE_INTRUSIVE(Client, name, version) }; struct Cpu { @@ -182,23 +172,30 @@ struct System { }; struct Capabilities { - Client client; Cpu cpu; Memory memory; optional gaming_features; System system; optional> gpu; - NLOHMANN_DEFINE_TYPE_INTRUSIVE(Capabilities, client, cpu, memory, + NLOHMANN_DEFINE_TYPE_INTRUSIVE(Capabilities, cpu, memory, gaming_features, system, gpu) }; struct Preferences { optional maximum_aggregate_bitrate; optional maximum_video_tracks; + bool vod_track_audio; + uint32_t width; + uint32_t height; + media_frames_per_second framerate; + uint32_t canvas_width; + uint32_t canvas_height; NLOHMANN_DEFINE_TYPE_INTRUSIVE(Preferences, maximum_aggregate_bitrate, - maximum_video_tracks) + maximum_video_tracks, vod_track_audio, + width, height, framerate, canvas_width, + canvas_height) }; struct PostData { @@ -206,11 +203,12 @@ struct PostData { string schema_version; string authentication; + Client client; Capabilities capabilities; Preferences preferences; NLOHMANN_DEFINE_TYPE_INTRUSIVE(PostData, service, schema_version, - authentication, capabilities, + authentication, client, capabilities, preferences) }; @@ -259,47 +257,29 @@ struct VideoEncoderConfiguration { string type; uint32_t width; uint32_t height; - uint32_t bitrate; optional framerate; optional gpu_scale_type; + json settings; NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(VideoEncoderConfiguration, type, width, height, - bitrate, framerate, - gpu_scale_type) + framerate, gpu_scale_type, + settings) }; struct AudioEncoderConfiguration { string codec; uint32_t track_id; uint32_t channels; - uint32_t bitrate; + json settings; NLOHMANN_DEFINE_TYPE_INTRUSIVE(AudioEncoderConfiguration, codec, - track_id, channels, bitrate) -}; - -template struct EncoderConfiguration { - T config; - json data; - - friend void to_json(nlohmann::json &nlohmann_json_j, - const EncoderConfiguration &nlohmann_json_t) - { - nlohmann_json_j = nlohmann_json_t.data; - to_json(nlohmann_json_j, nlohmann_json_t.config); - } - friend void from_json(const nlohmann::json &nlohmann_json_j, - EncoderConfiguration &nlohmann_json_t) - { - nlohmann_json_t.data = nlohmann_json_j; - nlohmann_json_j.get_to(nlohmann_json_t.config); - } + track_id, channels, settings) }; struct AudioConfigurations { - std::vector> live; - std::vector> vod; + std::vector live; + std::vector vod; NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(AudioConfigurations, live, vod) @@ -309,8 +289,7 @@ struct Config { Meta meta; optional status; std::vector ingest_endpoints; - std::vector> - encoder_configurations; + std::vector encoder_configurations; AudioConfigurations audio_configurations; NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Config, meta, status, diff --git a/UI/multitrack-video-output.cpp b/UI/multitrack-video-output.cpp index 09f723969..29b92f0d5 100644 --- a/UI/multitrack-video-output.cpp +++ b/UI/multitrack-video-output.cpp @@ -259,12 +259,11 @@ static bool encoder_available(const char *type) return false; } -static OBSEncoderAutoRelease create_video_encoder( - DStr &name_buffer, size_t encoder_index, - const GoLiveApi::EncoderConfiguration< - GoLiveApi::VideoEncoderConfiguration> &encoder_config) +static OBSEncoderAutoRelease +create_video_encoder(DStr &name_buffer, size_t encoder_index, + const GoLiveApi::VideoEncoderConfiguration &encoder_config) { - auto encoder_type = encoder_config.config.type.c_str(); + auto encoder_type = encoder_config.type.c_str(); if (!encoder_available(encoder_type)) { blog(LOG_ERROR, "Encoder type '%s' not available", encoder_type); @@ -276,8 +275,8 @@ static OBSEncoderAutoRelease create_video_encoder( dstr_printf(name_buffer, "multitrack video video encoder %zu", encoder_index); - OBSDataAutoRelease encoder_settings = - obs_data_create_from_json(encoder_config.data.dump().c_str()); + OBSDataAutoRelease encoder_settings = obs_data_create_from_json( + encoder_config.settings.dump().c_str()); obs_data_set_bool(encoder_settings, "disable_scenecut", true); OBSEncoderAutoRelease video_encoder = obs_video_encoder_create( @@ -301,22 +300,19 @@ static OBSEncoderAutoRelease create_video_encoder( .arg(name_buffer->array, encoder_type)); } - adjust_video_encoder_scaling(ovi, video_encoder, encoder_config.config, + adjust_video_encoder_scaling(ovi, video_encoder, encoder_config, encoder_index); - adjust_encoder_frame_rate_divisor(ovi, video_encoder, - encoder_config.config, encoder_index); + adjust_encoder_frame_rate_divisor(ovi, video_encoder, encoder_config, + encoder_index); return video_encoder; } static OBSEncoderAutoRelease create_audio_encoder(const char *name, const char *audio_encoder_id, - uint32_t audio_bitrate, + obs_data_t *settings, size_t mixer_idx) { - OBSDataAutoRelease settings = obs_data_create(); - obs_data_set_int(settings, "bitrate", audio_bitrate); - OBSEncoderAutoRelease audio_encoder = obs_audio_encoder_create( audio_encoder_id, name, settings, mixer_idx, nullptr); if (!audio_encoder) { @@ -758,10 +754,11 @@ create_audio_encoders(const GoLiveApi::Config &go_live_config, for (size_t i = 0; i < configs.size(); i++) { dstr_printf(encoder_name_buffer, "%s %zu", name_prefix, i); + OBSDataAutoRelease settings = obs_data_create_from_json( + configs[i].settings.dump().c_str()); OBSEncoderAutoRelease audio_encoder = create_audio_encoder(encoder_name_buffer->array, - audio_encoder_id, - configs[i].config.bitrate, + audio_encoder_id, settings, mixer_idx); obs_output_set_audio_encoder(output, audio_encoder, output_encoder_index); diff --git a/UI/window-basic-auto-config.cpp b/UI/window-basic-auto-config.cpp index da2ecb0cd..243dce972 100644 --- a/UI/window-basic-auto-config.cpp +++ b/UI/window-basic-auto-config.cpp @@ -456,8 +456,17 @@ bool AutoConfigStreamPage::validatePage() int multitrackVideoBitrate = 0; for (auto &encoder_config : config.encoder_configurations) { - multitrackVideoBitrate += - encoder_config.config.bitrate; + auto it = + encoder_config.settings.find("bitrate"); + if (it == encoder_config.settings.end()) + continue; + + if (!it->is_number_integer()) + continue; + + int bitrate = 0; + it->get_to(bitrate); + multitrackVideoBitrate += bitrate; } // grab a streamkey from the go live config if we can