Overload operator int() on AssTime and remove GetMS/SetMS

Originally committed to SVN as r6123.
This commit is contained in:
Thomas Goyne 2011-12-22 21:28:51 +00:00
parent de9583004d
commit 71345af81a
37 changed files with 156 additions and 236 deletions

View file

@ -418,11 +418,7 @@ void AssDialogue::ProcessParameters(AssDialogueBlockOverride::ProcessParametersC
bool AssDialogue::CollidesWith(AssDialogue *target) { bool AssDialogue::CollidesWith(AssDialogue *target) {
if (!target) return false; if (!target) return false;
int a = Start.GetMS(); return ((Start < target->Start) ? (target->Start < End) : (Start < target->End));
int b = End.GetMS();
int c = target->Start.GetMS();
int d = target->End.GetMS();
return ((a < c) ? (c < b) : (a < d));
} }
wxString AssDialogue::GetStrippedText() const { wxString AssDialogue::GetStrippedText() const {

View file

@ -282,7 +282,7 @@ bool AssFile::CanSave() {
curdiag = dynamic_cast<AssDialogue*>(*cur); curdiag = dynamic_cast<AssDialogue*>(*cur);
if (curdiag) { if (curdiag) {
// Timed? // Timed?
if (curdiag->Start.GetMS() != 0 || curdiag->End.GetMS() != 0) return false; if (curdiag->Start != 0 || curdiag->End != 0) return false;
// Overrides? // Overrides?
curdiag->ParseASSTags(); curdiag->ParseASSTags();

View file

@ -65,7 +65,7 @@ void AssKaraoke::SetLine(AssDialogue *line, bool auto_split) {
syls.clear(); syls.clear();
Syllable syl; Syllable syl;
syl.start_time = line->Start.GetMS(); syl.start_time = line->Start;
syl.duration = 0; syl.duration = 0;
syl.tag_type = "\\k"; syl.tag_type = "\\k";
@ -133,7 +133,7 @@ void AssKaraoke::SetLine(AssDialogue *line, bool auto_split) {
line->ClearBlocks(); line->ClearBlocks();
// Normalize the syllables so that the total duration is equal to the line length // Normalize the syllables so that the total duration is equal to the line length
int end_time = active_line->End.GetMS(); int end_time = active_line->End;
int last_end = syl.start_time + syl.duration; int last_end = syl.start_time + syl.duration;
// Total duration is shorter than the line length so just extend the last // Total duration is shorter than the line length so just extend the last
@ -142,7 +142,7 @@ void AssKaraoke::SetLine(AssDialogue *line, bool auto_split) {
syls.back().duration += end_time - last_end; syls.back().duration += end_time - last_end;
else if (last_end > end_time) { else if (last_end > end_time) {
// Shrink each syllable proportionately // Shrink each syllable proportionately
int start_time = active_line->Start.GetMS(); int start_time = active_line->Start;
double scale_factor = double(end_time - start_time) / (last_end - start_time); double scale_factor = double(end_time - start_time) / (last_end - start_time);
for (size_t i = 0; i < size(); ++i) { for (size_t i = 0; i < size(); ++i) {
@ -285,8 +285,8 @@ void AssKaraoke::SplitLines(std::set<AssDialogue*> const& lines, agi::Context *c
for (iterator kit = kara.begin(); kit != kara.end(); ++kit) { for (iterator kit = kara.begin(); kit != kara.end(); ++kit) {
AssDialogue *new_line = new AssDialogue(*diag); AssDialogue *new_line = new AssDialogue(*diag);
new_line->Start.SetMS(kit->start_time); new_line->Start = kit->start_time;
new_line->End.SetMS(kit->start_time + kit->duration); new_line->End = kit->start_time + kit->duration;
new_line->Text = kit->GetText(false); new_line->Text = kit->GetText(false);
c->ass->Line.insert(it, new_line); c->ass->Line.insert(it, new_line);

View file

@ -45,7 +45,7 @@
#include "utils.h" #include "utils.h"
AssTime::AssTime(int time) { SetMS(time); } AssTime::AssTime(int time) : time(mid(0, time, 10 * 60 * 60 * 1000 - 1)) { }
void AssTime::ParseASS(wxString const& text) { void AssTime::ParseASS(wxString const& text) {
int ms = 0; int ms = 0;
@ -72,15 +72,7 @@ void AssTime::ParseASS(wxString const& text) {
// Milliseconds (includes seconds) // Milliseconds (includes seconds)
ms += AegiStringToFix(text, 3, end, text.size()); ms += AegiStringToFix(text, 3, end, text.size());
SetMS(ms); *this = AssTime(ms);
}
int AssTime::GetMS() const {
return time / 10 * 10;
}
void AssTime::SetMS(int ms) {
time = mid(0, ms, 10 * 60 * 60 * 1000 - 1);
} }
wxString AssTime::GetASSFormated (bool msPrecision) const { wxString AssTime::GetASSFormated (bool msPrecision) const {
@ -90,38 +82,6 @@ wxString AssTime::GetASSFormated (bool msPrecision) const {
return wxString::Format("%d:%02d:%02d.%02d", GetTimeHours(), GetTimeMinutes(), GetTimeSeconds(), GetTimeCentiseconds()); return wxString::Format("%d:%02d:%02d.%02d", GetTimeHours(), GetTimeMinutes(), GetTimeSeconds(), GetTimeCentiseconds());
} }
bool operator < (AssTime t1, AssTime t2) {
return t1.GetMS() < t2.GetMS();
}
bool operator > (AssTime t1, AssTime t2) {
return t1.GetMS() > t2.GetMS();
}
bool operator <= (AssTime t1, AssTime t2) {
return t1.GetMS() <= t2.GetMS();
}
bool operator >= (AssTime t1, AssTime t2) {
return t1.GetMS() >= t2.GetMS();
}
bool operator == (AssTime t1, AssTime t2) {
return t1.GetMS() == t2.GetMS();
}
bool operator != (AssTime t1, AssTime t2) {
return t1.GetMS() != t2.GetMS();
}
AssTime operator + (AssTime t1, AssTime t2) {
return AssTime(t1.GetMS() + t2.GetMS());
}
AssTime operator - (AssTime t1, AssTime t2) {
return AssTime(t1.GetMS() - t2.GetMS());
}
int AssTime::GetTimeHours() const { return time / 3600000; } int AssTime::GetTimeHours() const { return time / 3600000; }
int AssTime::GetTimeMinutes() const { return (time % 3600000) / 60000; } int AssTime::GetTimeMinutes() const { return (time % 3600000) / 60000; }
int AssTime::GetTimeSeconds() const { return (time % 60000) / 1000; } int AssTime::GetTimeSeconds() const { return (time % 60000) / 1000; }
@ -134,16 +94,12 @@ FractionalTime::FractionalTime(agi::vfr::Framerate fps, bool dropframe)
{ {
} }
wxString FractionalTime::FromAssTime(AssTime time, char sep) { wxString FractionalTime::ToSMPTE(AssTime time, char sep) {
return FromMillisecs(time.GetMS(), sep);
}
wxString FractionalTime::FromMillisecs(int64_t msec, char sep) {
int h=0, m=0, s=0, f=0; // hours, minutes, seconds, fractions int h=0, m=0, s=0, f=0; // hours, minutes, seconds, fractions
int fn = fps.FrameAtTime(msec); int fn = fps.FrameAtTime(time);
// return 00:00:00:00 // return 00:00:00:00
if (msec <= 0) { if (time <= 0) {
} }
// dropframe? // dropframe?
else if (drop) { else if (drop) {

View file

@ -54,16 +54,15 @@ class AssTime {
public: public:
AssTime(int ms = 0); AssTime(int ms = 0);
/// Get millisecond, rounded to centisecond precision
operator int() const { return time / 10 * 10; }
int GetTimeHours() const; ///< Get the hours portion of this time int GetTimeHours() const; ///< Get the hours portion of this time
int GetTimeMinutes() const; ///< Get the minutes portion of this time int GetTimeMinutes() const; ///< Get the minutes portion of this time
int GetTimeSeconds() const; ///< Get the seconds portion of this time int GetTimeSeconds() const; ///< Get the seconds portion of this time
int GetTimeMiliseconds() const; ///< Get the miliseconds portion of this time int GetTimeMiliseconds() const; ///< Get the miliseconds portion of this time
int GetTimeCentiseconds() const; ///< Get the centiseconds portion of this time int GetTimeCentiseconds() const; ///< Get the centiseconds portion of this time
/// Get millisecond, rounded to centisecond precision
int GetMS() const;
/// Sets values to milliseconds with bounds-checking
void SetMS(int ms);
/// Parse an ASS time string, leaving the time unchanged if the string is malformed /// Parse an ASS time string, leaving the time unchanged if the string is malformed
void ParseASS(wxString const& text); void ParseASS(wxString const& text);
/// Return the time as a string /// Return the time as a string
@ -71,17 +70,6 @@ public:
wxString GetASSFormated(bool ms=false) const; wxString GetASSFormated(bool ms=false) const;
}; };
// Comparison operators
bool operator == (AssTime t1, AssTime t2);
bool operator != (AssTime t1, AssTime t2);
bool operator < (AssTime t1, AssTime t2);
bool operator > (AssTime t1, AssTime t2);
bool operator <= (AssTime t1, AssTime t2);
bool operator >= (AssTime t1, AssTime t2);
// Arithmetic operators
AssTime operator + (AssTime t1, AssTime t2);
AssTime operator - (AssTime t1, AssTime t2);
/// DOCME /// DOCME
/// @class FractionalTime /// @class FractionalTime
/// @brief DOCME /// @brief DOCME
@ -101,7 +89,5 @@ public:
agi::vfr::Framerate const& FPS() const { return fps; } agi::vfr::Framerate const& FPS() const { return fps; }
/// Convert an AssTime to a SMPTE timecode /// Convert an AssTime to a SMPTE timecode
wxString FromAssTime(AssTime time, char sep=':'); wxString ToSMPTE(AssTime time, char sep=':');
/// Convert milliseconds to a SMPTE timecode
wxString FromMillisecs(int64_t msec, char sep=':');
}; };

View file

@ -1058,8 +1058,7 @@ void AudioDisplay::SetTrackCursor(int new_pos, bool show_time)
if (show_time) if (show_time)
{ {
AssTime new_label_time; AssTime new_label_time = controller->MillisecondsFromSamples(SamplesFromAbsoluteX(track_cursor_pos));
new_label_time.SetMS(controller->MillisecondsFromSamples(SamplesFromAbsoluteX(track_cursor_pos)));
track_cursor_label = new_label_time.GetASSFormated(); track_cursor_label = new_label_time.GetASSFormated();
track_cursor_label_rect.x += new_pos - old_pos; track_cursor_label_rect.x += new_pos - old_pos;
RefreshRect(track_cursor_label_rect, false); RefreshRect(track_cursor_label_rect, false);

View file

@ -427,8 +427,8 @@ void AudioTimingControllerDialogue::Commit()
context->selectionController->GetSelectedSet(sel); context->selectionController->GetSelectedSet(sel);
for (Selection::iterator sub = sel.begin(); sub != sel.end(); ++sub) for (Selection::iterator sub = sel.begin(); sub != sel.end(); ++sub)
{ {
(*sub)->Start.SetMS(new_start_ms); (*sub)->Start = new_start_ms;
(*sub)->End.SetMS(new_end_ms); (*sub)->End = new_end_ms;
} }
commit_connection.Block(); commit_connection.Block();
@ -450,7 +450,7 @@ void AudioTimingControllerDialogue::Commit()
/// like the edit box, so maybe add a way to do that which both /// like the edit box, so maybe add a way to do that which both
/// this and the edit box can use /// this and the edit box can use
Next(); Next();
if (context->selectionController->GetActiveLine()->End.GetMS() == 0) { if (context->selectionController->GetActiveLine()->End == 0) {
const int default_duration = OPT_GET("Timing/Default Duration")->GetInt(); const int default_duration = OPT_GET("Timing/Default Duration")->GetInt();
active_markers[0].SetPosition(context->audioController->SamplesFromMilliseconds(new_end_ms)); active_markers[0].SetPosition(context->audioController->SamplesFromMilliseconds(new_end_ms));
active_markers[1].SetPosition(context->audioController->SamplesFromMilliseconds(new_end_ms + default_duration)); active_markers[1].SetPosition(context->audioController->SamplesFromMilliseconds(new_end_ms + default_duration));
@ -467,10 +467,10 @@ void AudioTimingControllerDialogue::Revert()
AssTime new_start = line->Start; AssTime new_start = line->Start;
AssTime new_end = line->End; AssTime new_end = line->End;
if (new_start.GetMS() != 0 || new_end.GetMS() != 0) if (new_start != 0 || new_end != 0)
{ {
active_markers[0].SetPosition(context->audioController->SamplesFromMilliseconds(new_start.GetMS())); active_markers[0].SetPosition(context->audioController->SamplesFromMilliseconds(new_start));
active_markers[1].SetPosition(context->audioController->SamplesFromMilliseconds(new_end.GetMS())); active_markers[1].SetPosition(context->audioController->SamplesFromMilliseconds(new_end));
timing_modified = false; timing_modified = false;
UpdateSelection(); UpdateSelection();
} }
@ -558,9 +558,9 @@ void AudioTimingControllerDialogue::RegenerateInactiveLines()
if (AssDialogue *prev = dynamic_cast<AssDialogue*>(*it)) if (AssDialogue *prev = dynamic_cast<AssDialogue*>(*it))
{ {
inactive_markers.push_back(InactiveLineMarker( inactive_markers.push_back(InactiveLineMarker(
context->audioController->SamplesFromMilliseconds(prev->Start.GetMS()), true)); context->audioController->SamplesFromMilliseconds(prev->Start), true));
inactive_markers.push_back(InactiveLineMarker( inactive_markers.push_back(InactiveLineMarker(
context->audioController->SamplesFromMilliseconds(prev->End.GetMS()), false)); context->audioController->SamplesFromMilliseconds(prev->End), false));
} }
} }
break; break;
@ -574,9 +574,9 @@ void AudioTimingControllerDialogue::RegenerateInactiveLines()
if (line && line != active_line) if (line && line != active_line)
{ {
inactive_markers.push_back(InactiveLineMarker( inactive_markers.push_back(InactiveLineMarker(
context->audioController->SamplesFromMilliseconds(line->Start.GetMS()), true)); context->audioController->SamplesFromMilliseconds(line->Start), true));
inactive_markers.push_back(InactiveLineMarker( inactive_markers.push_back(InactiveLineMarker(
context->audioController->SamplesFromMilliseconds(line->End.GetMS()), false)); context->audioController->SamplesFromMilliseconds(line->End), false));
} }
} }
break; break;

View file

@ -151,8 +151,8 @@ AudioTimingControllerKaraoke::AudioTimingControllerKaraoke(agi::Context *c, AssK
, separator_pen("Colour/Audio Display/Syllable Boundaries", "Audio/Line Boundaries Thickness", wxPENSTYLE_DOT) , separator_pen("Colour/Audio Display/Syllable Boundaries", "Audio/Line Boundaries Thickness", wxPENSTYLE_DOT)
, start_pen("Colour/Audio Display/Line boundary Start", "Audio/Line Boundaries Thickness") , start_pen("Colour/Audio Display/Line boundary Start", "Audio/Line Boundaries Thickness")
, end_pen("Colour/Audio Display/Line boundary End", "Audio/Line Boundaries Thickness") , end_pen("Colour/Audio Display/Line boundary End", "Audio/Line Boundaries Thickness")
, start_marker(ToSamples(active_line->Start.GetMS()), &start_pen, AudioMarker::Feet_Right) , start_marker(ToSamples(active_line->Start), &start_pen, AudioMarker::Feet_Right)
, end_marker(ToSamples(active_line->End.GetMS()), &end_pen, AudioMarker::Feet_Left) , end_marker(ToSamples(active_line->End), &end_pen, AudioMarker::Feet_Left)
, keyframes_provider(c, "Audio/Display/Draw/Keyframes in Karaoke Mode") , keyframes_provider(c, "Audio/Display/Draw/Keyframes in Karaoke Mode")
, auto_commit(OPT_GET("Audio/Auto/Commit")->GetBool()) , auto_commit(OPT_GET("Audio/Auto/Commit")->GetBool())
, auto_next(OPT_GET("Audio/Next Line on Commit")->GetBool()) , auto_next(OPT_GET("Audio/Next Line on Commit")->GetBool())
@ -253,8 +253,8 @@ void AudioTimingControllerKaraoke::Revert() {
cur_syl = 0; cur_syl = 0;
commit_id = -1; commit_id = -1;
start_marker.Move(ToSamples(active_line->Start.GetMS())); start_marker.Move(ToSamples(active_line->Start));
end_marker.Move(ToSamples(active_line->End.GetMS())); end_marker.Move(ToSamples(active_line->End));
markers.clear(); markers.clear();
labels.clear(); labels.clear();

View file

@ -219,8 +219,8 @@ namespace Automation4 {
set_field(L, "layer", dia->Layer); set_field(L, "layer", dia->Layer);
set_field(L, "start_time", dia->Start.GetMS()); set_field(L, "start_time", dia->Start);
set_field(L, "end_time", dia->End.GetMS()); set_field(L, "end_time", dia->End);
set_field(L, "style", dia->Style); set_field(L, "style", dia->Style);
set_field(L, "actor", dia->Actor); set_field(L, "actor", dia->Actor);
@ -351,8 +351,8 @@ namespace Automation4 {
dia->Comment = get_bool_field(L, "comment", "dialogue"); dia->Comment = get_bool_field(L, "comment", "dialogue");
dia->Layer = get_int_field(L, "layer", "dialogue"); dia->Layer = get_int_field(L, "layer", "dialogue");
dia->Start.SetMS(get_int_field(L, "start_time", "dialogue")); dia->Start = get_int_field(L, "start_time", "dialogue");
dia->End.SetMS(get_int_field(L, "end_time", "dialogue")); dia->End = get_int_field(L, "end_time", "dialogue");
dia->Style = get_string_field(L, "style", "dialogue"); dia->Style = get_string_field(L, "style", "dialogue");
dia->Actor = get_string_field(L, "actor", "dialogue"); dia->Actor = get_string_field(L, "actor", "dialogue");
dia->Margin[0] = get_int_field(L, "margin_l", "dialogue"); dia->Margin[0] = get_int_field(L, "margin_l", "dialogue");

View file

@ -604,8 +604,8 @@ void BaseGrid::GetRowStrings(int row, AssDialogue *line, bool *paint_columns, wx
if (paint_columns[0]) strings[0] = wxString::Format("%d", row + 1); if (paint_columns[0]) strings[0] = wxString::Format("%d", row + 1);
if (paint_columns[1]) strings[1] = wxString::Format("%d", line->Layer); if (paint_columns[1]) strings[1] = wxString::Format("%d", line->Layer);
if (byFrame) { if (byFrame) {
if (paint_columns[2]) strings[2] = wxString::Format("%d", context->videoController->FrameAtTime(line->Start.GetMS(), agi::vfr::START)); if (paint_columns[2]) strings[2] = wxString::Format("%d", context->videoController->FrameAtTime(line->Start, agi::vfr::START));
if (paint_columns[3]) strings[3] = wxString::Format("%d", context->videoController->FrameAtTime(line->End.GetMS(), agi::vfr::END)); if (paint_columns[3]) strings[3] = wxString::Format("%d", context->videoController->FrameAtTime(line->End, agi::vfr::END));
} }
else { else {
if (paint_columns[2]) strings[2] = line->Start.GetASSFormated(); if (paint_columns[2]) strings[2] = line->Start.GetASSFormated();
@ -737,7 +737,7 @@ void BaseGrid::OnMouseEvent(wxMouseEvent &event) {
// Normal click // Normal click
if ((click || dclick) && !shift && !ctrl && !alt) { if ((click || dclick) && !shift && !ctrl && !alt) {
SetActiveLine(dlg); SetActiveLine(dlg);
if (dclick) context->videoController->JumpToTime(dlg->Start.GetMS()); if (dclick) context->videoController->JumpToTime(dlg->Start);
SelectRow(row,false); SelectRow(row,false);
lastRow = row; lastRow = row;
return; return;
@ -887,8 +887,8 @@ void BaseGrid::SetColumnWidths() {
// Times // Times
if (byFrame) { if (byFrame) {
maxStart = std::max(maxStart, context->videoController->FrameAtTime(curDiag->Start.GetMS(), agi::vfr::START)); maxStart = std::max(maxStart, context->videoController->FrameAtTime(curDiag->Start, agi::vfr::START));
maxEnd = std::max(maxEnd, context->videoController->FrameAtTime(curDiag->End.GetMS(), agi::vfr::END)); maxEnd = std::max(maxEnd, context->videoController->FrameAtTime(curDiag->End, agi::vfr::END));
} }
} }
@ -970,8 +970,8 @@ bool BaseGrid::IsDisplayed(const AssDialogue *line) const {
if (!context->videoController->IsLoaded()) return false; if (!context->videoController->IsLoaded()) return false;
int frame = context->videoController->GetFrameN(); int frame = context->videoController->GetFrameN();
return return
context->videoController->FrameAtTime(line->Start.GetMS(),agi::vfr::START) <= frame && context->videoController->FrameAtTime(line->Start,agi::vfr::START) <= frame &&
context->videoController->FrameAtTime(line->End.GetMS(),agi::vfr::END) >= frame; context->videoController->FrameAtTime(line->End,agi::vfr::END) >= frame;
} }
void BaseGrid::OnKeyDown(wxKeyEvent &event) { void BaseGrid::OnKeyDown(wxKeyEvent &event) {

View file

@ -212,8 +212,8 @@ struct audio_save_clip : public Command {
for (Selection::iterator it = sel.begin(); it != sel.end(); ++it) { for (Selection::iterator it = sel.begin(); it != sel.end(); ++it) {
c->audioController->SaveClip( c->audioController->SaveClip(
wxFileSelector(_("Save audio clip"), "", "", "wav", "", wxFD_SAVE|wxFD_OVERWRITE_PROMPT, c->parent), wxFileSelector(_("Save audio clip"), "", "", "wav", "", wxFD_SAVE|wxFD_OVERWRITE_PROMPT, c->parent),
SampleRange(c->audioController->SamplesFromMilliseconds((*it)->Start.GetMS()), SampleRange(c->audioController->SamplesFromMilliseconds((*it)->Start),
c->audioController->SamplesFromMilliseconds((*it)->End.GetMS()))); c->audioController->SamplesFromMilliseconds((*it)->End)));
} }
} }
}; };

View file

@ -185,7 +185,7 @@ static void combine_lines(agi::Context *c, void (*combiner)(AssDialogue *, AssDi
combiner(first, diag); combiner(first, diag);
first->End.SetMS(diag->End.GetMS()); first->End = diag->End;
delete diag; delete diag;
} }
@ -198,7 +198,7 @@ static void combine_lines(agi::Context *c, void (*combiner)(AssDialogue *, AssDi
} }
static void combine_karaoke(AssDialogue *first, AssDialogue *second) { static void combine_karaoke(AssDialogue *first, AssDialogue *second) {
first->Text += wxString::Format("{\\k%d}%s", (second->Start.GetMS() - first->End.GetMS()) / 10, second->Text); first->Text += wxString::Format("{\\k%d}%s", (second->Start - first->End) / 10, second->Text);
} }
static void combine_concat(AssDialogue *first, AssDialogue *second) { static void combine_concat(AssDialogue *first, AssDialogue *second) {

View file

@ -128,8 +128,8 @@ static void insert_subtitle_at_video(agi::Context *c, bool after) {
// Create line to add // Create line to add
AssDialogue *def = new AssDialogue; AssDialogue *def = new AssDialogue;
int video_ms = c->videoController->TimeAtFrame(c->videoController->GetFrameN(), agi::vfr::START); int video_ms = c->videoController->TimeAtFrame(c->videoController->GetFrameN(), agi::vfr::START);
def->Start.SetMS(video_ms); def->Start = video_ms;
def->End.SetMS(video_ms + OPT_GET("Timing/Default Duration")->GetInt()); def->End = video_ms + OPT_GET("Timing/Default Duration")->GetInt();
def->Style = c->subsGrid->GetDialogue(n)->Style; def->Style = c->subsGrid->GetDialogue(n)->Style;
// Insert it // Insert it
@ -156,13 +156,13 @@ struct subtitle_insert_after : public validate_nonempty_selection {
if (n == nrows-1) { if (n == nrows-1) {
def->Start = c->subsGrid->GetDialogue(n)->End; def->Start = c->subsGrid->GetDialogue(n)->End;
def->End = c->subsGrid->GetDialogue(n)->End; def->End = c->subsGrid->GetDialogue(n)->End;
def->End.SetMS(def->End.GetMS()+OPT_GET("Timing/Default Duration")->GetInt()); def->End = def->End + OPT_GET("Timing/Default Duration")->GetInt();
} }
else { else {
def->Start = c->subsGrid->GetDialogue(n)->End; def->Start = c->subsGrid->GetDialogue(n)->End;
def->End = c->subsGrid->GetDialogue(n+1)->Start; def->End = c->subsGrid->GetDialogue(n+1)->Start;
} }
if (def->End.GetMS() < def->Start.GetMS()) def->End.SetMS(def->Start.GetMS()+OPT_GET("Timing/Default Duration")->GetInt()); if (def->End < def->Start) def->End = def->Start + OPT_GET("Timing/Default Duration")->GetInt();
def->Style = c->subsGrid->GetDialogue(n)->Style; def->Style = c->subsGrid->GetDialogue(n)->Style;
// Insert it // Insert it
@ -200,18 +200,18 @@ struct subtitle_insert_before : public validate_nonempty_selection {
// Create line to add // Create line to add
AssDialogue *def = new AssDialogue; AssDialogue *def = new AssDialogue;
if (n == 0) { if (n == 0) {
def->Start.SetMS(0); def->Start = 0;
def->End = c->subsGrid->GetDialogue(n)->Start; def->End = c->subsGrid->GetDialogue(n)->Start;
} }
else if (c->subsGrid->GetDialogue(n-1)->End.GetMS() > c->subsGrid->GetDialogue(n)->Start.GetMS()) { else if (c->subsGrid->GetDialogue(n-1)->End > c->subsGrid->GetDialogue(n)->Start) {
def->Start.SetMS(c->subsGrid->GetDialogue(n)->Start.GetMS()-OPT_GET("Timing/Default Duration")->GetInt()); def->Start = c->subsGrid->GetDialogue(n)->Start-OPT_GET("Timing/Default Duration")->GetInt();
def->End = c->subsGrid->GetDialogue(n)->Start; def->End = c->subsGrid->GetDialogue(n)->Start;
} }
else { else {
def->Start = c->subsGrid->GetDialogue(n-1)->End; def->Start = c->subsGrid->GetDialogue(n-1)->End;
def->End = c->subsGrid->GetDialogue(n)->Start; def->End = c->subsGrid->GetDialogue(n)->Start;
} }
if (def->End.GetMS() < def->Start.GetMS()) def->End.SetMS(def->Start.GetMS()+OPT_GET("Timing/Default Duration")->GetInt()); if (def->End < def->Start) def->End = def->Start+OPT_GET("Timing/Default Duration")->GetInt();
def->Style = c->subsGrid->GetDialogue(n)->Style; def->Style = c->subsGrid->GetDialogue(n)->Style;
// Insert it // Insert it
@ -408,8 +408,8 @@ struct subtitle_select_visible : public Command {
for (entryIter it = c->ass->Line.begin(); it != c->ass->Line.end(); ++it) { for (entryIter it = c->ass->Line.begin(); it != c->ass->Line.end(); ++it) {
AssDialogue *diag = dynamic_cast<AssDialogue*>(*it); AssDialogue *diag = dynamic_cast<AssDialogue*>(*it);
if (diag && if (diag &&
c->videoController->FrameAtTime(diag->Start.GetMS(), agi::vfr::START) <= frame && c->videoController->FrameAtTime(diag->Start, agi::vfr::START) <= frame &&
c->videoController->FrameAtTime(diag->End.GetMS(), agi::vfr::END) >= frame) c->videoController->FrameAtTime(diag->End, agi::vfr::END) >= frame)
{ {
if (new_selection.empty()) if (new_selection.empty())
c->selectionController->SetActiveLine(diag); c->selectionController->SetActiveLine(diag);

View file

@ -135,11 +135,11 @@ struct time_frame_current : public validate_video_loaded {
if (sel.empty() || !active_line) return; if (sel.empty() || !active_line) return;
int shift_by = c->videoController->TimeAtFrame(c->videoController->GetFrameN(), agi::vfr::START) - active_line->Start.GetMS(); int shift_by = c->videoController->TimeAtFrame(c->videoController->GetFrameN(), agi::vfr::START) - active_line->Start;
for (std::set<AssDialogue*>::iterator it = sel.begin(); it != sel.end(); ++it) { for (std::set<AssDialogue*>::iterator it = sel.begin(); it != sel.end(); ++it) {
(*it)->Start.SetMS((*it)->Start.GetMS() + shift_by); (*it)->Start = (*it)->Start + shift_by;
(*it)->End.SetMS((*it)->End.GetMS() + shift_by); (*it)->End = (*it)->End + shift_by;
} }
c->ass->Commit(_("shift to frame"), AssFile::COMMIT_DIAG_TIME); c->ass->Commit(_("shift to frame"), AssFile::COMMIT_DIAG_TIME);
@ -169,10 +169,10 @@ static void snap_subs_video(agi::Context *c, bool set_start) {
int end = c->videoController->TimeAtFrame(c->videoController->GetFrameN(), agi::vfr::END); int end = c->videoController->TimeAtFrame(c->videoController->GetFrameN(), agi::vfr::END);
for (std::set<AssDialogue*>::iterator it = sel.begin(); it != sel.end(); ++it) { for (std::set<AssDialogue*>::iterator it = sel.begin(); it != sel.end(); ++it) {
if (set_start || (*it)->Start.GetMS() > start) if (set_start || (*it)->Start > start)
(*it)->Start.SetMS(start); (*it)->Start = start;
if (!set_start || (*it)->End.GetMS() < end) if (!set_start || (*it)->End < end)
(*it)->End.SetMS(end); (*it)->End = end;
} }
c->ass->Commit(_("timing"), AssFile::COMMIT_DIAG_TIME); c->ass->Commit(_("timing"), AssFile::COMMIT_DIAG_TIME);
@ -235,8 +235,8 @@ struct time_snap_scene : public validate_video_loaded {
// Update rows // Update rows
for (size_t i=0;i<sel.Count();i++) { for (size_t i=0;i<sel.Count();i++) {
cur = c->subsGrid->GetDialogue(sel[i]); cur = c->subsGrid->GetDialogue(sel[i]);
cur->Start.SetMS(start_ms); cur->Start = start_ms;
cur->End.SetMS(end_ms); cur->End = end_ms;
} }
// Commit // Commit
@ -251,7 +251,7 @@ struct time_add_lead_in : public Command {
STR_HELP("Add lead in") STR_HELP("Add lead in")
void operator()(agi::Context *c) { void operator()(agi::Context *c) {
if (AssDialogue *line = c->selectionController->GetActiveLine()) { if (AssDialogue *line = c->selectionController->GetActiveLine()) {
line->Start.SetMS(line->Start.GetMS() - OPT_GET("Audio/Lead/IN")->GetInt()); line->Start = line->Start - OPT_GET("Audio/Lead/IN")->GetInt();
c->ass->Commit(_("add lead in"), AssFile::COMMIT_DIAG_TIME); c->ass->Commit(_("add lead in"), AssFile::COMMIT_DIAG_TIME);
} }
} }
@ -264,7 +264,7 @@ struct time_add_lead_out : public Command {
STR_HELP("Add lead out") STR_HELP("Add lead out")
void operator()(agi::Context *c) { void operator()(agi::Context *c) {
if (AssDialogue *line = c->selectionController->GetActiveLine()) { if (AssDialogue *line = c->selectionController->GetActiveLine()) {
line->End.SetMS(line->End.GetMS() + OPT_GET("Audio/Lead/OUT")->GetInt()); line->End = line->End + OPT_GET("Audio/Lead/OUT")->GetInt();
c->ass->Commit(_("add lead out"), AssFile::COMMIT_DIAG_TIME); c->ass->Commit(_("add lead out"), AssFile::COMMIT_DIAG_TIME);
} }
} }

View file

@ -353,13 +353,13 @@ struct video_frame_next_boundary : public validator_video_loaded {
AssDialogue *active_line = c->selectionController->GetActiveLine(); AssDialogue *active_line = c->selectionController->GetActiveLine();
if (!active_line) return; if (!active_line) return;
int target = c->videoController->FrameAtTime(active_line->Start.GetMS(), agi::vfr::START); int target = c->videoController->FrameAtTime(active_line->Start, agi::vfr::START);
if (target > c->videoController->GetFrameN()) { if (target > c->videoController->GetFrameN()) {
c->videoController->JumpToFrame(target); c->videoController->JumpToFrame(target);
return; return;
} }
target = c->videoController->FrameAtTime(active_line->End.GetMS(), agi::vfr::END); target = c->videoController->FrameAtTime(active_line->End, agi::vfr::END);
if (target > c->videoController->GetFrameN()) { if (target > c->videoController->GetFrameN()) {
c->videoController->JumpToFrame(target); c->videoController->JumpToFrame(target);
return; return;
@ -368,7 +368,7 @@ struct video_frame_next_boundary : public validator_video_loaded {
c->selectionController->NextLine(); c->selectionController->NextLine();
AssDialogue *new_line = c->selectionController->GetActiveLine(); AssDialogue *new_line = c->selectionController->GetActiveLine();
if (new_line != active_line) if (new_line != active_line)
c->videoController->JumpToTime(new_line->Start.GetMS()); c->videoController->JumpToTime(new_line->Start);
} }
}; };
@ -424,13 +424,13 @@ struct video_frame_prev_boundary : public validator_video_loaded {
AssDialogue *active_line = c->selectionController->GetActiveLine(); AssDialogue *active_line = c->selectionController->GetActiveLine();
if (!active_line) return; if (!active_line) return;
int target = c->videoController->FrameAtTime(active_line->End.GetMS(), agi::vfr::END); int target = c->videoController->FrameAtTime(active_line->End, agi::vfr::END);
if (target < c->videoController->GetFrameN()) { if (target < c->videoController->GetFrameN()) {
c->videoController->JumpToFrame(target); c->videoController->JumpToFrame(target);
return; return;
} }
target = c->videoController->FrameAtTime(active_line->Start.GetMS(), agi::vfr::START); target = c->videoController->FrameAtTime(active_line->Start, agi::vfr::START);
if (target < c->videoController->GetFrameN()) { if (target < c->videoController->GetFrameN()) {
c->videoController->JumpToFrame(target); c->videoController->JumpToFrame(target);
return; return;
@ -439,7 +439,7 @@ struct video_frame_prev_boundary : public validator_video_loaded {
c->selectionController->PrevLine(); c->selectionController->PrevLine();
AssDialogue *new_line = c->selectionController->GetActiveLine(); AssDialogue *new_line = c->selectionController->GetActiveLine();
if (new_line != active_line) if (new_line != active_line)
c->videoController->JumpToTime(new_line->End.GetMS(), agi::vfr::END); c->videoController->JumpToTime(new_line->End, agi::vfr::END);
} }
}; };
@ -560,7 +560,7 @@ struct video_jump_end : public validator_video_loaded {
void operator()(agi::Context *c) { void operator()(agi::Context *c) {
if (AssDialogue *active_line = c->selectionController->GetActiveLine()) { if (AssDialogue *active_line = c->selectionController->GetActiveLine()) {
c->videoController->JumpToTime(active_line->End.GetMS(), agi::vfr::END); c->videoController->JumpToTime(active_line->End, agi::vfr::END);
} }
} }
}; };
@ -574,7 +574,7 @@ struct video_jump_start : public validator_video_loaded {
void operator()(agi::Context *c) { void operator()(agi::Context *c) {
if (AssDialogue *active_line = c->selectionController->GetActiveLine()) { if (AssDialogue *active_line = c->selectionController->GetActiveLine()) {
c->videoController->JumpToTime(active_line->Start.GetMS()); c->videoController->JumpToTime(active_line->Start);
} }
} }
}; };

View file

@ -62,8 +62,7 @@ DialogJumpTo::DialogJumpTo(agi::Context *c)
SetIcon(BitmapToIcon(GETIMAGE(jumpto_button_24))); SetIcon(BitmapToIcon(GETIMAGE(jumpto_button_24)));
// Set initial values // Set initial values
AssTime jumptime; AssTime jumptime = c->videoController->TimeAtFrame(jumpframe);
jumptime.SetMS(c->videoController->TimeAtFrame(jumpframe));
wxString maxLength = wxString::Format("%i",c->videoController->GetLength() - 1); wxString maxLength = wxString::Format("%i",c->videoController->GetLength() - 1);
// Times // Times
@ -111,7 +110,7 @@ void DialogJumpTo::OnOK(wxCommandEvent &) {
} }
void DialogJumpTo::OnEditTime (wxCommandEvent &) { void DialogJumpTo::OnEditTime (wxCommandEvent &) {
long newframe = c->videoController->FrameAtTime(JumpTime->GetMS()); long newframe = c->videoController->FrameAtTime(JumpTime->GetTime());
if (jumpframe != newframe) { if (jumpframe != newframe) {
jumpframe = newframe; jumpframe = newframe;
JumpFrame->ChangeValue(wxString::Format("%i", jumpframe)); JumpFrame->ChangeValue(wxString::Format("%i", jumpframe));
@ -120,5 +119,5 @@ void DialogJumpTo::OnEditTime (wxCommandEvent &) {
void DialogJumpTo::OnEditFrame (wxCommandEvent &event) { void DialogJumpTo::OnEditFrame (wxCommandEvent &event) {
JumpFrame->GetValue().ToLong(&jumpframe); JumpFrame->GetValue().ToLong(&jumpframe);
JumpTime->SetMS(c->videoController->TimeAtFrame(jumpframe)); JumpTime->SetTime(c->videoController->TimeAtFrame(jumpframe));
} }

View file

@ -193,7 +193,7 @@ void DialogShiftTimes::OnClose(wxCommandEvent &) {
long shift; long shift;
shift_frames->GetValue().ToLong(&shift); shift_frames->GetValue().ToLong(&shift);
OPT_SET("Tool/Shift Times/Time")->SetInt(shift_time->GetMS()); OPT_SET("Tool/Shift Times/Time")->SetInt(shift_time->GetTime());
OPT_SET("Tool/Shift Times/Frames")->SetInt(shift); OPT_SET("Tool/Shift Times/Frames")->SetInt(shift);
OPT_SET("Tool/Shift Times/ByTime")->SetBool(shift_by_time->GetValue()); OPT_SET("Tool/Shift Times/ByTime")->SetBool(shift_by_time->GetValue());
OPT_SET("Tool/Shift Times/Type")->SetInt(time_fields->GetSelection()); OPT_SET("Tool/Shift Times/Type")->SetInt(time_fields->GetSelection());
@ -289,7 +289,7 @@ void DialogShiftTimes::Process(wxCommandEvent &) {
long shift; long shift;
if (by_time) { if (by_time) {
shift = shift_time->GetMS(); shift = shift_time->GetTime();
if (shift == 0) { if (shift == 0) {
Close(); Close();
return; return;
@ -323,9 +323,9 @@ void DialogShiftTimes::Process(wxCommandEvent &) {
block_start = row_number; block_start = row_number;
if (start) if (start)
line->Start.SetMS(Shift(line->Start.GetMS(), shift, by_time, agi::vfr::START)); line->Start = Shift(line->Start, shift, by_time, agi::vfr::START);
if (end) if (end)
line->End.SetMS(Shift(line->End.GetMS(), shift, by_time, agi::vfr::END)); line->End = Shift(line->End, shift, by_time, agi::vfr::END);
} }
context->ass->Commit(_("shifting"), AssFile::COMMIT_DIAG_TIME); context->ass->Commit(_("shifting"), AssFile::COMMIT_DIAG_TIME);

View file

@ -180,7 +180,7 @@ void DialogStyling::OnActiveLineChanged(AssDialogue *new_line) {
style_list->SetStringSelection(active_line->Style); style_list->SetStringSelection(active_line->Style);
if (auto_seek->IsChecked() && IsActive()) if (auto_seek->IsChecked() && IsActive())
c->videoController->JumpToTime(active_line->Start.GetMS()); c->videoController->JumpToTime(active_line->Start);
} }
void DialogStyling::Commit(bool next) { void DialogStyling::Commit(bool next) {
@ -201,7 +201,7 @@ void DialogStyling::OnActivate(wxActivateEvent &) {
style_list->Set(c->ass->GetStyles()); style_list->Set(c->ass->GetStyles());
if (auto_seek->IsChecked()) if (auto_seek->IsChecked())
c->videoController->JumpToTime(active_line->Start.GetMS()); c->videoController->JumpToTime(active_line->Start);
style_name->SetFocus(); style_name->SetFocus();
} }

View file

@ -299,7 +299,7 @@ void DialogTimingProcessor::OnApply(wxCommandEvent &) {
// Check if rows are valid // Check if rows are valid
for (entryIter cur = c->ass->Line.begin(); cur != c->ass->Line.end(); ++cur) { for (entryIter cur = c->ass->Line.begin(); cur != c->ass->Line.end(); ++cur) {
if (AssDialogue *tempDiag = dynamic_cast<AssDialogue*>(*cur)) { if (AssDialogue *tempDiag = dynamic_cast<AssDialogue*>(*cur)) {
if (tempDiag->Start.GetMS() > tempDiag->End.GetMS()) { if (tempDiag->Start > tempDiag->End) {
wxMessageBox( wxMessageBox(
wxString::Format( wxString::Format(
_("One of the lines in the file (%i) has negative duration. Aborting."), _("One of the lines in the file (%i) has negative duration. Aborting."),
@ -371,7 +371,7 @@ void DialogTimingProcessor::Process() {
// Compare to every previous line (yay for O(n^2)!) to see if it's OK to add lead-in // Compare to every previous line (yay for O(n^2)!) to see if it's OK to add lead-in
if (inVal) { if (inVal) {
int startLead = cur->Start.GetMS() - inVal; int startLead = cur->Start - inVal;
for (int j=0;j<i;j++) { for (int j=0;j<i;j++) {
AssDialogue *comp = Sorted[j]; AssDialogue *comp = Sorted[j];
@ -379,14 +379,14 @@ void DialogTimingProcessor::Process() {
if (cur->CollidesWith(comp)) continue; if (cur->CollidesWith(comp)) continue;
// Get comparison times // Get comparison times
startLead = std::max(startLead, comp->End.GetMS()); startLead = std::max<int>(startLead, comp->End);
} }
cur->Start.SetMS(startLead); cur->Start = startLead;
} }
// Compare to every line to see how far can lead-out be extended // Compare to every line to see how far can lead-out be extended
if (outVal) { if (outVal) {
int endLead = cur->End.GetMS() + outVal; int endLead = cur->End + outVal;
for (int j=i+1;j<rows;j++) { for (int j=i+1;j<rows;j++) {
AssDialogue *comp = Sorted[j]; AssDialogue *comp = Sorted[j];
@ -394,9 +394,9 @@ void DialogTimingProcessor::Process() {
if (cur->CollidesWith(comp)) continue; if (cur->CollidesWith(comp)) continue;
// Get comparison times // Get comparison times
endLead = std::min(endLead, comp->Start.GetMS()); endLead = std::min<int>(endLead, comp->Start);
} }
cur->End.SetMS(endLead); cur->End = endLead;
} }
} }
} }
@ -417,13 +417,11 @@ void DialogTimingProcessor::Process() {
if (cur->CollidesWith(prev)) continue; if (cur->CollidesWith(prev)) continue;
// Compare distance // Compare distance
int curStart = cur->Start.GetMS(); int dist = cur->Start - prev->End;
int prevEnd = prev->End.GetMS();
int dist = curStart-prevEnd;
if (dist > 0 && dist <= adjsThres) { if (dist > 0 && dist <= adjsThres) {
int setPos = prevEnd+int(dist*bias); int setPos = prev->End + int(dist*bias);
cur->Start.SetMS(setPos); cur->Start = setPos;
prev->End.SetMS(setPos); prev->End = setPos;
} }
prev = cur; prev = cur;
@ -449,19 +447,19 @@ void DialogTimingProcessor::Process() {
AssDialogue *cur = Sorted[i]; AssDialogue *cur = Sorted[i];
// Get start/end frames // Get start/end frames
int startF = c->videoController->FrameAtTime(cur->Start.GetMS(),agi::vfr::START); int startF = c->videoController->FrameAtTime(cur->Start,agi::vfr::START);
int endF = c->videoController->FrameAtTime(cur->End.GetMS(),agi::vfr::END); int endF = c->videoController->FrameAtTime(cur->End,agi::vfr::END);
// Get closest for start // Get closest for start
int closest = GetClosestKeyFrame(startF); int closest = GetClosestKeyFrame(startF);
if ((closest > startF && closest-startF <= beforeStart) || (closest < startF && startF-closest <= afterStart)) { if ((closest > startF && closest-startF <= beforeStart) || (closest < startF && startF-closest <= afterStart)) {
cur->Start.SetMS(c->videoController->TimeAtFrame(closest,agi::vfr::START)); cur->Start = c->videoController->TimeAtFrame(closest,agi::vfr::START);
} }
// Get closest for end // Get closest for end
closest = GetClosestKeyFrame(endF)-1; closest = GetClosestKeyFrame(endF)-1;
if ((closest > endF && closest-endF <= beforeEnd) || (closest < endF && endF-closest <= afterEnd)) { if ((closest > endF && closest-endF <= beforeEnd) || (closest < endF && endF-closest <= afterEnd)) {
cur->End.SetMS(c->videoController->TimeAtFrame(closest,agi::vfr::END)); cur->End = c->videoController->TimeAtFrame(closest,agi::vfr::END);
} }
} }
} }

View file

@ -226,7 +226,7 @@ void DialogTranslation::UpdateDisplay() {
original_text->SetReadOnly(true); original_text->SetReadOnly(true);
if (seek_video->IsChecked()) c->videoController->JumpToTime(active_line->Start.GetMS()); if (seek_video->IsChecked()) c->videoController->JumpToTime(active_line->Start);
translated_text->ClearAll(); translated_text->ClearAll();
translated_text->SetFocus(); translated_text->SetFocus();

View file

@ -176,7 +176,7 @@ void AssTransformFramerateFilter::TransformTimeTags(wxString name,int n,AssOverr
switch (curParam->classification) { switch (curParam->classification) {
case PARCLASS_RELATIVE_TIME_START: { case PARCLASS_RELATIVE_TIME_START: {
int value = instance->ConvertTime(trunc_cs(curDiag->Start.GetMS()) + parVal) - instance->newStart; int value = instance->ConvertTime(trunc_cs(curDiag->Start) + parVal) - instance->newStart;
// An end time of 0 is actually the end time of the line, so ensure // An end time of 0 is actually the end time of the line, so ensure
// nonzero is never converted to 0 // nonzero is never converted to 0
@ -188,10 +188,10 @@ void AssTransformFramerateFilter::TransformTimeTags(wxString name,int n,AssOverr
break; break;
} }
case PARCLASS_RELATIVE_TIME_END: case PARCLASS_RELATIVE_TIME_END:
curParam->Set(instance->newEnd - instance->ConvertTime(trunc_cs(curDiag->End.GetMS()) - parVal)); curParam->Set(instance->newEnd - instance->ConvertTime(trunc_cs(curDiag->End) - parVal));
break; break;
case PARCLASS_KARAOKE: { case PARCLASS_KARAOKE: {
int start = curDiag->Start.GetMS() / 10 + instance->oldK + parVal; int start = curDiag->Start / 10 + instance->oldK + parVal;
int value = (instance->ConvertTime(start * 10) - instance->newStart) / 10 - instance->newK; int value = (instance->ConvertTime(start * 10) - instance->newStart) / 10 - instance->newK;
instance->oldK += parVal; instance->oldK += parVal;
instance->newK += value; instance->newK += value;
@ -212,14 +212,14 @@ void AssTransformFramerateFilter::TransformFrameRate(AssFile *subs) {
line = curDialogue; line = curDialogue;
newK = 0; newK = 0;
oldK = 0; oldK = 0;
newStart = trunc_cs(ConvertTime(curDialogue->Start.GetMS())); newStart = trunc_cs(ConvertTime(curDialogue->Start));
newEnd = trunc_cs(ConvertTime(curDialogue->End.GetMS()) + 9); newEnd = trunc_cs(ConvertTime(curDialogue->End) + 9);
// Process stuff // Process stuff
curDialogue->ParseASSTags(); curDialogue->ParseASSTags();
curDialogue->ProcessParameters(TransformTimeTags, this); curDialogue->ProcessParameters(TransformTimeTags, this);
curDialogue->Start.SetMS(newStart); curDialogue->Start = newStart;
curDialogue->End.SetMS(newEnd); curDialogue->End = newEnd;
curDialogue->UpdateText(); curDialogue->UpdateText();
curDialogue->ClearBlocks(); curDialogue->ClearBlocks();
} }

View file

@ -96,9 +96,8 @@ static void read_subtitles(agi::ProgressSink *ps, MatroskaFile *file, MkvStdIO *
// Get start and end times // Get start and end times
longlong timecodeScaleLow = 1000000; longlong timecodeScaleLow = 1000000;
AssTime subStart,subEnd; AssTime subStart = startTime / timecodeScaleLow;
subStart.SetMS(startTime / timecodeScaleLow); AssTime subEnd = endTime / timecodeScaleLow;
subEnd.SetMS(endTime / timecodeScaleLow);
// Process SSA/ASS // Process SSA/ASS
if (!srt) { if (!srt) {

View file

@ -433,7 +433,7 @@ void SubsEditBox::OnActiveLineChanged(AssDialogue *new_line) {
if (sync) { if (sync) {
c->videoController->Stop(); c->videoController->Stop();
c->videoController->JumpToTime(line->Start.GetMS()); c->videoController->JumpToTime(line->Start);
} }
} }
SetEvtHandlerEnabled(true); SetEvtHandlerEnabled(true);

View file

@ -69,8 +69,8 @@ static void trim_text(AssDialogue *diag) {
} }
static void expand_times(AssDialogue *src, AssDialogue *dst) { static void expand_times(AssDialogue *src, AssDialogue *dst) {
dst->Start.SetMS(std::min(dst->Start.GetMS(), src->Start.GetMS())); dst->Start = std::min(dst->Start, src->Start);
dst->End.SetMS(std::max(dst->End.GetMS(), src->End.GetMS())); dst->End = std::max(dst->End, src->End);
} }
/// @brief Recombine /// @brief Recombine
@ -246,8 +246,8 @@ void SubtitlesGrid::PasteLines(int n,bool pasteOver) {
curdiag = new AssDialogue(); curdiag = new AssDialogue();
curdiag->Text = curdata; curdiag->Text = curdata;
// Make sure pasted plain-text lines always are blank-timed // Make sure pasted plain-text lines always are blank-timed
curdiag->Start.SetMS(0); curdiag->Start = 0;
curdiag->End.SetMS(0); curdiag->End = 0;
} }
// Paste over // Paste over
@ -382,9 +382,9 @@ void SubtitlesGrid::DuplicateLines(int n1,int n2,bool nextFrame) {
// Shift to next frame // Shift to next frame
if (nextFrame) { if (nextFrame) {
int posFrame = context->videoController->FrameAtTime(cur->End.GetMS(),agi::vfr::END) + 1; int posFrame = context->videoController->FrameAtTime(cur->End,agi::vfr::END) + 1;
cur->Start.SetMS(context->videoController->TimeAtFrame(posFrame,agi::vfr::START)); cur->Start = context->videoController->TimeAtFrame(posFrame,agi::vfr::START);
cur->End.SetMS(context->videoController->TimeAtFrame(posFrame,agi::vfr::END)); cur->End = context->videoController->TimeAtFrame(posFrame,agi::vfr::END);
} }
// Insert // Insert
@ -411,9 +411,9 @@ void SubtitlesGrid::SplitLine(AssDialogue *n1,int pos,bool estimateTimes) {
if (estimateTimes) { if (estimateTimes) {
double splitPos = double(pos)/orig.Length(); double splitPos = double(pos)/orig.Length();
int splitTime = (int)((n1->End.GetMS() - n1->Start.GetMS())*splitPos) + n1->Start.GetMS(); int splitTime = (int)((n1->End - n1->Start)*splitPos) + n1->Start;
n1->End.SetMS(splitTime); n1->End = splitTime;
n2->Start.SetMS(splitTime); n2->Start = splitTime;
} }
context->ass->Commit(_("split"), AssFile::COMMIT_DIAG_ADDREM | AssFile::COMMIT_DIAG_FULL); context->ass->Commit(_("split"), AssFile::COMMIT_DIAG_ADDREM | AssFile::COMMIT_DIAG_FULL);

View file

@ -76,7 +76,7 @@ void EncoreSubtitleFormat::WriteFile(wxString const& filename, wxString const& e
for (std::list<AssEntry*>::iterator cur=Line->begin();cur!=Line->end();cur++) { for (std::list<AssEntry*>::iterator cur=Line->begin();cur!=Line->end();cur++) {
if (AssDialogue *current = dynamic_cast<AssDialogue*>(*cur)) { if (AssDialogue *current = dynamic_cast<AssDialogue*>(*cur)) {
++i; ++i;
file.WriteLineToFile(wxString::Format("%i %s %s %s", i, ft.FromAssTime(current->Start, sep), ft.FromAssTime(current->End, sep), current->Text)); file.WriteLineToFile(wxString::Format("%i %s %s %s", i, ft.ToSMPTE(current->Start, sep), ft.ToSMPTE(current->End, sep), current->Text));
} }
} }

View file

@ -116,8 +116,8 @@ void MicroDVDSubtitleFormat::ReadFile(wxString const& filename, wxString const&
AssDialogue *line = new AssDialogue; AssDialogue *line = new AssDialogue;
line->group = "[Events]"; line->group = "[Events]";
line->Style = "Default"; line->Style = "Default";
line->Start.SetMS(fps.TimeAtFrame(f1, agi::vfr::START)); line->Start = fps.TimeAtFrame(f1, agi::vfr::START);
line->End.SetMS(fps.TimeAtFrame(f2, agi::vfr::END)); line->End = fps.TimeAtFrame(f2, agi::vfr::END);
line->Text = text; line->Text = text;
Line->push_back(line); Line->push_back(line);
} }
@ -146,8 +146,8 @@ void MicroDVDSubtitleFormat::WriteFile(wxString const& filename, wxString const&
// Write lines // Write lines
for (std::list<AssEntry*>::iterator cur=Line->begin();cur!=Line->end();cur++) { for (std::list<AssEntry*>::iterator cur=Line->begin();cur!=Line->end();cur++) {
if (AssDialogue *current = dynamic_cast<AssDialogue*>(*cur)) { if (AssDialogue *current = dynamic_cast<AssDialogue*>(*cur)) {
int start = fps.FrameAtTime(current->Start.GetMS(), agi::vfr::START); int start = fps.FrameAtTime(current->Start, agi::vfr::START);
int end = fps.FrameAtTime(current->End.GetMS(), agi::vfr::END); int end = fps.FrameAtTime(current->End, agi::vfr::END);
file.WriteLineToFile(wxString::Format("{%i}{%i}%s", start, end, current->Text)); file.WriteLineToFile(wxString::Format("{%i}{%i}%s", start, end, current->Text));
} }

View file

@ -350,14 +350,12 @@ allparsed:
while (ms_chars < 3) ms *= 10, ms_chars++; while (ms_chars < 3) ms *= 10, ms_chars++;
while (ms_chars > 3) ms /= 10, ms_chars--; while (ms_chars > 3) ms /= 10, ms_chars--;
AssTime res; return ms + 1000*(s + 60*(m + 60*(h + d*24)));
res.SetMS(ms + 1000*(s + 60*(m + 60*(h + d*24))));
return res;
} }
wxString WriteSRTTime(AssTime const& ts) wxString WriteSRTTime(AssTime const& ts)
{ {
int time = ts.GetMS(); int time = ts;
int ms_part = time % 1000; int ms_part = time % 1000;
time /= 1000; // now holds seconds time /= 1000; // now holds seconds

View file

@ -77,7 +77,7 @@ void TranStationSubtitleFormat::WriteFile(wxString const& filename, wxString con
AssDialogue *cur = dynamic_cast<AssDialogue*>(*it); AssDialogue *cur = dynamic_cast<AssDialogue*>(*it);
if (prev && cur) { if (prev && cur) {
file.WriteLineToFile(ConvertLine(prev, &ft, cur->Start.GetMS())); file.WriteLineToFile(ConvertLine(prev, &ft, cur->Start));
file.WriteLineToFile(""); file.WriteLineToFile("");
} }
@ -118,10 +118,10 @@ wxString TranStationSubtitleFormat::ConvertLine(AssDialogue *current, Fractional
// Subtract one frame if the end time of the current line is equal to the // Subtract one frame if the end time of the current line is equal to the
// start of next one, since the end timestamp is inclusive and the lines // start of next one, since the end timestamp is inclusive and the lines
// would overlap if left as is. // would overlap if left as is.
if (nextl_start > 0 && end.GetMS() == nextl_start) if (nextl_start > 0 && end == nextl_start)
end.SetMS(ft->FPS().TimeAtFrame(ft->FPS().FrameAtTime(end.GetMS(), agi::vfr::END) - 1, agi::vfr::END)); end = ft->FPS().TimeAtFrame(ft->FPS().FrameAtTime(end, agi::vfr::END) - 1, agi::vfr::END);
wxString header = wxString::Format("SUB[%i%s%s ", valign, halign, type) + ft->FromAssTime(start) + ">" + ft->FromAssTime(end) + "]\r\n"; wxString header = wxString::Format("SUB[%i%s%s ", valign, halign, type) + ft->ToSMPTE(start) + ">" + ft->ToSMPTE(end) + "]\r\n";
// Process text // Process text
wxString lineEnd = "\r\n"; wxString lineEnd = "\r\n";

View file

@ -102,8 +102,8 @@ void TTXTSubtitleFormat::ReadFile(wxString const& filename, wxString const& forc
AssDialogue *line = new AssDialogue(); AssDialogue *line = new AssDialogue();
line->group = "[Events]"; line->group = "[Events]";
line->Style = "Default"; line->Style = "Default";
line->Start.SetMS(0); line->Start = 0;
line->End.SetMS(5000); line->End = 5000;
Line->push_back(line); Line->push_back(line);
} }
} }
@ -127,8 +127,8 @@ bool TTXTSubtitleFormat::ProcessLine(wxXmlNode *node) {
if (!text.IsEmpty()) { if (!text.IsEmpty()) {
// Create dialogue // Create dialogue
diag = new AssDialogue(); diag = new AssDialogue();
diag->Start.SetMS(time.GetMS()); diag->Start = time;
diag->End.SetMS(36000000-10); diag->End = 36000000-10;
diag->group = "[Events]"; diag->group = "[Events]";
diag->Style = "Default"; diag->Style = "Default";
diag->Comment = false; diag->Comment = false;
@ -297,8 +297,8 @@ void TTXTSubtitleFormat::ConvertToTTXT () {
// Insert blank line at the end // Insert blank line at the end
AssDialogue *diag = new AssDialogue(); AssDialogue *diag = new AssDialogue();
diag->Start.SetMS(lastTime.GetMS()); diag->Start = lastTime;
diag->End.SetMS(lastTime.GetMS()+OPT_GET("Timing/Default Duration")->GetInt()); diag->End = lastTime+OPT_GET("Timing/Default Duration")->GetInt();
diag->group = "[Events]"; diag->group = "[Events]";
diag->Style = "Default"; diag->Style = "Default";
diag->Comment = false; diag->Comment = false;

View file

@ -117,13 +117,10 @@ void TXTSubtitleFormat::ReadFile(wxString const& filename, wxString const& encod
// Sets line up // Sets line up
AssDialogue *line = new AssDialogue; AssDialogue *line = new AssDialogue;
line->group = "[Events]";
line->Style = "Default";
line->Actor = isComment ? "" : line->Actor; line->Actor = isComment ? "" : line->Actor;
line->Comment = isComment; line->Comment = isComment;
line->Text = value; line->Text = value;
line->Start.SetMS(0); line->End = 0;
line->End.SetMS(0);
// Adds line // Adds line
Line->push_back(line); Line->push_back(line);
@ -133,10 +130,7 @@ void TXTSubtitleFormat::ReadFile(wxString const& filename, wxString const& encod
// No lines? // No lines?
if (lines == 0) { if (lines == 0) {
AssDialogue *line = new AssDialogue; AssDialogue *line = new AssDialogue;
line->group = "[Events]"; line->End = OPT_GET("Timing/Default Duration")->GetInt();
line->Style = "Default";
line->Start.SetMS(0);
line->End.SetMS(OPT_GET("Timing/Default Duration")->GetInt());
Line->push_back(line); Line->push_back(line);
} }
} }

View file

@ -55,7 +55,7 @@ struct invisible_line : public std::unary_function<const AssEntry*, bool> {
invisible_line(double time) : time(time * 1000.) { } invisible_line(double time) : time(time * 1000.) { }
bool operator()(const AssEntry *entry) const { bool operator()(const AssEntry *entry) const {
const AssDialogue *diag = dynamic_cast<const AssDialogue*>(entry); const AssDialogue *diag = dynamic_cast<const AssDialogue*>(entry);
return diag && (diag->Start.GetMS() > time || diag->End.GetMS() <= time); return diag && (diag->Start > time || diag->End <= time);
} }
}; };

View file

@ -96,9 +96,9 @@ TimeEdit::TimeEdit(wxWindow* parent, wxWindowID id, agi::Context *c, const wxStr
Bind(wxEVT_COMMAND_MENU_SELECTED, std::tr1::bind(&TimeEdit::PasteTime, this), Time_Edit_Paste); Bind(wxEVT_COMMAND_MENU_SELECTED, std::tr1::bind(&TimeEdit::PasteTime, this), Time_Edit_Paste);
} }
void TimeEdit::SetMS(int ms) { void TimeEdit::SetTime(AssTime new_time) {
if (ms != time.GetMS()) { if (time != new_time) {
time.SetMS(ms); time = new_time;
UpdateText(); UpdateText();
} }
} }
@ -125,7 +125,7 @@ void TimeEdit::OnModified(wxCommandEvent &event) {
void TimeEdit::UpdateText() { void TimeEdit::UpdateText() {
if (byFrame) if (byFrame)
ChangeValue(wxString::Format("%d", c->videoController->FrameAtTime(time.GetMS(), isEnd ? agi::vfr::END : agi::vfr::START))); ChangeValue(wxString::Format("%d", c->videoController->FrameAtTime(time, isEnd ? agi::vfr::END : agi::vfr::START)));
else else
ChangeValue(time.GetASSFormated()); ChangeValue(time.GetASSFormated());
} }

View file

@ -75,12 +75,7 @@ public:
/// Get the current time as an AssTime object /// Get the current time as an AssTime object
AssTime GetTime() const { return time; } AssTime GetTime() const { return time; }
/// Set the time /// Set the time
void SetTime(AssTime time) { SetMS(time.GetMS()); } void SetTime(AssTime time);
/// Get the current time as milliseconds
int GetMS() const { return time.GetMS(); }
/// Set the time to the specified milliseconds
void SetMS(int ms);
/// Set whether the time is displayed as a time or the corresponding frame number /// Set whether the time is displayed as a time or the corresponding frame number
/// @param enableByFrame If true, frame numbers are displayed /// @param enableByFrame If true, frame numbers are displayed

View file

@ -185,8 +185,8 @@ void VideoBox::UpdateTimeBoxes() {
else { else {
VideoSubsPos->SetValue(wxString::Format( VideoSubsPos->SetValue(wxString::Format(
"%+dms; %+dms", "%+dms; %+dms",
time - active_line->Start.GetMS(), time - active_line->Start,
time - active_line->End.GetMS())); time - active_line->End));
} }
} }

View file

@ -352,13 +352,13 @@ void VideoContext::PlayLine() {
// Start playing audio // Start playing audio
context->audioController->PlayRange(SampleRange( context->audioController->PlayRange(SampleRange(
context->audioController->SamplesFromMilliseconds(curline->Start.GetMS()), context->audioController->SamplesFromMilliseconds(curline->Start),
context->audioController->SamplesFromMilliseconds(curline->End.GetMS()))); context->audioController->SamplesFromMilliseconds(curline->End)));
// Round-trip conversion to convert start to exact // Round-trip conversion to convert start to exact
int startFrame = FrameAtTime(context->selectionController->GetActiveLine()->Start.GetMS(),agi::vfr::START); int startFrame = FrameAtTime(context->selectionController->GetActiveLine()->Start,agi::vfr::START);
startMS = TimeAtFrame(startFrame); startMS = TimeAtFrame(startFrame);
endFrame = FrameAtTime(context->selectionController->GetActiveLine()->End.GetMS(),agi::vfr::END) + 1; endFrame = FrameAtTime(context->selectionController->GetActiveLine()->End,agi::vfr::END) + 1;
// Jump to start // Jump to start
JumpToFrame(startFrame); JumpToFrame(startFrame);

View file

@ -134,8 +134,8 @@ bool VisualToolBase::IsDisplayed(AssDialogue *line) const {
int frame = c->videoController->GetFrameN(); int frame = c->videoController->GetFrameN();
return return
line && line &&
c->videoController->FrameAtTime(line->Start.GetMS(), agi::vfr::START) <= frame && c->videoController->FrameAtTime(line->Start, agi::vfr::START) <= frame &&
c->videoController->FrameAtTime(line->End.GetMS(), agi::vfr::END) >= frame; c->videoController->FrameAtTime(line->End, agi::vfr::END) >= frame;
} }
void VisualToolBase::Commit(wxString message) { void VisualToolBase::Commit(wxString message) {

View file

@ -87,8 +87,8 @@ void VisualToolDrag::OnSubTool(wxCommandEvent &) {
else { else {
p1 = GetLinePosition(line); p1 = GetLinePosition(line);
// Round the start and end times to exact frames // Round the start and end times to exact frames
int start = vc->TimeAtFrame(vc->FrameAtTime(line->Start.GetMS(), agi::vfr::START)) - line->Start.GetMS(); int start = vc->TimeAtFrame(vc->FrameAtTime(line->Start, agi::vfr::START)) - line->Start;
int end = vc->TimeAtFrame(vc->FrameAtTime(line->Start.GetMS(), agi::vfr::END)) - line->Start.GetMS(); int end = vc->TimeAtFrame(vc->FrameAtTime(line->Start, agi::vfr::END)) - line->Start;
SetOverride(line, "\\move", wxString::Format("(%s,%s,%d,%d)", p1.Str(), p1.Str(), start, end)); SetOverride(line, "\\move", wxString::Format("(%s,%s,%d,%d)", p1.Str(), p1.Str(), start, end));
} }
} }
@ -255,7 +255,7 @@ bool VisualToolDrag::InitializeDrag(feature_iterator feature) {
// Set time of clicked feature to the current frame and shift all other // Set time of clicked feature to the current frame and shift all other
// selected features by the same amount // selected features by the same amount
if (feature->type != DRAG_ORIGIN) { if (feature->type != DRAG_ORIGIN) {
int time = c->videoController->TimeAtFrame(frame_number) - feature->line->Start.GetMS(); int time = c->videoController->TimeAtFrame(frame_number) - feature->line->Start;
int change = time - feature->time; int change = time - feature->time;
for (sel_iterator cur = sel_features.begin(); cur != sel_features.end(); ++cur) { for (sel_iterator cur = sel_features.begin(); cur != sel_features.end(); ++cur) {