From 90736ee346e1e78095667d060826c22e57525bb3 Mon Sep 17 00:00:00 2001 From: cvium Date: Sun, 16 Jan 2022 22:10:22 +0100 Subject: Add pagination and fixes --- .../Matroska/Extensions/EbmlReaderExtensions.cs | 2 +- .../Matroska/MatroskaKeyframeExtractor.cs | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) (limited to 'src/Jellyfin.MediaEncoding.Keyframes') diff --git a/src/Jellyfin.MediaEncoding.Keyframes/Matroska/Extensions/EbmlReaderExtensions.cs b/src/Jellyfin.MediaEncoding.Keyframes/Matroska/Extensions/EbmlReaderExtensions.cs index e068cac84..fd170864b 100644 --- a/src/Jellyfin.MediaEncoding.Keyframes/Matroska/Extensions/EbmlReaderExtensions.cs +++ b/src/Jellyfin.MediaEncoding.Keyframes/Matroska/Extensions/EbmlReaderExtensions.cs @@ -106,7 +106,7 @@ internal static class EbmlReaderExtensions if (!tracksPosition.HasValue || !cuesPosition.HasValue || !infoPosition.HasValue) { - throw new InvalidOperationException("SeekHead is missing or does not contain Info, Tracks and Cues positions"); + throw new InvalidOperationException("SeekHead is missing or does not contain Info, Tracks and Cues positions. SeekHead referencing another SeekHead is not supported"); } return new SeekHead(infoPosition.Value, tracksPosition.Value, cuesPosition.Value); diff --git a/src/Jellyfin.MediaEncoding.Keyframes/Matroska/MatroskaKeyframeExtractor.cs b/src/Jellyfin.MediaEncoding.Keyframes/Matroska/MatroskaKeyframeExtractor.cs index 8bb1ff00d..501b2bb17 100644 --- a/src/Jellyfin.MediaEncoding.Keyframes/Matroska/MatroskaKeyframeExtractor.cs +++ b/src/Jellyfin.MediaEncoding.Keyframes/Matroska/MatroskaKeyframeExtractor.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using Jellyfin.MediaEncoding.Keyframes.Matroska.Extensions; +using Jellyfin.MediaEncoding.Keyframes.Matroska.Models; using NEbml.Core; namespace Jellyfin.MediaEncoding.Keyframes.Matroska; @@ -22,8 +23,19 @@ public static class MatroskaKeyframeExtractor using var reader = new EbmlReader(stream); var seekHead = reader.ReadSeekHead(); - var info = reader.ReadInfo(seekHead.InfoPosition); - var videoTrackNumber = reader.FindFirstTrackNumberByType(seekHead.TracksPosition, MatroskaConstants.TrackTypeVideo); + // External lib does not support seeking backwards (yet) + Info info; + ulong videoTrackNumber; + if (seekHead.InfoPosition < seekHead.TracksPosition) + { + info = reader.ReadInfo(seekHead.InfoPosition); + videoTrackNumber = reader.FindFirstTrackNumberByType(seekHead.TracksPosition, MatroskaConstants.TrackTypeVideo); + } + else + { + videoTrackNumber = reader.FindFirstTrackNumberByType(seekHead.TracksPosition, MatroskaConstants.TrackTypeVideo); + info = reader.ReadInfo(seekHead.InfoPosition); + } var keyframes = new List(); reader.ReadAt(seekHead.CuesPosition); -- cgit v1.2.3