Merge pull request #8918 from ivandrofly/time-unit-conversion

Refactor frame-to-milliseconds conversion
This commit is contained in:
Nikolaj Olsson 2024-10-20 12:58:58 +02:00 committed by GitHub
commit 5fd050a1b8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 11 additions and 40 deletions

View File

@ -354,7 +354,7 @@ namespace Nikse.SubtitleEdit.Core.Common
public TimeCode AlignToFrame() public TimeCode AlignToFrame()
{ {
var ts = TimeSpan.FromMilliseconds(Math.Round(TotalMilliseconds, MidpointRounding.AwayFromZero)); var ts = TimeSpan.FromMilliseconds(Math.Round(TotalMilliseconds, MidpointRounding.AwayFromZero));
var frames = Math.Round(ts.Milliseconds / (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate)); var frames = SubtitleFormat.MillisecondsToFrames(ts.Milliseconds);
TimeSpan ts2; TimeSpan ts2;
if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001) if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001)
{ {

View File

@ -131,11 +131,6 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
return frames.ToString(CultureInfo.InvariantCulture); return frames.ToString(CultureInfo.InvariantCulture);
} }
private static TimeCode DecodeTimeCode(string timePart) private static TimeCode DecodeTimeCode(string timePart) => new TimeCode(FramesToMilliseconds(int.Parse(timePart)));
{
int milliseconds = (int)Math.Round(TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate * int.Parse(timePart));
return new TimeCode(milliseconds);
}
} }
} }

View File

@ -24,14 +24,7 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
var minutes = int.Parse(parts[1]); var minutes = int.Parse(parts[1]);
var seconds = int.Parse(parts[2]); var seconds = int.Parse(parts[2]);
var frames = int.Parse(parts[3]); var frames = int.Parse(parts[3]);
return new TimeCode(hour, minutes, seconds, FramesToMillisecondsMax999(frames));
int milliseconds = (int)Math.Round(((TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate) * frames));
if (milliseconds > 999)
{
milliseconds = 999;
}
return new TimeCode(hour, minutes, seconds, milliseconds);
} }
public override string ToText(Subtitle subtitle, string title) public override string ToText(Subtitle subtitle, string title)

View File

@ -1522,8 +1522,7 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
private static void WriteTime(Stream fs, TimeCode timeCode) private static void WriteTime(Stream fs, TimeCode timeCode)
{ {
double totalMilliseconds = timeCode.TotalMilliseconds; int frames = MillisecondsToFrames(timeCode.TotalMilliseconds);
int frames = (int)Math.Round(totalMilliseconds / (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate));
fs.WriteByte((byte)(frames / 256 / 256)); fs.WriteByte((byte)(frames / 256 / 256));
fs.WriteByte((byte)(frames / 256)); fs.WriteByte((byte)(frames / 256));
fs.WriteByte((byte)(frames % 256)); fs.WriteByte((byte)(frames % 256));
@ -1644,8 +1643,8 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
else else
{ {
subtitle.Paragraphs.Add(p); subtitle.Paragraphs.Add(p);
p.StartTime.TotalMilliseconds = (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate) * startFrame; p.StartTime.TotalMilliseconds = FramesToMilliseconds(startFrame);
p.EndTime.TotalMilliseconds = (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate) * endFrame; p.EndTime.TotalMilliseconds = FramesToMilliseconds(endFrame);
p.Text = string.Join(Environment.NewLine, new[] { line1, line2 }.Select(l => l.TrimEnd()).Where(l => !string.IsNullOrWhiteSpace(l))); p.Text = string.Join(Environment.NewLine, new[] { line1, line2 }.Select(l => l.TrimEnd()).Where(l => !string.IsNullOrWhiteSpace(l)));
} }
if (boxType >= 0xa0 && boxType <= 0xa9 && !string.IsNullOrEmpty(p.Text)) // box if (boxType >= 0xa0 && boxType <= 0xa9 && !string.IsNullOrEmpty(p.Text)) // box

View File

@ -48,7 +48,7 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
{ {
string s; string s;
var ts = p.Duration.TimeSpan; var ts = p.Duration.TimeSpan;
var frames = Math.Round(ts.Milliseconds / (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate)); var frames = MillisecondsToFrames(ts.Milliseconds);
if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001) if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001)
{ {
s = $"{ts.Seconds + 1:00}:{0:00}"; s = $"{ts.Seconds + 1:00}:{0:00}";

View File

@ -62,14 +62,7 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
int minutes = buffer[index + 1]; int minutes = buffer[index + 1];
int seconds = buffer[index + 2]; int seconds = buffer[index + 2];
int frames = buffer[index + 3]; int frames = buffer[index + 3];
return new TimeCode(hour, minutes, seconds, FramesToMillisecondsMax999(frames));
int milliseconds = (int)Math.Round(TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate * frames);
if (milliseconds > 999)
{
milliseconds = 999;
}
return new TimeCode(hour, minutes, seconds, milliseconds);
} }
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName) public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)

View File

@ -72,17 +72,8 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
subtitle.Renumber(); subtitle.Renumber();
} }
private static string EncodeTimeCode(TimeCode time) private static string EncodeTimeCode(TimeCode time) => MillisecondsToFrames(time.TotalMilliseconds).ToString();
{
long frames = (long)(time.TotalMilliseconds / (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate));
return frames.ToString();
}
private static TimeCode DecodeTimeCode(string timePart)
{
int milliseconds = (int)Math.Round(TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate * int.Parse(timePart));
return new TimeCode(milliseconds);
}
private static TimeCode DecodeTimeCode(string timePart) => new TimeCode(FramesToMilliseconds(int.Parse(timePart)));
} }
} }

View File

@ -13408,7 +13408,7 @@ namespace Nikse.SubtitleEdit.Forms
{ {
var seconds = (int)numericUpDownDuration.Value; var seconds = (int)numericUpDownDuration.Value;
var frames = (int)Math.Round((Convert.ToDouble(numericUpDownDuration.Value) % 1.0 * 100.0)); var frames = (int)Math.Round((Convert.ToDouble(numericUpDownDuration.Value) % 1.0 * 100.0));
return seconds * TimeCode.BaseUnit + frames * (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate); return seconds * TimeCode.BaseUnit + SubtitleFormat.FramesToMilliseconds(frames);
} }
return ((double)numericUpDownDuration.Value * TimeCode.BaseUnit); return ((double)numericUpDownDuration.Value * TimeCode.BaseUnit);