Separated keyframe thresholds on the timing post-processor in start and end.

Originally committed to SVN as r235.
This commit is contained in:
Rodrigo Braz Monteiro 2006-03-21 09:24:46 +00:00
parent 87cfe62e0c
commit b4a2b33868
4 changed files with 69 additions and 47 deletions

View File

@ -69,7 +69,7 @@ Please visit http://aegisub.net to download latest version
- Added a horizontal scrollbar to shift times history. (AMZ) - Added a horizontal scrollbar to shift times history. (AMZ)
- Removed the "Help" button from Find/Replace dialog. (AMZ) - Removed the "Help" button from Find/Replace dialog. (AMZ)
- Added a bias slider to the "make times continuous" function in timing post-processor, which sets the point between the subs where the two lines will meet. (AMZ) - Added a bias slider to the "make times continuous" function in timing post-processor, which sets the point between the subs where the two lines will meet. (AMZ)
- Separated keyframe thresholds on the timing post-processor in start and end. (AMZ)
= 1.09 beta - 2006.01.16 =========================== = 1.09 beta - 2006.01.16 ===========================

View File

@ -57,18 +57,20 @@ DialogTimingProcessor::DialogTimingProcessor(wxWindow *parent,SubtitlesGrid *_gr
grid = _grid; grid = _grid;
leadInTime = Options.AsText(_T("Audio lead in")); leadInTime = Options.AsText(_T("Audio lead in"));
leadOutTime = Options.AsText(_T("Audio lead out")); leadOutTime = Options.AsText(_T("Audio lead out"));
thresOverLen = Options.AsText(_T("Timing processor key overlen thres")); thresStartBefore = Options.AsText(_T("Timing processor key start before thres"));
thresUnderLen = Options.AsText(_T("Timing processor key underlen thres")); thresStartAfter = Options.AsText(_T("Timing processor key start after thres"));
thresEndBefore = Options.AsText(_T("Timing processor key end before thres"));
thresEndAfter = Options.AsText(_T("Timing processor key end after thres"));
adjsThresTime = Options.AsText(_T("Timing processor adjascent thres")); adjsThresTime = Options.AsText(_T("Timing processor adjascent thres"));
// Lead-in/out box // Lead-in/out box
wxSizer *LeadSizer = new wxStaticBoxSizer(wxHORIZONTAL,this,_("Lead-in/Lead-out")); wxSizer *LeadSizer = new wxStaticBoxSizer(wxHORIZONTAL,this,_("Lead-in/Lead-out"));
hasLeadIn = new wxCheckBox(this,CHECK_ENABLE_LEADIN,_("Lead in:")); hasLeadIn = new wxCheckBox(this,CHECK_ENABLE_LEADIN,_("Add lead in:"));
hasLeadIn->SetToolTip(_("Enable adding of lead-ins to lines.")); hasLeadIn->SetToolTip(_("Enable adding of lead-ins to lines."));
hasLeadIn->SetValue(Options.AsBool(_T("Timing processor Enable lead-in"))); hasLeadIn->SetValue(Options.AsBool(_T("Timing processor Enable lead-in")));
leadIn = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(80,-1),0,NumValidator(&leadInTime)); leadIn = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(80,-1),0,NumValidator(&leadInTime));
leadIn->SetToolTip(_("Lead in to be added, in miliseconds.")); leadIn->SetToolTip(_("Lead in to be added, in miliseconds."));
hasLeadOut = new wxCheckBox(this,CHECK_ENABLE_LEADOUT,_("Lead out:")); hasLeadOut = new wxCheckBox(this,CHECK_ENABLE_LEADOUT,_("Add lead out:"));
hasLeadOut->SetToolTip(_("Enable adding of lead-outs to lines.")); hasLeadOut->SetToolTip(_("Enable adding of lead-outs to lines."));
hasLeadOut->SetValue(Options.AsBool(_T("Timing processor Enable lead-out"))); hasLeadOut->SetValue(Options.AsBool(_T("Timing processor Enable lead-out")));
leadOut = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(80,-1),0,NumValidator(&leadOutTime)); leadOut = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(80,-1),0,NumValidator(&leadOutTime));
@ -81,44 +83,50 @@ DialogTimingProcessor::DialogTimingProcessor(wxWindow *parent,SubtitlesGrid *_gr
// Adjascent subs sizer // Adjascent subs sizer
wxSizer *AdjascentSizer = new wxStaticBoxSizer(wxHORIZONTAL,this,_("Make adjascent subtitles continuous")); wxSizer *AdjascentSizer = new wxStaticBoxSizer(wxHORIZONTAL,this,_("Make adjascent subtitles continuous"));
wxSizer *AdjascentSizerRight = new wxBoxSizer(wxVERTICAL);
wxSizer *AdjascentSizerTop = new wxBoxSizer(wxHORIZONTAL);
wxSizer *AdjascentSizerBottom = new wxBoxSizer(wxHORIZONTAL);
adjascentBias = new wxSlider(this,-1,MID(0,int(Options.AsFloat(_T("Timing processor adjascent bias"))*100),100),0,100,wxDefaultPosition,wxSize(-1,20));
adjascentBias->SetToolTip(_T("Sets how to set the adjoining of lines. If set totally to left, it will extend start time of the second line; if totally to right, it will extend the end time of the first line."));
adjsEnable = new wxCheckBox(this,CHECK_ENABLE_ADJASCENT,_("Enable")); adjsEnable = new wxCheckBox(this,CHECK_ENABLE_ADJASCENT,_("Enable"));
adjsEnable->SetToolTip(_("Enable snapping of subtitles together if they are within a certain distance of each other.")); adjsEnable->SetToolTip(_("Enable snapping of subtitles together if they are within a certain distance of each other."));
adjsEnable->SetValue(Options.AsBool(_T("Timing processor Enable adjascent"))); adjsEnable->SetValue(Options.AsBool(_T("Timing processor Enable adjascent")));
wxStaticText *adjsThresText = new wxStaticText(this,-1,_("Threshold:"),wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE); wxStaticText *adjsThresText = new wxStaticText(this,-1,_("Threshold:"),wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE);
adjascentThres = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(60,-1),0,NumValidator(&adjsThresTime)); adjascentThres = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(60,-1),0,NumValidator(&adjsThresTime));
adjascentThres->SetToolTip(_("Maximum difference between start and end time for two subtitles to be made continuous, in miliseconds.")); adjascentThres->SetToolTip(_("Maximum difference between start and end time for two subtitles to be made continuous, in miliseconds."));
AdjascentSizerTop->Add(adjsThresText,0,wxRIGHT|wxALIGN_CENTER,5); adjascentBias = new wxSlider(this,-1,MID(0,int(Options.AsFloat(_T("Timing processor adjascent bias"))*100),100),0,100,wxDefaultPosition,wxSize(-1,20));
AdjascentSizerTop->Add(adjascentThres,0,wxRIGHT|wxEXPAND,5); adjascentBias->SetToolTip(_T("Sets how to set the adjoining of lines. If set totally to left, it will extend start time of the second line; if totally to right, it will extend the end time of the first line."));
AdjascentSizerTop->AddStretchSpacer(1);
AdjascentSizerBottom->Add(new wxStaticText(this,-1,_("Bias: Start <- "),wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE),0,wxEXPAND|wxALIGN_CENTRE,0);
AdjascentSizerBottom->Add(adjascentBias,1,wxEXPAND,0);
AdjascentSizerBottom->Add(new wxStaticText(this,-1,_(" -> End"),wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE),0,wxEXPAND|wxALIGN_CENTRE,0);
AdjascentSizerRight->Add(AdjascentSizerTop,0,wxEXPAND,0);
AdjascentSizerRight->Add(AdjascentSizerBottom,1,wxEXPAND,0);
AdjascentSizer->Add(adjsEnable,0,wxRIGHT|wxEXPAND,10); AdjascentSizer->Add(adjsEnable,0,wxRIGHT|wxEXPAND,10);
AdjascentSizer->Add(AdjascentSizerRight,1,wxEXPAND,0); AdjascentSizer->Add(adjsThresText,0,wxRIGHT|wxALIGN_CENTER,5);
AdjascentSizer->Add(adjascentThres,0,wxRIGHT|wxEXPAND,5);
AdjascentSizer->Add(new wxStaticText(this,-1,_("Bias: Start <- "),wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE),0,wxALIGN_CENTER,0);
AdjascentSizer->Add(adjascentBias,1,wxEXPAND,0);
AdjascentSizer->Add(new wxStaticText(this,-1,_(" -> End"),wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE),0,wxALIGN_CENTER,0);
// Keyframes sizer // Keyframes sizer
KeyframesSizer = new wxStaticBoxSizer(wxHORIZONTAL,this,_("Keyframe snapping")); KeyframesSizer = new wxStaticBoxSizer(wxHORIZONTAL,this,_("Keyframe snapping"));
wxSizer *KeyframesFlexSizer = new wxFlexGridSizer(2,5,5,0);
keysEnable = new wxCheckBox(this,CHECK_ENABLE_KEYFRAME,_("Enable")); keysEnable = new wxCheckBox(this,CHECK_ENABLE_KEYFRAME,_("Enable"));
keysEnable->SetToolTip(_("Enable snapping of subtitles to nearest keyframe, if distance is within threshold.")); keysEnable->SetToolTip(_("Enable snapping of subtitles to nearest keyframe, if distance is within threshold."));
keysEnable->SetValue(Options.AsBool(_T("Timing processor Enable keyframe"))); keysEnable->SetValue(Options.AsBool(_T("Timing processor Enable keyframe")));
wxStaticText *thresOver = new wxStaticText(this,-1,_("Overlength thres.:"),wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE); wxStaticText *textStartBefore = new wxStaticText(this,-1,_("Starts before thres.:"),wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE);
keysThresOver = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(60,-1),0,NumValidator(&thresOverLen)); keysStartBefore = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(60,-1),0,NumValidator(&thresStartBefore));
keysThresOver->SetToolTip(_("Threshold for 'overlength' distance, that is, starting before keyframe or ending after. In frames (inclusive).")); keysStartBefore->SetToolTip(_("Threshold for 'before start' distance, that is, how many frames a subtitle must start before a keyframe to snap to it."));
wxStaticText *thresUnder = new wxStaticText(this,-1,_("Underlength thres.:"),wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE); wxStaticText *textStartAfter = new wxStaticText(this,-1,_("Starts after thres.:"),wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE);
keysThresUnder = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(60,-1),0,NumValidator(&thresUnderLen)); keysStartAfter = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(60,-1),0,NumValidator(&thresStartAfter));
keysThresUnder->SetToolTip(_("Threshold for 'underlength' distance, that is, starting after keyframe or ending before. In frames (inclusive).")); keysStartAfter->SetToolTip(_("Threshold for 'after start' distance, that is, how many frames a subtitle must start after a keyframe to snap to it."));
KeyframesSizer->Add(keysEnable,0,wxRIGHT|wxEXPAND,10); wxStaticText *textEndBefore = new wxStaticText(this,-1,_("Ends before thres.:"),wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE);
KeyframesSizer->Add(thresOver,0,wxRIGHT|wxALIGN_CENTER,5); keysEndBefore = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(60,-1),0,NumValidator(&thresEndBefore));
KeyframesSizer->Add(keysThresOver,0,wxRIGHT|wxEXPAND,5); keysEndBefore->SetToolTip(_("Threshold for 'before end' distance, that is, how many frames a subtitle must end before a keyframe to snap to it."));
KeyframesSizer->Add(thresUnder,0,wxRIGHT|wxALIGN_CENTER,5); wxStaticText *textEndAfter = new wxStaticText(this,-1,_("Ends after thres.:"),wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE);
KeyframesSizer->Add(keysThresUnder,0,wxRIGHT|wxEXPAND,0); keysEndAfter = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(60,-1),0,NumValidator(&thresEndAfter));
keysEndAfter->SetToolTip(_("Threshold for 'after end' distance, that is, how many frames a subtitle must end after a keyframe to snap to it."));
KeyframesFlexSizer->Add(keysEnable,0,wxRIGHT|wxEXPAND,10);
KeyframesFlexSizer->Add(textStartBefore,0,wxRIGHT|wxALIGN_CENTER,5);
KeyframesFlexSizer->Add(keysStartBefore,0,wxRIGHT|wxEXPAND,5);
KeyframesFlexSizer->Add(textStartAfter,0,wxRIGHT|wxALIGN_CENTER,5);
KeyframesFlexSizer->Add(keysStartAfter,0,wxRIGHT|wxEXPAND,0);
KeyframesFlexSizer->AddStretchSpacer(1);
KeyframesFlexSizer->Add(textEndBefore,0,wxRIGHT|wxALIGN_CENTER,5);
KeyframesFlexSizer->Add(keysEndBefore,0,wxRIGHT|wxEXPAND,5);
KeyframesFlexSizer->Add(textEndAfter,0,wxRIGHT|wxALIGN_CENTER,5);
KeyframesFlexSizer->Add(keysEndAfter,0,wxRIGHT|wxEXPAND,0);
KeyframesSizer->Add(KeyframesFlexSizer,0,wxEXPAND);
KeyframesSizer->AddStretchSpacer(1); KeyframesSizer->AddStretchSpacer(1);
// Button sizer // Button sizer
@ -186,8 +194,10 @@ void DialogTimingProcessor::UpdateControls() {
// Keyframes are only available if timecodes are loaded // Keyframes are only available if timecodes are loaded
bool keysAvailable = VFR_Output.IsLoaded(); bool keysAvailable = VFR_Output.IsLoaded();
bool enableKeys = keysEnable->IsChecked() && keysAvailable; bool enableKeys = keysEnable->IsChecked() && keysAvailable;
keysThresOver->Enable(enableKeys); keysStartBefore->Enable(enableKeys);
keysThresUnder->Enable(enableKeys); keysStartAfter->Enable(enableKeys);
keysEndBefore->Enable(enableKeys);
keysEndAfter->Enable(enableKeys);
if (!keysAvailable) { if (!keysAvailable) {
keysEnable->SetValue(false); keysEnable->SetValue(false);
keysEnable->Enable(false); keysEnable->Enable(false);
@ -255,10 +265,14 @@ void DialogTimingProcessor::OnApply(wxCommandEvent &event) {
Options.SetInt(_T("Audio lead in"),temp); Options.SetInt(_T("Audio lead in"),temp);
leadOut->GetValue().ToLong(&temp); leadOut->GetValue().ToLong(&temp);
Options.SetInt(_T("Audio lead out"),temp); Options.SetInt(_T("Audio lead out"),temp);
keysThresOver->GetValue().ToLong(&temp); keysStartBefore->GetValue().ToLong(&temp);
Options.SetInt(_T("Timing processor key overlen thres"),temp); Options.SetInt(_T("Timing processor key start before thres"),temp);
keysThresUnder->GetValue().ToLong(&temp); keysStartAfter->GetValue().ToLong(&temp);
Options.SetInt(_T("Timing processor key underlen thres"),temp); Options.SetInt(_T("Timing processor key start after thres"),temp);
keysEndBefore->GetValue().ToLong(&temp);
Options.SetInt(_T("Timing processor key end before thres"),temp);
keysEndAfter->GetValue().ToLong(&temp);
Options.SetInt(_T("Timing processor key end after thres"),temp);
adjascentThres->GetValue().ToLong(&temp); adjascentThres->GetValue().ToLong(&temp);
Options.SetInt(_T("Timing processor adjascent thres"),temp); Options.SetInt(_T("Timing processor adjascent thres"),temp);
Options.SetFloat(_T("Timing processor adjascent bias"),adjascentBias->GetValue() / 100.0); Options.SetFloat(_T("Timing processor adjascent bias"),adjascentBias->GetValue() / 100.0);
@ -492,10 +506,14 @@ void DialogTimingProcessor::Process() {
AssDialogue *cur; AssDialogue *cur;
// Get variables // Get variables
long underThres = 0; long beforeStart = 0;
long overThres = 0; long afterStart = 0;
keysThresOver->GetValue().ToLong(&overThres); long beforeEnd = 0;
keysThresUnder->GetValue().ToLong(&underThres); long afterEnd = 0;
keysStartBefore->GetValue().ToLong(&beforeStart);
keysStartAfter->GetValue().ToLong(&afterStart);
keysEndBefore->GetValue().ToLong(&beforeEnd);
keysEndAfter->GetValue().ToLong(&afterEnd);
// For each row // For each row
for (int i=0;i<rows;i++) { for (int i=0;i<rows;i++) {
@ -509,14 +527,14 @@ void DialogTimingProcessor::Process() {
// Get closest for start // Get closest for start
closest = GetClosestKeyFrame(startF); closest = GetClosestKeyFrame(startF);
if ((closest > startF && closest-startF <= overThres) || (closest < startF && startF-closest <= underThres)) { if ((closest > startF && closest-startF <= beforeStart) || (closest < startF && startF-closest <= afterStart)) {
cur->Start.SetMS(VFR_Output.GetTimeAtFrame(closest,true)); cur->Start.SetMS(VFR_Output.GetTimeAtFrame(closest,true));
changed = true; changed = true;
} }
// Get closest for end // Get closest for end
closest = GetClosestKeyFrame(endF)-1; closest = GetClosestKeyFrame(endF)-1;
if ((closest > endF && closest-endF <= overThres) || (closest < endF && endF-closest <= underThres)) { if ((closest > endF && closest-endF <= beforeEnd) || (closest < endF && endF-closest <= afterEnd)) {
cur->End.SetMS(VFR_Output.GetTimeAtFrame(closest,false)); cur->End.SetMS(VFR_Output.GetTimeAtFrame(closest,false));
changed = true; changed = true;
} }

View File

@ -62,8 +62,10 @@ private:
wxCheckBox *hasLeadOut; wxCheckBox *hasLeadOut;
wxCheckBox *keysEnable; wxCheckBox *keysEnable;
wxTextCtrl *keysThresOver; wxTextCtrl *keysStartBefore;
wxTextCtrl *keysThresUnder; wxTextCtrl *keysStartAfter;
wxTextCtrl *keysEndBefore;
wxTextCtrl *keysEndAfter;
wxCheckBox *adjsEnable; wxCheckBox *adjsEnable;
wxTextCtrl *adjascentThres; wxTextCtrl *adjascentThres;
@ -71,7 +73,7 @@ private:
wxCheckListBox *StyleList; wxCheckListBox *StyleList;
wxButton *ApplyButton; wxButton *ApplyButton;
wxString leadInTime,leadOutTime,thresOverLen,thresUnderLen,adjsThresTime; wxString leadInTime,leadOutTime,thresStartBefore,thresStartAfter,thresEndBefore,thresEndAfter,adjsThresTime;
wxArrayInt KeyFrames; wxArrayInt KeyFrames;

View File

@ -184,8 +184,10 @@ void OptionsManager::LoadDefaults() {
SetInt(_T("Audio lead out"),300); SetInt(_T("Audio lead out"),300);
SetInt(_T("Audio Inactive Lines Display Mode"),1); SetInt(_T("Audio Inactive Lines Display Mode"),1);
SetInt(_T("Timing processor key overlen thres"),5); SetInt(_T("Timing processor key start before thres"),5);
SetInt(_T("Timing processor key underlen thres"),4); SetInt(_T("Timing processor key start after thres"),4);
SetInt(_T("Timing processor key end before thres"),5);
SetInt(_T("Timing processor key end after thres"),6);
SetInt(_T("Timing processor adjascent thres"),300); SetInt(_T("Timing processor adjascent thres"),300);
SetBool(_T("Timing processor Enable lead-in"),true); SetBool(_T("Timing processor Enable lead-in"),true);
SetBool(_T("Timing processor Enable lead-out"),true); SetBool(_T("Timing processor Enable lead-out"),true);