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;
}
public Dictionary<int, Paragraph> GetTeletext(TeletextRunSettings teletextRunSettings, int pageNumber, int pageNumberBcd)
{
var timestamp = PresentationTimestamp.HasValue ? PresentationTimestamp.Value / 90 : 40;
@ -175,6 +174,7 @@ namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream
}
i += dataUnitLen;
}
if (teletextRunSettings.PageNumberAndParagraph.ContainsKey(pageNumber) && teletextRunSettings.PageNumberAndParagraph[pageNumber] != null)
{
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.IO;
using System.Linq;
using System.Text;
using Nikse.SubtitleEdit.Core.BluRaySup;
using Nikse.SubtitleEdit.Core.VobSub;
namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream
{
@ -174,29 +174,11 @@ namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream
foreach (var pes in teletextPesList[packetId])
{
var textDictionary = pes.GetTeletext(teletextRunSettings, page, pageBcd);
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 } } });
}
}
}
AddToTeletextDictionary(textDictionary, page, packetId);
}
var lastTextDictionary = Teletext.ProcessTelxPacketPendingLeftovers(teletextRunSettings, page);
AddToTeletextDictionary(lastTextDictionary, page, packetId);
}
}
@ -307,6 +289,32 @@ namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream
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)
{
var list = MakeSubtitlePesPackets(packetId, SubtitlePackets);

View File

@ -305,7 +305,7 @@ namespace Nikse.SubtitleEdit.Forms
{
toolStripMenuItemExport.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.Linq;
using Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream;
namespace Test.Logic.TransportStream
{
@ -37,13 +37,16 @@ namespace Test.Logic.TransportStream
var packagePages = parser.TeletextSubtitlesLookup[parser.TeletextSubtitlesLookup.First().Key];
Assert.AreEqual(2, packagePages.Count);
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 +
"geeignet. <font color=\"#00ffff\"> Stufen Sie ihn zurück!</font>", packagePages[150][0].Text);
Assert.AreEqual("Han er ikke egnet" + Environment.NewLine +
"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);
}
}
}
}