From 147e6020e8f4192fd79897a66198d10be1d8dbcb Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Sun, 20 Oct 2019 19:16:03 +0200 Subject: [PATCH] Fix TS memory issue - thx MrRoso/mkver :) Fix #3653 --- .../TransportStream/ProgramMapTableStream.cs | 2 +- .../TransportStream/TransportStreamParser.cs | 45 +++++++++++++++++-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/libse/TransportStream/ProgramMapTableStream.cs b/libse/TransportStream/ProgramMapTableStream.cs index 302b25fd3..0a1d83e60 100644 --- a/libse/TransportStream/ProgramMapTableStream.cs +++ b/libse/TransportStream/ProgramMapTableStream.cs @@ -100,7 +100,7 @@ namespace Nikse.SubtitleEdit.Core.TransportStream break; } } - return sb.ToString(); + return sb.ToString().TrimEnd(' ', '$'); } } return string.Empty; diff --git a/libse/TransportStream/TransportStreamParser.cs b/libse/TransportStream/TransportStreamParser.cs index 7d51200f0..b2781b75a 100644 --- a/libse/TransportStream/TransportStreamParser.cs +++ b/libse/TransportStream/TransportStreamParser.cs @@ -56,6 +56,7 @@ namespace Nikse.SubtitleEdit.Core.TransportStream var m2TsTimeCodeBuffer = new byte[4]; long position = 0; long callBackTicks = 0; + SubtitlesLookup = new Dictionary>(); // check for Topfield .rec file ms.Seek(position, SeekOrigin.Begin); @@ -111,12 +112,40 @@ namespace Nikse.SubtitleEdit.Core.TransportStream { TotalNumberOfPrivateStream1++; - SubtitlePackets.Add(packet); - if (!SubtitlePacketIds.Contains(packet.PacketId)) { SubtitlePacketIds.Add(packet.PacketId); } + + if (!IsM2TransportStream && packet.PayloadUnitStartIndicator) + { + var list = MakeSubtitlePesPackets(packet.PacketId, SubtitlePackets); + bool hasImageSubtitles = false; + foreach (var item in list) + { + if (item.IsDvbSubpicture) + { + hasImageSubtitles = true; + break; + } + } + if (hasImageSubtitles) + { + if (SubtitlesLookup.ContainsKey(packet.PacketId)) + { + SubtitlesLookup[packet.PacketId].AddRange(list); + } + else + { + SubtitlesLookup.Add(packet.PacketId, list); + } + } + + SubtitlePackets.RemoveAll(p => p.PacketId == packet.PacketId); + } + SubtitlePackets.Add(packet); + + if (packet.ContinuityCounter == 0) { TotalNumberOfPrivateStream1Continuation0++; @@ -196,7 +225,6 @@ namespace Nikse.SubtitleEdit.Core.TransportStream } // check for SubPictureStreamId = 32 - SubtitlesLookup = new Dictionary>(); foreach (int pid in SubtitlePacketIds) { var list = MakeSubtitlePesPackets(pid, SubtitlePackets); @@ -211,9 +239,18 @@ namespace Nikse.SubtitleEdit.Core.TransportStream } if (hasImageSubtitles) { - SubtitlesLookup.Add(pid, list); + if (SubtitlesLookup.ContainsKey(pid)) + { + SubtitlesLookup[pid].AddRange(list); + } + else + { + SubtitlesLookup.Add(pid, list); + } } + SubtitlePackets.RemoveAll(p => p.PacketId == pid); } + SubtitlePacketIds.Clear(); foreach (int key in SubtitlesLookup.Keys) {