diff options
author | dec05eba <dec05eba@protonmail.com> | 2024-10-09 19:08:55 +0200 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2024-10-09 19:11:16 +0200 |
commit | 9d76b0861eb0249194e96b663fbeca60cd5bfeb0 (patch) | |
tree | 7f4746e0e6985b4ca7f590d5f0ced2a2a6fdc355 | |
parent | 61c9b4918ed81a6ad439748f8bcb1c6f9b0cf65e (diff) |
Add constant bitrate option
-rw-r--r-- | include/Config.hpp | 1 | ||||
-rw-r--r-- | include/gui/SettingsPage.hpp | 7 | ||||
-rw-r--r-- | src/Config.cpp | 3 | ||||
-rw-r--r-- | src/Overlay.cpp | 11 | ||||
-rw-r--r-- | src/gui/SettingsPage.cpp | 51 |
5 files changed, 60 insertions, 13 deletions
diff --git a/include/Config.hpp b/include/Config.hpp index 549696e..0d2c822 100644 --- a/include/Config.hpp +++ b/include/Config.hpp @@ -17,6 +17,7 @@ namespace gsr { int32_t record_area_width = 0; int32_t record_area_height = 0; int32_t fps = 60; + int32_t video_bitrate = 5000; bool merge_audio_tracks = true; std::vector<std::string> audio_tracks; std::string color_range = "limited"; diff --git a/include/gui/SettingsPage.hpp b/include/gui/SettingsPage.hpp index e9102da..4f5a7c9 100644 --- a/include/gui/SettingsPage.hpp +++ b/include/gui/SettingsPage.hpp @@ -49,8 +49,9 @@ namespace gsr { std::unique_ptr<List> create_audio_track_section(); std::unique_ptr<CheckBox> create_merge_audio_tracks_checkbox(); std::unique_ptr<Widget> create_audio_device_section(); - std::unique_ptr<ComboBox> create_video_quality_box(); - std::unique_ptr<List> create_video_quality(); + std::unique_ptr<List> create_video_quality_box(); + std::unique_ptr<Entry> create_video_bitrate_entry(); + std::unique_ptr<List> create_video_bitrate(); std::unique_ptr<ComboBox> create_color_range_box(); std::unique_ptr<List> create_color_range(); std::unique_ptr<List> create_video_quality_section(); @@ -115,6 +116,8 @@ namespace gsr { Entry *area_width_entry_ptr = nullptr; Entry *area_height_entry_ptr = nullptr; Entry *framerate_entry_ptr = nullptr; + Entry *video_bitrate_entry_ptr = nullptr; + List *video_bitrate_list_ptr = nullptr; List *audio_devices_list_ptr = nullptr; CheckBox *merge_audio_tracks_checkbox_ptr = nullptr; ComboBox *color_range_box_ptr = nullptr; diff --git a/src/Config.cpp b/src/Config.cpp index 8f28c89..2f99625 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -30,6 +30,7 @@ namespace gsr { {"streaming.record_options.record_area_width", &config.streaming_config.record_options.record_area_width}, {"streaming.record_options.record_area_height", &config.streaming_config.record_options.record_area_height}, {"streaming.record_options.fps", &config.streaming_config.record_options.fps}, + {"streaming.record_options.video_bitrate", &config.streaming_config.record_options.video_bitrate}, {"streaming.record_options.merge_audio_tracks", &config.streaming_config.record_options.merge_audio_tracks}, {"streaming.record_options.audio_track", &config.streaming_config.record_options.audio_tracks}, {"streaming.record_options.color_range", &config.streaming_config.record_options.color_range}, @@ -54,6 +55,7 @@ namespace gsr { {"record.record_options.record_area_width", &config.record_config.record_options.record_area_width}, {"record.record_options.record_area_height", &config.record_config.record_options.record_area_height}, {"record.record_options.fps", &config.record_config.record_options.fps}, + {"record.record_options.video_bitrate", &config.record_config.record_options.video_bitrate}, {"record.record_options.merge_audio_tracks", &config.record_config.record_options.merge_audio_tracks}, {"record.record_options.audio_track", &config.record_config.record_options.audio_tracks}, {"record.record_options.color_range", &config.record_config.record_options.color_range}, @@ -76,6 +78,7 @@ namespace gsr { {"replay.record_options.record_area_width", &config.replay_config.record_options.record_area_width}, {"replay.record_options.record_area_height", &config.replay_config.record_options.record_area_height}, {"replay.record_options.fps", &config.replay_config.record_options.fps}, + {"replay.record_options.video_bitrate", &config.replay_config.record_options.video_bitrate}, {"replay.record_options.merge_audio_tracks", &config.replay_config.record_options.merge_audio_tracks}, {"replay.record_options.audio_track", &config.replay_config.record_options.audio_tracks}, {"replay.record_options.color_range", &config.replay_config.record_options.color_range}, diff --git a/src/Overlay.cpp b/src/Overlay.cpp index dcd18cf..34988f1 100644 --- a/src/Overlay.cpp +++ b/src/Overlay.cpp @@ -717,6 +717,7 @@ namespace gsr { // TODO: Validate input, fallback to valid values const std::string fps = std::to_string(config->record_config.record_options.fps); + const std::string video_bitrate = std::to_string(config->record_config.record_options.video_bitrate); const std::string output_file = config->record_config.save_directory + "/Video_" + get_date_str() + "." + container_to_file_extension(config->record_config.container.c_str()); const std::string audio_tracks_merged = merge_audio_tracks(config->record_config.record_options.audio_tracks); const std::string framerate_mode = config->record_config.record_options.framerate_mode == "auto" ? "vfr" : config->record_config.record_options.framerate_mode; @@ -736,6 +737,16 @@ namespace gsr { "-o", output_file.c_str() }; + if(config->record_config.record_options.video_quality == "custom") { + args.push_back("-bm"); + args.push_back("cbr"); + args.push_back("-q"); + args.push_back(video_bitrate.c_str()); + } else { + args.push_back("-q"); + args.push_back(config->record_config.record_options.video_quality.c_str()); + } + if(config->record_config.record_options.record_area_option == "window" || config->record_config.record_options.record_area_option == "focused") { args.push_back("-s"); args.push_back(region); diff --git a/src/gui/SettingsPage.cpp b/src/gui/SettingsPage.cpp index 751102c..2e7035b 100644 --- a/src/gui/SettingsPage.cpp +++ b/src/gui/SettingsPage.cpp @@ -190,22 +190,36 @@ namespace gsr { return std::make_unique<Subsection>("Audio", std::move(audio_device_section_list), mgl::vec2f(settings_scrollable_page_ptr->get_inner_size().x, 0.0f)); } - std::unique_ptr<ComboBox> SettingsPage::create_video_quality_box() { + std::unique_ptr<List> SettingsPage::create_video_quality_box() { + auto list = std::make_unique<List>(List::Orientation::VERTICAL); + list->add_widget(std::make_unique<Label>(&get_theme().body_font, "Video quality:", get_theme().text_color)); + auto video_quality_box = std::make_unique<ComboBox>(&get_theme().body_font); + video_quality_box->add_item("Custom (Constant bitrate)", "custom"); video_quality_box->add_item("Medium", "medium"); video_quality_box->add_item("High (Recommended for live streaming)", "high"); video_quality_box->add_item("Very high (Recommended)", "very_high"); video_quality_box->add_item("Ultra", "ultra"); video_quality_box->set_selected_item("very_high"); video_quality_box_ptr = video_quality_box.get(); - return video_quality_box; + list->add_widget(std::move(video_quality_box)); + + return list; + } + + std::unique_ptr<Entry> SettingsPage::create_video_bitrate_entry() { + auto video_bitrate_entry = std::make_unique<Entry>(&get_theme().body_font, "5000", (int)(get_theme().body_font.get_character_size() * 4.0f)); + video_bitrate_entry->validate_handler = create_entry_validator_integer_in_range(1, 100000); + video_bitrate_entry_ptr = video_bitrate_entry.get(); + return video_bitrate_entry; } - std::unique_ptr<List> SettingsPage::create_video_quality() { - auto video_quality_list = std::make_unique<List>(List::Orientation::VERTICAL); - video_quality_list->add_widget(std::make_unique<Label>(&get_theme().body_font, "Video quality:", get_theme().text_color)); - video_quality_list->add_widget(create_video_quality_box()); - return video_quality_list; + std::unique_ptr<List> SettingsPage::create_video_bitrate() { + auto video_bitrate_list = std::make_unique<List>(List::Orientation::VERTICAL); + video_bitrate_list->add_widget(std::make_unique<Label>(&get_theme().body_font, "Video bitrate (kbps):", get_theme().text_color)); + video_bitrate_list->add_widget(create_video_bitrate_entry()); + video_bitrate_list_ptr = video_bitrate_list.get(); + return video_bitrate_list; } std::unique_ptr<ComboBox> SettingsPage::create_color_range_box() { @@ -226,7 +240,8 @@ namespace gsr { std::unique_ptr<List> SettingsPage::create_video_quality_section() { auto quality_list = std::make_unique<List>(List::Orientation::HORIZONTAL); - quality_list->add_widget(create_video_quality()); + quality_list->add_widget(create_video_quality_box()); + quality_list->add_widget(create_video_bitrate()); quality_list->add_widget(create_color_range()); return quality_list; } @@ -370,6 +385,13 @@ namespace gsr { restore_portal_session_list_ptr->set_visible(portal_selected); }; + video_quality_box_ptr->on_selection_changed = [this](const std::string &text, const std::string &id) { + (void)text; + const bool custom_selected = id == "custom"; + video_bitrate_list_ptr->set_visible(custom_selected); + }; + video_quality_box_ptr->on_selection_changed("Very high", "very_high"); + if(!gsr_info.supported_capture_options.monitors.empty()) record_area_box_ptr->set_selected_item(gsr_info.supported_capture_options.monitors.front().name); else if(gsr_info.supported_capture_options.portal) @@ -690,9 +712,6 @@ namespace gsr { void SettingsPage::load_common(RecordOptions &record_options) { record_area_box_ptr->set_selected_item(record_options.record_area_option); - area_width_entry_ptr->set_text(std::to_string(record_options.record_area_width)); - area_height_entry_ptr->set_text(std::to_string(record_options.record_area_height)); - framerate_entry_ptr->set_text(std::to_string(record_options.fps)); merge_audio_tracks_checkbox_ptr->set_checked(record_options.merge_audio_tracks); load_audio_tracks(record_options); @@ -718,6 +737,10 @@ namespace gsr { if(record_options.fps < 1) record_options.fps = 1; framerate_entry_ptr->set_text(std::to_string(record_options.fps)); + + if(record_options.video_bitrate < 1) + record_options.video_bitrate = 1; + video_bitrate_entry_ptr->set_text(std::to_string(record_options.video_bitrate)); } void SettingsPage::load_replay() { @@ -767,6 +790,7 @@ namespace gsr { record_options.record_area_width = atoi(area_width_entry_ptr->get_text().c_str()); record_options.record_area_height = atoi(area_height_entry_ptr->get_text().c_str()); record_options.fps = atoi(framerate_entry_ptr->get_text().c_str()); + record_options.video_bitrate = atoi(video_bitrate_entry_ptr->get_text().c_str()); record_options.merge_audio_tracks = merge_audio_tracks_checkbox_ptr->is_checked(); save_audio_tracks(record_options.audio_tracks, audio_devices_list_ptr); record_options.color_range = color_range_box_ptr->get_selected_id(); @@ -794,6 +818,11 @@ namespace gsr { record_options.fps = 1; framerate_entry_ptr->set_text("1"); } + + if(record_options.video_bitrate < 1) { + record_options.video_bitrate = 1; + video_bitrate_entry_ptr->set_text("1"); + } } void SettingsPage::save_replay() { |