From 3974e42a86665521c477ab0c1dfc0af1a28bede1 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Tue, 29 Jan 2019 21:29:21 +0100 Subject: [PATCH] Split cue padding into separate in and out settings. --- futatabi/flags.cpp | 24 ++++++++---- futatabi/flags.h | 6 ++- futatabi/mainwindow.cpp | 85 +++++++++++++++++++++++++++++------------ futatabi/mainwindow.h | 3 +- futatabi/mainwindow.ui | 52 +++++++++++++++++++------ futatabi/state.proto | 3 +- 6 files changed, 125 insertions(+), 48 deletions(-) diff --git a/futatabi/flags.cpp b/futatabi/flags.cpp index c5bc722..fa1fe6e 100644 --- a/futatabi/flags.cpp +++ b/futatabi/flags.cpp @@ -17,8 +17,9 @@ enum LongOption { OPTION_SLOW_DOWN_INPUT = 1001, OPTION_HTTP_PORT = 1002, OPTION_TALLY_URL = 1003, - OPTION_CUE_POINT_PADDING = 1004, - OPTION_MIDI_MAPPING = 1005 + OPTION_CUE_IN_POINT_PADDING = 1004, + OPTION_CUE_OUT_POINT_PADDING = 1005, + OPTION_MIDI_MAPPING = 1006 }; void usage() @@ -37,7 +38,8 @@ void usage() fprintf(stderr, " 2 = default (realtime 720p on fast embedded GPUs)\n"); fprintf(stderr, " 3 = good (realtime 720p on GTX 970 or so)\n"); fprintf(stderr, " 4 = best (not realtime on any current GPU)\n"); - fprintf(stderr, " --cue-point-padding SECS move cue-in/cue-out N seconds earlier/later on set\n"); + fprintf(stderr, " --cue-in-point-padding SECS move cue-in N seconds earlier on set\n"); + fprintf(stderr, " --cue-out-point-padding SECS move cue-out N seconds later on set\n"); fprintf(stderr, " -d, --working-directory DIR where to store frames and database\n"); fprintf(stderr, " --http-port PORT which port to listen on for output\n"); fprintf(stderr, " --tally-url URL URL to get tally color from (polled every 100 ms)\n"); @@ -56,7 +58,8 @@ void parse_flags(int argc, char *const argv[]) { "working-directory", required_argument, 0, 'd' }, { "http-port", required_argument, 0, OPTION_HTTP_PORT }, { "tally-url", required_argument, 0, OPTION_TALLY_URL }, - { "cue-point-padding", required_argument, 0, OPTION_CUE_POINT_PADDING }, + { "cue-in-point-padding", required_argument, 0, OPTION_CUE_IN_POINT_PADDING }, + { "cue-out-point-padding", required_argument, 0, OPTION_CUE_OUT_POINT_PADDING }, { "midi-mapping", required_argument, 0, OPTION_MIDI_MAPPING }, { 0, 0, 0, 0 } }; @@ -102,9 +105,13 @@ void parse_flags(int argc, char *const argv[]) case OPTION_TALLY_URL: global_flags.tally_url = optarg; break; - case OPTION_CUE_POINT_PADDING: - global_flags.cue_point_padding_seconds = atof(optarg); - global_flags.cue_point_padding_set = true; + case OPTION_CUE_IN_POINT_PADDING: + global_flags.cue_in_point_padding_seconds = atof(optarg); + global_flags.cue_in_point_padding_set = true; + break; + case OPTION_CUE_OUT_POINT_PADDING: + global_flags.cue_out_point_padding_seconds = atof(optarg); + global_flags.cue_out_point_padding_set = true; break; case OPTION_MIDI_MAPPING: global_flags.midi_mapping_filename = optarg; @@ -125,7 +132,8 @@ void parse_flags(int argc, char *const argv[]) usage(); exit(1); } - if (global_flags.cue_point_padding_seconds < 0.0) { + if (global_flags.cue_in_point_padding_seconds < 0.0 || + global_flags.cue_out_point_padding_seconds < 0.0) { fprintf(stderr, "Cue point padding cannot be negative.\n"); usage(); exit(1); diff --git a/futatabi/flags.h b/futatabi/flags.h index 4252235..88379b5 100644 --- a/futatabi/flags.h +++ b/futatabi/flags.h @@ -15,8 +15,10 @@ struct Flags { uint16_t http_port = DEFAULT_HTTPD_PORT; double output_framerate = 60000.0 / 1001.0; std::string tally_url; - double cue_point_padding_seconds = 0.0; // Can be changed in the menus. - bool cue_point_padding_set = false; + double cue_in_point_padding_seconds = 0.0; // Can be changed in the menus. + bool cue_in_point_padding_set = false; + double cue_out_point_padding_seconds = 0.0; // Can be changed in the menus. + bool cue_out_point_padding_set = false; std::string midi_mapping_filename; // Empty for none. }; extern Flags global_flags; diff --git a/futatabi/mainwindow.cpp b/futatabi/mainwindow.cpp index 84b855a..a559293 100644 --- a/futatabi/mainwindow.cpp +++ b/futatabi/mainwindow.cpp @@ -65,8 +65,11 @@ MainWindow::MainWindow() global_flags.interpolation_quality = settings.interpolation_quality() - 1; } } - if (!global_flags.cue_point_padding_set) { - global_flags.cue_point_padding_seconds = settings.cue_point_padding_seconds(); // Default 0 is fine. + if (!global_flags.cue_in_point_padding_set) { + global_flags.cue_in_point_padding_seconds = settings.cue_in_point_padding_seconds(); // Default 0 is fine. + } + if (!global_flags.cue_out_point_padding_set) { + global_flags.cue_out_point_padding_seconds = settings.cue_out_point_padding_seconds(); // Default 0 is fine. } if (global_flags.interpolation_quality == 0) { // Allocate something just for simplicity; we won't be using it @@ -115,27 +118,49 @@ MainWindow::MainWindow() connect(ui->quality_3_action, &QAction::toggled, bind(&MainWindow::quality_toggled, this, 3, _1)); connect(ui->quality_4_action, &QAction::toggled, bind(&MainWindow::quality_toggled, this, 4, _1)); - // The cue point padding group. - QActionGroup *padding_group = new QActionGroup(ui->interpolation_menu); - padding_group->addAction(ui->padding_0_action); - padding_group->addAction(ui->padding_1_action); - padding_group->addAction(ui->padding_2_action); - padding_group->addAction(ui->padding_5_action); - if (global_flags.cue_point_padding_seconds <= 1e-3) { - ui->padding_0_action->setChecked(true); - } else if (fabs(global_flags.cue_point_padding_seconds - 1.0) < 1e-3) { - ui->padding_1_action->setChecked(true); - } else if (fabs(global_flags.cue_point_padding_seconds - 2.0) < 1e-3) { - ui->padding_2_action->setChecked(true); - } else if (fabs(global_flags.cue_point_padding_seconds - 5.0) < 1e-3) { - ui->padding_5_action->setChecked(true); + // The cue-in point padding group. + QActionGroup *in_padding_group = new QActionGroup(ui->in_padding_menu); + in_padding_group->addAction(ui->in_padding_0_action); + in_padding_group->addAction(ui->in_padding_1_action); + in_padding_group->addAction(ui->in_padding_2_action); + in_padding_group->addAction(ui->in_padding_5_action); + if (global_flags.cue_in_point_padding_seconds <= 1e-3) { + ui->in_padding_0_action->setChecked(true); + } else if (fabs(global_flags.cue_in_point_padding_seconds - 1.0) < 1e-3) { + ui->in_padding_1_action->setChecked(true); + } else if (fabs(global_flags.cue_in_point_padding_seconds - 2.0) < 1e-3) { + ui->in_padding_2_action->setChecked(true); + } else if (fabs(global_flags.cue_in_point_padding_seconds - 5.0) < 1e-3) { + ui->in_padding_5_action->setChecked(true); + } else { + // Nothing to check, which is fine. + } + connect(ui->in_padding_0_action, &QAction::toggled, bind(&MainWindow::in_padding_toggled, this, 0.0, _1)); + connect(ui->in_padding_1_action, &QAction::toggled, bind(&MainWindow::in_padding_toggled, this, 1.0, _1)); + connect(ui->in_padding_2_action, &QAction::toggled, bind(&MainWindow::in_padding_toggled, this, 2.0, _1)); + connect(ui->in_padding_5_action, &QAction::toggled, bind(&MainWindow::in_padding_toggled, this, 5.0, _1)); + + // Same for the cue-out padding. + QActionGroup *out_padding_group = new QActionGroup(ui->out_padding_menu); + out_padding_group->addAction(ui->out_padding_0_action); + out_padding_group->addAction(ui->out_padding_1_action); + out_padding_group->addAction(ui->out_padding_2_action); + out_padding_group->addAction(ui->out_padding_5_action); + if (global_flags.cue_out_point_padding_seconds <= 1e-3) { + ui->out_padding_0_action->setChecked(true); + } else if (fabs(global_flags.cue_out_point_padding_seconds - 1.0) < 1e-3) { + ui->out_padding_1_action->setChecked(true); + } else if (fabs(global_flags.cue_out_point_padding_seconds - 2.0) < 1e-3) { + ui->out_padding_2_action->setChecked(true); + } else if (fabs(global_flags.cue_out_point_padding_seconds - 5.0) < 1e-3) { + ui->out_padding_5_action->setChecked(true); } else { // Nothing to check, which is fine. } - connect(ui->padding_0_action, &QAction::toggled, bind(&MainWindow::padding_toggled, this, 0.0, _1)); - connect(ui->padding_1_action, &QAction::toggled, bind(&MainWindow::padding_toggled, this, 1.0, _1)); - connect(ui->padding_2_action, &QAction::toggled, bind(&MainWindow::padding_toggled, this, 2.0, _1)); - connect(ui->padding_5_action, &QAction::toggled, bind(&MainWindow::padding_toggled, this, 5.0, _1)); + connect(ui->out_padding_0_action, &QAction::toggled, bind(&MainWindow::out_padding_toggled, this, 0.0, _1)); + connect(ui->out_padding_1_action, &QAction::toggled, bind(&MainWindow::out_padding_toggled, this, 1.0, _1)); + connect(ui->out_padding_2_action, &QAction::toggled, bind(&MainWindow::out_padding_toggled, this, 2.0, _1)); + connect(ui->out_padding_5_action, &QAction::toggled, bind(&MainWindow::out_padding_toggled, this, 5.0, _1)); global_disk_space_estimator = new DiskSpaceEstimator(bind(&MainWindow::report_disk_space, this, _1, _2)); disk_free_label = new QLabel(this); @@ -324,7 +349,7 @@ void MainWindow::cue_in_clicked() cliplist_clips->mutable_back()->pts_in = current_pts; } else { Clip clip; - clip.pts_in = max(current_pts - lrint(global_flags.cue_point_padding_seconds * TIMEBASE), 0); + clip.pts_in = max(current_pts - lrint(global_flags.cue_in_point_padding_seconds * TIMEBASE), 0); cliplist_clips->add_clip(clip); playlist_selection_changed(); } @@ -343,7 +368,7 @@ void MainWindow::cue_out_clicked() return; } - cliplist_clips->mutable_back()->pts_out = current_pts + lrint(global_flags.cue_point_padding_seconds * TIMEBASE); + cliplist_clips->mutable_back()->pts_out = current_pts + lrint(global_flags.cue_out_point_padding_seconds * TIMEBASE); // Select the item so that we can jog it. ui->clip_list->setFocus(); @@ -609,7 +634,8 @@ void MainWindow::save_settings() { SettingsProto settings; settings.set_interpolation_quality(global_flags.interpolation_quality + 1); - settings.set_cue_point_padding_seconds(global_flags.cue_point_padding_seconds); + settings.set_cue_in_point_padding_seconds(global_flags.cue_in_point_padding_seconds); + settings.set_cue_out_point_padding_seconds(global_flags.cue_out_point_padding_seconds); db.store_settings(settings); } @@ -1130,12 +1156,21 @@ void MainWindow::quality_toggled(int quality, bool checked) save_settings(); } -void MainWindow::padding_toggled(double seconds, bool checked) +void MainWindow::in_padding_toggled(double seconds, bool checked) +{ + if (!checked) { + return; + } + global_flags.cue_in_point_padding_seconds = seconds; + save_settings(); +} + +void MainWindow::out_padding_toggled(double seconds, bool checked) { if (!checked) { return; } - global_flags.cue_point_padding_seconds = seconds; + global_flags.cue_out_point_padding_seconds = seconds; save_settings(); } diff --git a/futatabi/mainwindow.h b/futatabi/mainwindow.h index 5fd0954..2eeacc3 100644 --- a/futatabi/mainwindow.h +++ b/futatabi/mainwindow.h @@ -177,7 +177,8 @@ private: void undo_triggered(); void redo_triggered(); void quality_toggled(int quality, bool checked); - void padding_toggled(double seconds, bool checked); + void in_padding_toggled(double seconds, bool checked); + void out_padding_toggled(double seconds, bool checked); void highlight_camera_input(int stream_idx); void enable_or_disable_preview_button(); diff --git a/futatabi/mainwindow.ui b/futatabi/mainwindow.ui index addfbe2..c94b58c 100644 --- a/futatabi/mainwindow.ui +++ b/futatabi/mainwindow.ui @@ -379,17 +379,27 @@ - + - Cue point &padding + Cue &in point padding - - - - + + + + + + + + Cue &out point padding + + + + + - + + @@ -494,7 +504,7 @@ Best (&4) (not realtime on any current GPU) - + true @@ -502,7 +512,7 @@ &0 seconds - + true @@ -510,7 +520,7 @@ &1 second - + true @@ -518,7 +528,7 @@ &2 seconds - + true @@ -531,6 +541,26 @@ Setup MIDI controller… + + + &0 seconds + + + + + &1 seconds + + + + + &2 seconds + + + + + &5 seconds + + diff --git a/futatabi/state.proto b/futatabi/state.proto index 36a9fa0..ea996b7 100644 --- a/futatabi/state.proto +++ b/futatabi/state.proto @@ -21,5 +21,6 @@ message StateProto { message SettingsProto { int32 interpolation_quality = 1; // 0 = unset, 1 = quality 0, 2 = quality 1, etc. - double cue_point_padding_seconds = 2; + double cue_in_point_padding_seconds = 2; + double cue_out_point_padding_seconds = 3; } -- 2.39.2