From 6ffa9539bbfbfb1090b02cebc8a28283a8c69041 Mon Sep 17 00:00:00 2001 From: cvium Date: Tue, 11 Jan 2022 23:30:30 +0100 Subject: Refactor and add scheduled task --- .../Matroska/MatroskaKeyframeExtractor.cs | 101 ++++++++++----------- 1 file changed, 50 insertions(+), 51 deletions(-) (limited to 'src/Jellyfin.MediaEncoding.Keyframes/Matroska/MatroskaKeyframeExtractor.cs') diff --git a/src/Jellyfin.MediaEncoding.Keyframes/Matroska/MatroskaKeyframeExtractor.cs b/src/Jellyfin.MediaEncoding.Keyframes/Matroska/MatroskaKeyframeExtractor.cs index 6a8a55643..8bb1ff00d 100644 --- a/src/Jellyfin.MediaEncoding.Keyframes/Matroska/MatroskaKeyframeExtractor.cs +++ b/src/Jellyfin.MediaEncoding.Keyframes/Matroska/MatroskaKeyframeExtractor.cs @@ -4,73 +4,72 @@ using System.IO; using Jellyfin.MediaEncoding.Keyframes.Matroska.Extensions; using NEbml.Core; -namespace Jellyfin.MediaEncoding.Keyframes.Matroska +namespace Jellyfin.MediaEncoding.Keyframes.Matroska; + +/// +/// The keyframe extractor for the matroska container. +/// +public static class MatroskaKeyframeExtractor { /// - /// The keyframe extractor for the matroska container. + /// Extracts the keyframes in ticks (scaled using the container timestamp scale) from the matroska container. /// - public static class MatroskaKeyframeExtractor + /// The file path. + /// An instance of . + public static KeyframeData GetKeyframeData(string filePath) { - /// - /// Extracts the keyframes in ticks (scaled using the container timestamp scale) from the matroska container. - /// - /// The file path. - /// An instance of . - public static KeyframeData GetKeyframeData(string filePath) - { - using var stream = File.OpenRead(filePath); - using var reader = new EbmlReader(stream); + using var stream = File.OpenRead(filePath); + using var reader = new EbmlReader(stream); + + var seekHead = reader.ReadSeekHead(); + var info = reader.ReadInfo(seekHead.InfoPosition); + var videoTrackNumber = reader.FindFirstTrackNumberByType(seekHead.TracksPosition, MatroskaConstants.TrackTypeVideo); - var seekHead = reader.ReadSeekHead(); - var info = reader.ReadInfo(seekHead.InfoPosition); - var videoTrackNumber = reader.FindFirstTrackNumberByType(seekHead.TracksPosition, MatroskaConstants.TrackTypeVideo); + var keyframes = new List(); + reader.ReadAt(seekHead.CuesPosition); + reader.EnterContainer(); - var keyframes = new List(); - reader.ReadAt(seekHead.CuesPosition); + while (reader.FindElement(MatroskaConstants.CuePoint)) + { reader.EnterContainer(); + ulong? trackNumber = null; + // Mandatory element + reader.FindElement(MatroskaConstants.CueTime); + var cueTime = reader.ReadUInt(); - while (reader.FindElement(MatroskaConstants.CuePoint)) + // Mandatory element + reader.FindElement(MatroskaConstants.CueTrackPositions); + reader.EnterContainer(); + if (reader.FindElement(MatroskaConstants.CuePointTrackNumber)) { - reader.EnterContainer(); - ulong? trackNumber = null; - // Mandatory element - reader.FindElement(MatroskaConstants.CueTime); - var cueTime = reader.ReadUInt(); - - // Mandatory element - reader.FindElement(MatroskaConstants.CueTrackPositions); - reader.EnterContainer(); - if (reader.FindElement(MatroskaConstants.CuePointTrackNumber)) - { - trackNumber = reader.ReadUInt(); - } - - reader.LeaveContainer(); + trackNumber = reader.ReadUInt(); + } - if (trackNumber == videoTrackNumber) - { - keyframes.Add(ScaleToTicks(cueTime, info.TimestampScale)); - } + reader.LeaveContainer(); - reader.LeaveContainer(); + if (trackNumber == videoTrackNumber) + { + keyframes.Add(ScaleToTicks(cueTime, info.TimestampScale)); } reader.LeaveContainer(); - - var result = new KeyframeData(ScaleToTicks(info.Duration ?? 0, info.TimestampScale), keyframes); - return result; } - private static long ScaleToTicks(ulong unscaledValue, long timestampScale) - { - // TimestampScale is in nanoseconds, scale it to get the value in ticks, 1 tick == 100 ns - return (long)unscaledValue * timestampScale / 100; - } + reader.LeaveContainer(); - private static long ScaleToTicks(double unscaledValue, long timestampScale) - { - // TimestampScale is in nanoseconds, scale it to get the value in ticks, 1 tick == 100 ns - return Convert.ToInt64(unscaledValue * timestampScale / 100); - } + var result = new KeyframeData(ScaleToTicks(info.Duration ?? 0, info.TimestampScale), keyframes); + return result; + } + + private static long ScaleToTicks(ulong unscaledValue, long timestampScale) + { + // TimestampScale is in nanoseconds, scale it to get the value in ticks, 1 tick == 100 ns + return (long)unscaledValue * timestampScale / 100; + } + + private static long ScaleToTicks(double unscaledValue, long timestampScale) + { + // TimestampScale is in nanoseconds, scale it to get the value in ticks, 1 tick == 100 ns + return Convert.ToInt64(unscaledValue * timestampScale / 100); } } -- cgit v1.2.3