Quellcode durchsuchen

UI: Re-arrange multitrack-video schema to version 2024-06-04

Co-authored-by: Ruwen Hahn <[email protected]>
Andrew Francis vor 1 Jahr
Ursprung
Commit
14d2c80560

+ 11 - 10
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();

+ 21 - 42
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<GamingFeatures> gaming_features;
 	System system;
 	optional<std::vector<Gpu>> gpu;
 
-	NLOHMANN_DEFINE_TYPE_INTRUSIVE(Capabilities, client, cpu, memory,
+	NLOHMANN_DEFINE_TYPE_INTRUSIVE(Capabilities, cpu, memory,
 				       gaming_features, system, gpu)
 };
 
 struct Preferences {
 	optional<uint64_t> maximum_aggregate_bitrate;
 	optional<uint32_t> 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<media_frames_per_second> framerate;
 	optional<obs_scale_type> 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<typename T> struct EncoderConfiguration {
-	T config;
-	json data;
-
-	friend void to_json(nlohmann::json &nlohmann_json_j,
-			    const EncoderConfiguration<T> &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<T> &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<EncoderConfiguration<AudioEncoderConfiguration>> live;
-	std::vector<EncoderConfiguration<AudioEncoderConfiguration>> vod;
+	std::vector<AudioEncoderConfiguration> live;
+	std::vector<AudioEncoderConfiguration> vod;
 
 	NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(AudioConfigurations, live,
 						    vod)
@@ -309,8 +289,7 @@ struct Config {
 	Meta meta;
 	optional<Status> status;
 	std::vector<IngestEndpoint> ingest_endpoints;
-	std::vector<EncoderConfiguration<VideoEncoderConfiguration>>
-		encoder_configurations;
+	std::vector<VideoEncoderConfiguration> encoder_configurations;
 	AudioConfigurations audio_configurations;
 
 	NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Config, meta, status,

+ 13 - 16
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);

+ 11 - 2
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