From 88b2fe64a11ed8cb52630c25f438b254542c109d Mon Sep 17 00:00:00 2001 From: niksedk Date: Mon, 29 Sep 2014 08:16:05 +0200 Subject: [PATCH] Cheetah caption - don't write end times if next sub is closer then 1,5 sec (can be turned off by setting) --- src/Logic/Settings.cs | 8 +++--- src/Logic/SubtitleFormats/CheetahCaption.cs | 30 +++++++++++---------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/Logic/Settings.cs b/src/Logic/Settings.cs index 2ec741362..d6c032f28 100644 --- a/src/Logic/Settings.cs +++ b/src/Logic/Settings.cs @@ -264,7 +264,7 @@ namespace Nikse.SubtitleEdit.Logic public int CurrentCavena890LanguageIdLine1 { get; set; } public int CurrentCavena890LanguageIdLine2 { get; set; } - public bool CheetahCaptionLessThan5SecondsNoEndTime { get; set; } + public bool CheetahCaptionAlwayWriteEndTime { get; set; } public bool SamiDisplayTwoClassesAsTwoSubtitles { get; set; } public int SamiHtmlEncodeMode { get; set; } @@ -1791,9 +1791,9 @@ namespace Nikse.SubtitleEdit.Logic subNode = node.SelectSingleNode("FcpFontName"); if (subNode != null) settings.SubtitleSettings.FcpFontName = subNode.InnerText; - subNode = node.SelectSingleNode("CheetahCaptionLessThan5SecondsNoEndTime"); + subNode = node.SelectSingleNode("CheetahCaptionAlwayWriteEndTime"); if (subNode != null) - settings.SubtitleSettings.CheetahCaptionLessThan5SecondsNoEndTime = Convert.ToBoolean(subNode.InnerText); + settings.SubtitleSettings.CheetahCaptionAlwayWriteEndTime = Convert.ToBoolean(subNode.InnerText); subNode = node.SelectSingleNode("NuendoCharacterListFile"); if (subNode != null) settings.SubtitleSettings.NuendoCharacterListFile = subNode.InnerText; @@ -2824,7 +2824,7 @@ namespace Nikse.SubtitleEdit.Logic textWriter.WriteElementString("TimedText10TimeCodeFormat", settings.SubtitleSettings.TimedText10TimeCodeFormat); textWriter.WriteElementString("FcpFontSize", settings.SubtitleSettings.FcpFontSize.ToString(CultureInfo.InvariantCulture)); textWriter.WriteElementString("FcpFontName", settings.SubtitleSettings.FcpFontName); - textWriter.WriteElementString("CheetahCaptionLessThan5SecondsNoEndTime", settings.SubtitleSettings.CheetahCaptionLessThan5SecondsNoEndTime.ToString(CultureInfo.InvariantCulture)); + textWriter.WriteElementString("CheetahCaptionAlwayWriteEndTime", settings.SubtitleSettings.CheetahCaptionAlwayWriteEndTime.ToString(CultureInfo.InvariantCulture)); textWriter.WriteElementString("NuendoCharacterListFile", settings.SubtitleSettings.NuendoCharacterListFile); textWriter.WriteEndElement(); diff --git a/src/Logic/SubtitleFormats/CheetahCaption.cs b/src/Logic/SubtitleFormats/CheetahCaption.cs index 9450da615..813889595 100644 --- a/src/Logic/SubtitleFormats/CheetahCaption.cs +++ b/src/Logic/SubtitleFormats/CheetahCaption.cs @@ -89,12 +89,15 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats fs.WriteByte(0); // paragraphs - foreach (Paragraph p in subtitle.Paragraphs) + for (int index = 0; index < subtitle.Paragraphs.Count; index++) { + Paragraph p = subtitle.Paragraphs[index]; + Paragraph next = subtitle.GetParagraphOrDefault(index + 1); string text = p.Text; //styles + ? - buffer = new byte[] { + buffer = new byte[] + { 0x12, 1, 0, @@ -103,7 +106,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats 0, 3, // justification, 1=left, 2=right, 3=center 0xF, //horizontal position, 1=top, F=bottom - 0x10, //horizontal position, 3=left, 0x10=center, 0x19=right + 0x10 //horizontal position, 3=left, 0x10=center, 0x19=right }; //Normal : 12 01 00 00 00 00 03 0F 10 @@ -160,9 +163,9 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats { int idx = LatinLetters.IndexOf(text.Substring(j, 1)); if (idx >= 0) - textBytes.Add((byte)LatinCodes[idx]); + textBytes.Add((byte) LatinCodes[idx]); else - textBytes.Add(Encoding.GetEncoding(1252).GetBytes(new[] { text[j] })[0]); + textBytes.Add(Encoding.GetEncoding(1252).GetBytes(new[] {text[j]})[0]); j++; } @@ -170,9 +173,15 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats int length = textBytes.Count + 20; long end = fs.Position + length; - fs.WriteByte((byte)(length)); + fs.WriteByte((byte) (length)); - if (Configuration.Settings.SubtitleSettings.CheetahCaptionLessThan5SecondsNoEndTime && p.Duration.TotalMilliseconds < 5000) + if (Configuration.Settings.SubtitleSettings.CheetahCaptionAlwayWriteEndTime || (next != null && next.StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds >= 1500)) + { + fs.WriteByte(0x62); // ? + WriteTime(fs, p.StartTime); + WriteTime(fs, p.EndTime); + } + else { fs.WriteByte(0x42); // ? WriteTime(fs, p.StartTime); @@ -181,12 +190,6 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats fs.WriteByte(0); fs.WriteByte(0); } - else - { - fs.WriteByte(0x62); // ? - WriteTime(fs, p.StartTime); - WriteTime(fs, p.EndTime); - } fs.Write(buffer, 0, buffer.Length); // styles @@ -264,7 +267,6 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats } if (textLength > 0 && buffer.Length >= i + textLength) { - byte firstByte = buffer[i + 1]; p.StartTime = DecodeTimestamp(buffer, i + 2); if (last != null && last.EndTime.TotalMilliseconds > p.StartTime.TotalMilliseconds)