From 26f335bb2b0e5390e7dc0ca2655465f3b04a3f27 Mon Sep 17 00:00:00 2001 From: niksedk Date: Mon, 17 Mar 2014 20:14:28 +0100 Subject: [PATCH] Dcinema smpte sometimes generated illegal frame numbers - thx knut :) --- src/Logic/SubtitleFormats/DCinemaSmpte2007.cs | 3 +-- src/Logic/SubtitleFormats/DCinemaSmpte2010.cs | 11 ++++++-- .../TransportStream/TransportStreamParser.cs | 26 +++++++++---------- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/Logic/SubtitleFormats/DCinemaSmpte2007.cs b/src/Logic/SubtitleFormats/DCinemaSmpte2007.cs index 0b3857b58..2dfc8a1a9 100644 --- a/src/Logic/SubtitleFormats/DCinemaSmpte2007.cs +++ b/src/Logic/SubtitleFormats/DCinemaSmpte2007.cs @@ -776,8 +776,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats private string ConvertToTimeString(TimeCode time) { - int frames = (int)System.Math.Round(time.Milliseconds / (1000.0 / frameRate)); - return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, frames); + return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, DCinemaSmpte2010.MsToFramesMaxFrameRate(time.Milliseconds, frameRate)); } } diff --git a/src/Logic/SubtitleFormats/DCinemaSmpte2010.cs b/src/Logic/SubtitleFormats/DCinemaSmpte2010.cs index 5da77183e..0ba496f48 100644 --- a/src/Logic/SubtitleFormats/DCinemaSmpte2010.cs +++ b/src/Logic/SubtitleFormats/DCinemaSmpte2010.cs @@ -774,10 +774,17 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats return new TimeCode(ts); } + public static int MsToFramesMaxFrameRate(double milliseconds, double frameRate) + { + int frames = (int)System.Math.Round(milliseconds / (1000.0 / frameRate)); + if (frames >= Configuration.Settings.General.CurrentFrameRate) + frames = (int)(frameRate - 0.01); + return frames; + } + private string ConvertToTimeString(TimeCode time) { - int frames = (int)System.Math.Round(time.Milliseconds / (1000.0 / frameRate)); - return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, frames); + return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MsToFramesMaxFrameRate(time.Milliseconds, frameRate)); } } diff --git a/src/Logic/TransportStream/TransportStreamParser.cs b/src/Logic/TransportStream/TransportStreamParser.cs index 0e017cf27..08eda919f 100644 --- a/src/Logic/TransportStream/TransportStreamParser.cs +++ b/src/Logic/TransportStream/TransportStreamParser.cs @@ -18,7 +18,7 @@ namespace Nikse.SubtitleEdit.Logic.TransportStream public long TotalNumberOfPrivateStream1Continuation0 { get; private set; } public List SubtitlePacketIds { get; private set; } public List SubtitlePackets { get; private set; } - public List ProgramAssociationTables { get; private set; } +// public List ProgramAssociationTables { get; private set; } private Dictionary> SubtitlesLookup { get; set; } private Dictionary> DvbSubtitlesLookup { get; set; } public bool IsM2TransportStream { get; private set; } @@ -45,7 +45,7 @@ namespace Nikse.SubtitleEdit.Logic.TransportStream TotalNumberOfPrivateStream1Continuation0 = 0; SubtitlePacketIds = new List(); SubtitlePackets = new List(); - ProgramAssociationTables = new List(); +// ProgramAssociationTables = new List(); ms.Position = 0; int packetLength = 188; DetectFormat(ms); @@ -147,20 +147,20 @@ namespace Nikse.SubtitleEdit.Logic.TransportStream { TotalNumberOfPrivateStream1Continuation0++; - int pesExtensionlength = 0; - if (12 + packet.AdaptionFieldLength < packetBuffer.Length) - pesExtensionlength = 0xFF & packetBuffer[12 + packet.AdaptionFieldLength]; - int pesOffset = 13 + packet.AdaptionFieldLength + pesExtensionlength; - bool isTeletext = (pesExtensionlength == 0x24 && (0xFF & packetBuffer[pesOffset]) >> 4 == 1); + //int pesExtensionlength = 0; + //if (12 + packet.AdaptionFieldLength < packetBuffer.Length) + // pesExtensionlength = 0xFF & packetBuffer[12 + packet.AdaptionFieldLength]; + //int pesOffset = 13 + packet.AdaptionFieldLength + pesExtensionlength; + //bool isTeletext = (pesExtensionlength == 0x24 && (0xFF & packetBuffer[pesOffset]) >> 4 == 1); - // workaround uk freesat teletext - if (!isTeletext) - isTeletext = (pesExtensionlength == 0x24 && (0xFF & packetBuffer[pesOffset]) == 0x99); + //// workaround uk freesat teletext + //if (!isTeletext) + // isTeletext = (pesExtensionlength == 0x24 && (0xFF & packetBuffer[pesOffset]) == 0x99); - if (!isTeletext) - { + //if (!isTeletext) + //{ - } + //} } } TotalNumberOfPackets++;