Fix for (sometimes) missing last sub in teletext - thx borifax/xylographe :)

See https://gitter.im/SubtitleEdit/subtitleedit
This commit is contained in:
Nikolaj Olsson 2020-05-09 19:34:54 +02:00
parent e1fdaf2c69
commit 5f7348a736
5 changed files with 59 additions and 32 deletions

View File

@ -138,7 +138,6 @@ namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream
return pages; return pages;
} }
public Dictionary<int, Paragraph> GetTeletext(TeletextRunSettings teletextRunSettings, int pageNumber, int pageNumberBcd) public Dictionary<int, Paragraph> GetTeletext(TeletextRunSettings teletextRunSettings, int pageNumber, int pageNumberBcd)
{ {
var timestamp = PresentationTimestamp.HasValue ? PresentationTimestamp.Value / 90 : 40; var timestamp = PresentationTimestamp.HasValue ? PresentationTimestamp.Value / 90 : 40;
@ -175,6 +174,7 @@ namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream
} }
i += dataUnitLen; i += dataUnitLen;
} }
if (teletextRunSettings.PageNumberAndParagraph.ContainsKey(pageNumber) && teletextRunSettings.PageNumberAndParagraph[pageNumber] != null) if (teletextRunSettings.PageNumberAndParagraph.ContainsKey(pageNumber) && teletextRunSettings.PageNumberAndParagraph[pageNumber] != null)
{ {
if (teletextPages.ContainsKey(pageNumber)) if (teletextPages.ContainsKey(pageNumber))

View File

@ -751,5 +751,21 @@ namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream
} }
} }
} }
public static Dictionary<int, Paragraph> ProcessTelxPacketPendingLeftovers(TeletextRunSettings teletextRunSettings, int pageNumberDec)
{
// Now we have the beginning of page transmission; if there is page_buffer pending, process it
if (_pageBuffer.Tainted)
{
// this time we do not subtract any frames, there will be no more frames
_pageBuffer.HideTimestamp = teletextRunSettings.GetLastTimestamp(pageNumberDec);
ProcessPage(_pageBuffer, teletextRunSettings, pageNumberDec);
if (teletextRunSettings.PageNumberAndParagraph.Count > 0)
{
return teletextRunSettings.PageNumberAndParagraph;
}
}
return new Dictionary<int, Paragraph>();
}
} }
} }

View File

@ -1,10 +1,10 @@
using System; using Nikse.SubtitleEdit.Core.BluRaySup;
using Nikse.SubtitleEdit.Core.VobSub;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Nikse.SubtitleEdit.Core.BluRaySup;
using Nikse.SubtitleEdit.Core.VobSub;
namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream
{ {
@ -174,29 +174,11 @@ namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream
foreach (var pes in teletextPesList[packetId]) foreach (var pes in teletextPesList[packetId])
{ {
var textDictionary = pes.GetTeletext(teletextRunSettings, page, pageBcd); var textDictionary = pes.GetTeletext(teletextRunSettings, page, pageBcd);
foreach (var dic in textDictionary) AddToTeletextDictionary(textDictionary, page, packetId);
{
if (!string.IsNullOrEmpty(dic.Value.Text))
{
if (TeletextSubtitlesLookup.ContainsKey(packetId))
{
var innerDic = TeletextSubtitlesLookup[packetId];
if (innerDic.ContainsKey(dic.Key))
{
innerDic[dic.Key].Add(dic.Value);
}
else
{
innerDic.Add(dic.Key, new List<Paragraph> { dic.Value });
}
}
else
{
TeletextSubtitlesLookup.Add(packetId, new SortedDictionary<int, List<Paragraph>> { { dic.Key, new List<Paragraph> { dic.Value } } });
}
}
}
} }
var lastTextDictionary = Teletext.ProcessTelxPacketPendingLeftovers(teletextRunSettings, page);
AddToTeletextDictionary(lastTextDictionary, page, packetId);
} }
} }
@ -307,6 +289,32 @@ namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream
SubtitlePacketIds.Sort(); SubtitlePacketIds.Sort();
} }
private void AddToTeletextDictionary(Dictionary<int, Paragraph> textDictionary, int page, int packetId)
{
foreach (var dic in textDictionary)
{
if (!string.IsNullOrEmpty(dic.Value.Text))
{
if (TeletextSubtitlesLookup.ContainsKey(packetId))
{
var innerDic = TeletextSubtitlesLookup[packetId];
if (innerDic.ContainsKey(dic.Key))
{
innerDic[dic.Key].Add(dic.Value);
}
else
{
innerDic.Add(dic.Key, new List<Paragraph> { dic.Value });
}
}
else
{
TeletextSubtitlesLookup.Add(packetId, new SortedDictionary<int, List<Paragraph>> { { dic.Key, new List<Paragraph> { dic.Value } } });
}
}
}
}
private ulong? ProcessPackages(int packetId, Dictionary<int, List<int>> teletextPages, Dictionary<int, List<DvbSubPes>> teletextPesList, ulong? firstVideoMs) private ulong? ProcessPackages(int packetId, Dictionary<int, List<int>> teletextPages, Dictionary<int, List<DvbSubPes>> teletextPesList, ulong? firstVideoMs)
{ {
var list = MakeSubtitlePesPackets(packetId, SubtitlePackets); var list = MakeSubtitlePesPackets(packetId, SubtitlePackets);

View File

@ -305,7 +305,7 @@ namespace Nikse.SubtitleEdit.Forms
{ {
toolStripMenuItemExport.Visible = true; toolStripMenuItemExport.Visible = true;
saveAllImagesWithHtmlIndexViewToolStripMenuItem.Visible = true; saveAllImagesWithHtmlIndexViewToolStripMenuItem.Visible = true;
saveSubtitleAsToolStripMenuItem.Visible = true; saveSubtitleAsToolStripMenuItem.Visible = false;
} }
} }

View File

@ -1,8 +1,8 @@
using System; using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.VisualStudio.TestTools.UnitTesting; using Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream;
using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream;
namespace Test.Logic.TransportStream namespace Test.Logic.TransportStream
{ {
@ -37,13 +37,16 @@ namespace Test.Logic.TransportStream
var packagePages = parser.TeletextSubtitlesLookup[parser.TeletextSubtitlesLookup.First().Key]; var packagePages = parser.TeletextSubtitlesLookup[parser.TeletextSubtitlesLookup.First().Key];
Assert.AreEqual(2, packagePages.Count); Assert.AreEqual(2, packagePages.Count);
Assert.AreEqual(1, packagePages[150].Count); // first page number Assert.AreEqual(1, packagePages[150].Count); // first page number
Assert.AreEqual(1, packagePages[799].Count); // second page number Assert.AreEqual(2, packagePages[799].Count); // second page number
Assert.AreEqual("Für diese Klassenstufe ist er nicht" + Environment.NewLine + Assert.AreEqual("Für diese Klassenstufe ist er nicht" + Environment.NewLine +
"geeignet. <font color=\"#00ffff\"> Stufen Sie ihn zurück!</font>", packagePages[150][0].Text); "geeignet. <font color=\"#00ffff\"> Stufen Sie ihn zurück!</font>", packagePages[150][0].Text);
Assert.AreEqual("Han er ikke egnet" + Environment.NewLine + Assert.AreEqual("Han er ikke egnet" + Environment.NewLine +
"til dette klassetrin.", packagePages[799][0].Text); "til dette klassetrin.", packagePages[799][0].Text);
Assert.AreEqual("Så sæt ham et år ned, så han kan" + Environment.NewLine +
"indhente det forsømte.", packagePages[799][1].Text);
} }
} }
} }